Main Content

オブジェクトのコピー

copyobj を使用したオブジェクトのコピー

関数 copyobj を使って、オブジェクトを親オブジェクト間でコピーします。コピーされたオブジェクトは元のオブジェクトと以下の点で異なります。

  • Parent プロパティが新しい親オブジェクトになります。

  • コピー先のオブジェクトのハンドルはコピー元のオブジェクトのハンドルと異なります。

  • copyobj では、コピー元のオブジェクトのコールバック プロパティはコピーされません。

  • copyobj では、コピー元のオブジェクトに関連付けられているアプリケーション データはコピーされません。

したがって、コピー元のハンドルとコピー先のハンドルを比較すると、== および isequal は false を返します。

結果が正しい親子関係を維持する限り、さまざまなオブジェクトを新しい親オブジェクトにコピーしたり、1 つのオブジェクトをいくつかの新しい親オブジェクトにコピーしたりすることができます。子オブジェクトをもつオブジェクトをコピーすると、MATLAB® はすべての子オブジェクトもコピーします。

メモ

copyobj の 1 回の呼び出しで、同じオブジェクトを同一の親オブジェクトに複数回コピーすることはできません。

単一オブジェクトの複数のコピー先へのコピー

単一のオブジェクトを複数のコピー先にコピーする場合、copyobj によって、新しいハンドルが親ハンドルと同じ順で返されます。

h = copyobj(cobj,[newParent1,newParent2,newParent3])

返される配列 h には、以下の順序で新しいオブジェクト ハンドルが格納されます。

   h(1) -> newParent1
   h(2) -> newParent2
   h(3) -> newParent3

複数オブジェクトのコピー

この例では、複数のオブジェクトを単一の親オブジェクトにコピーする方法を説明します。

一連の類似したグラフを作成し、各グラフに同じデータ点をラベル付けするとします。最初のグラフ内の点にラベル付けするために使用する text オブジェクトとマーカー オブジェクトを、後続の各グラフにコピーします。

最初のグラフを作成してラベル付けします。

x = 0:.1:2*pi;
plot(x,sin(x))
hText = text('String','\{5\pi\div4, sin(5\pi\div4)\}\rightarrow',...
   'Position',[5*pi/4,sin(5*pi/4),0],...
   'HorizontalAlignment','right');
hMarker = line(5*pi/4,sin(5*pi/4),0,'Marker','*');

ラベルのないグラフを 2 つ作成します。

figure
x = pi/4:.1:9*pi/4;
plot(x,sin(x))
hAxes1 = gca;
figure
x = pi/2:.1:5*pi/2;
plot(x,sin(x))
hAxes2 = gca;

テキストとマーカー (hTexthMarker) を各座標軸の子オブジェクトにして、各グラフにコピーします。テキストおよびマーカーのコピーの新しいハンドルを返します。

newHandles1 = copyobj([hText,hMarker],hAxes1);
newHandles2 = copyobj([hText,hMarker],hAxes2);

目的は両方のオブジェクトを各座標軸にコピーすることなので、コピー先となる単一の座標軸を指定して copyobj を 2 回呼び出します。

複数のコピー先への複数オブジェクトのコピー

コピーする複数のオブジェクトと、親となる複数のコピー先を指定して copyobj を呼び出すと、copyobj は各オブジェクトをそれぞれの親にコピーします。つまり、hp が長さ n のハンドル配列の場合、次の copyobj の呼び出しにより、

copyobj(h,p)

要素単位のコピーが行われます。

h(1) -> p(1);
h(2) -> p(2);
...
h(n) -> p(n);