喫茶XRAYトップページ

[スレッド全体
]

[1023] クラスとイベントとSenderの関係は返信 削除
2006/11/20 (月) 09:34:48 taki
▼ Mr.XRAYさん

今回質問しましたTStringListを例にすると
クラスはTStringListのプロパティ、イベント、メソッドを
定義している。

SL1,SL2:TStringListの2つのオブジェクトを生成すると、

SL1,SL2毎にプロパティ、イベントのメモリ領域が確保される。
また、SL1,SL2に共有のメソッドのコードが作成される。

変数SL1,SL2には確保されたメモリ領域(= object?)のポインタが
代入される。

次に、イベントの手続きである
procedure TForm1.SLOnChange(Sender: TObject);
begin
     ShowMessage(TStringList(Sender).Text+'を追加しました ');
end;
は、TFormクラスの中に作成されるコードでそのポインタは
TForm1.SLOnChangeの中に入っている。
 ※TFormの中に必ず記述する必要があるのでしょうか?

SL1.OnChange:=SLOnChange; することで

SL1のイベントのメモリ領域にTForm1.SLOnChangeのポインタが
代入されて呼び出し可能になる。

その後、SL1に変化があると、SL1のポインタと共にイベントが
呼び出される。

呼び出されたTForm1.SLOnChange(Sender: TObject)のSenderには
SL1のポインタが入っている。

ただ、SL1はメモリのブロックなので、TStringList型でキャスト
しないとそれぞれの定義の情報にアクセスできない。

同様に、SL2も
SL2.OnChange:=SLOnChange; すると
SL2が変化すると、SL2のポインタと共にイベントが呼ばれる。

だから、TForm1.SLOnChangeイベントのコードは1つだけど、
Senderが変わるのでこの手続きを共有して使うことができる。

と、解釈しました・・・ どうでしょうか?


[1024] Re:クラスとイベントとSenderの関係は返信 削除
2006/11/20 (月) 20:27:38 Mr.XRAY
▼ takiさん

>  ※TFormの中に必ず記述する必要があるのでしょうか?
いけないということはないと思いますが...
どんな具合にしたいのでしょうか。

> と、解釈しました・・・ どうでしょうか?
ですね。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82