ポインタを設定するには?


シーカー  2006-07-06 11:32:26  No: 22431  IP: 192.*.*.*

お世話になります。
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 したポインタを
入れることはできないのでしょうか?

編集 削除
jok  2006-07-06 12:19:28  No: 22432  IP: 192.*.*.*

そもそも、オブジェクト参照はポインタです。

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 をつかうことをすすめます。

編集 削除
シーカー  2006-07-07 14:58:30  No: 22433  IP: 192.*.*.*

どうも、ありがとうございます。
疑問なのですが、
たぶん、考え方が間違ってるのでしょうが、間違いを
教えてください

MyPanel:  TMyPanel;
この時点で MyPanel のメモリが確保されていますよね、
MyPanel := TMyPanel(MyPanels[1]);
を行うと MyPanel に TMyPanel(MyPanels[1]) の値(データ)が
コピーされると思っているのですが、
ここで、
MyPanel.Align := alNone;
とした場合には
MyPanel.Align のデータが変わるけど
TMyPanel(MyPanels[1]).Align のデータは変わらないのでは
ないのでしょうか?

編集 削除
シーカー  2006-07-07 14:58:31  No: 22434  IP: 192.*.*.*

どうも、ありがとうございます。
疑問なのですが、
たぶん、考え方が間違ってるのでしょうが、間違いを
教えてください

MyPanel:  TMyPanel;
この時点で MyPanel のメモリが確保されていますよね、
MyPanel := TMyPanel(MyPanels[1]);
を行うと MyPanel に TMyPanel(MyPanels[1]) の値(データ)が
コピーされると思っているのですが、
ここで、
MyPanel.Align := alNone;
とした場合には
MyPanel.Align のデータが変わるけど
TMyPanel(MyPanels[1]).Align のデータは変わらないのでは
ないのでしょうか?

編集 削除
jok  2006-07-07 15:27:53  No: 22435  IP: 192.*.*.*

> MyPanel:  TMyPanel;
>この時点で MyPanel のメモリが確保されていますよね、

はい。オブジェクト参照のための変数(32ビット)として確保されています。

>MyPanel := TMyPanel(MyPanels[1]);
>を行うと MyPanel に TMyPanel(MyPanels[1]) の値(データ)が
>コピーされると思っているのですが、

いいえ。参照はポインタと同じです。オブジェクトの内容の実質がコピーされる
のではなく、そのアドレスがコピーされる(参照がコピーされる)のです。

>TMyPanel(MyPanels[1]).Align のデータは変わらないのでは
>ないのでしょうか?

参照が同一の実質を指していますので、実質が変更されます。

編集 削除
Fusa  2006-07-07 23:06:52  No: 22436  IP: 192.*.*.*

途中から失礼
> MyPanel:  TMyPanel;
> この時点で MyPanel のメモリが確保されていますよね、
jokさんのおっしゃる通りです。

MyPanelは変数で、オブジェクト参照なのでポインタみたいなものです。

シーカーさんの理解だと
MyPanel := TMyPanel.Create(Self);
↑参照(ポインタ)に、↑実体(実質)が生成されて代入されている。
って考えるといいでしょう。

編集 削除