喫茶XRAYトップページ

[スレッド全体
]

[1021] Re3:TStringList.OnChangeは使えるのでしょうか返信 削除
2006/11/19 (日) 20:10:57 Mr.XRAY
▼ takiさん

> だから、SL.OnChangeイベント=プロパティにSLOnChange手続きのアドレスを
> 代入できると考えたら良いのでしょうか。

です。=でポインタ(関数、プロシージャーのアドレス)を設定しています。

> 上のコードのSenderは何を表しているのでしょうか?
提示のコードでは生成したSLです。
この場合のSenderはTObjectです。TObjectは何でも扱えますが、型情報は
キャストする必要があるため、TStringList(Sender)としています。
(Sender.Textでは取出せない。Senderには元のクラスが何であるかという
情報はなく、引数のオブジェクトのポインタだけ)
したがって、

TStringList(Sender).Text は SL.Text とも書けますが、Senderとしておけば、
生成したTStringListの名前が何であっても汎用的に使用できますから。
これはコードの可読性とも関係ありますので、ケースバイケースですね。

ただ、注意すべきは、提示のコードではAddしたのが一つだけですけど、
既に、または複数のLinesプロパティがある時は、Textはその全てとなって
しまいます。あくまでも例としてですので、その点よろしく。

[1022] Re4:TStringList.OnChangeは使えるのでしょうか返信 削除
2006/11/19 (日) 21:08:16 taki
▼ Mr.XRAYさん

イベントとSenderが少し理解できたような気がします。

ありがとうございます。


[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