お世話になります。
TPanel から TMyPanel というコンポーネントを作成しました
この TMyPanel を複数管理するために
MyPanels: TList;
を使用しています。
本来Listから使用するのに
var
MyPanel: ^TMyPanel;
begin
Mypanel := TMyPanels.Items[Num];
MyPanel.Align := alNone;
MyPanel.SetBounds(0, 0, 100, 100);
// 以下処理省略
end;
として使用しています。
同様に、TMyPanel を作成した場合は
var
DummyMyPanel: TMyPanel;
MyPanel: ^TMyPanel;
begin
MyPanel := @(TMyPanels.Create);
end;
として使用できません。
現在しかたなく以下のようにしています。
var
DummyMyPanel: TMyPanel;
MyPanel: ^TMyPanel;
begin
DummyMyPanel TMyPanels.Create
MyPanel := @DummyMyPanel;
end;
直接 MyPanel に Create したポインタを
入れることはできないのでしょうか?
そもそも、オブジェクト参照はポインタです。
pl:TMyPanel;
pl = TMyPanel.Create(self);
MyPanels.Add(pointer(pl));
としてもいいし、
MyPanels.Add(pointer(TMyPanel.Create(self)));
でもいいんじゃないかな。
参照するときは、TMyPanel にキャストします。
pl := TMyPanel(MyPanels[1]);
pl.Align := alNone;
にように。この例のようにオブジェクト参照のリストを作るときは
TList ではなく TObjectList をつかうことをすすめます。
どうも、ありがとうございます。
疑問なのですが、
たぶん、考え方が間違ってるのでしょうが、間違いを
教えてください
MyPanel: TMyPanel;
この時点で MyPanel のメモリが確保されていますよね、
MyPanel := TMyPanel(MyPanels[1]);
を行うと MyPanel に TMyPanel(MyPanels[1]) の値(データ)が
コピーされると思っているのですが、
ここで、
MyPanel.Align := alNone;
とした場合には
MyPanel.Align のデータが変わるけど
TMyPanel(MyPanels[1]).Align のデータは変わらないのでは
ないのでしょうか?
どうも、ありがとうございます。
疑問なのですが、
たぶん、考え方が間違ってるのでしょうが、間違いを
教えてください
MyPanel: TMyPanel;
この時点で MyPanel のメモリが確保されていますよね、
MyPanel := TMyPanel(MyPanels[1]);
を行うと MyPanel に TMyPanel(MyPanels[1]) の値(データ)が
コピーされると思っているのですが、
ここで、
MyPanel.Align := alNone;
とした場合には
MyPanel.Align のデータが変わるけど
TMyPanel(MyPanels[1]).Align のデータは変わらないのでは
ないのでしょうか?
> MyPanel: TMyPanel;
>この時点で MyPanel のメモリが確保されていますよね、
はい。オブジェクト参照のための変数(32ビット)として確保されています。
>MyPanel := TMyPanel(MyPanels[1]);
>を行うと MyPanel に TMyPanel(MyPanels[1]) の値(データ)が
>コピーされると思っているのですが、
いいえ。参照はポインタと同じです。オブジェクトの内容の実質がコピーされる
のではなく、そのアドレスがコピーされる(参照がコピーされる)のです。
>TMyPanel(MyPanels[1]).Align のデータは変わらないのでは
>ないのでしょうか?
参照が同一の実質を指していますので、実質が変更されます。
途中から失礼
> MyPanel: TMyPanel;
> この時点で MyPanel のメモリが確保されていますよね、
jokさんのおっしゃる通りです。
MyPanelは変数で、オブジェクト参照なのでポインタみたいなものです。
シーカーさんの理解だと
MyPanel := TMyPanel.Create(Self);
↑参照(ポインタ)に、↑実体(実質)が生成されて代入されている。
って考えるといいでしょう。
ツイート | ![]() |