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


シーカー  2006-07-06 20:32:26  No: 22431

お世話になります。
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 21:19:28  No: 22432

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

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 23:58:30  No: 22433

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

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


シーカー  2006-07-07 23:58:31  No: 22434

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

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


jok  2006-07-08 00:27:53  No: 22435

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

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

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

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

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

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


Fusa  2006-07-08 08:06:52  No: 22436

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加