▼ 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が変わるのでこの手続きを共有して使うことができる。
と、解釈しました・・・ どうでしょうか?
|