16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"senderの使い方"
この発言に対し以下のコメントが寄せられています
#01040 戯音匠者 さん Re:senderの使い方
みなさん、おはようございます。
Diaです。
nifty:FDELPHI/MES/06/30487 からのsenderに関する話題への
サンプル(解説?)です。
[Q]
procedure TForm1.Button1Click(Sender: TObject);
↑これってなに?
[A]
senderというのは、そのイベントハンドラを誰が呼び出したか教えてくれる、
値のことです。
例:
フォームにボタンを二個用意して、Button1をダブルクリックして
procedure TForm1.Button1Click(Sender: TObject);
begin
showMessage('Button1をクリックしたでしょ?');
end;
と言うコードを書けば、Button1がクリックされたとき、メッセージが出ます。
んで、Button2を選んだ状態でオブジェクトインスペクタの「イベント-OnClick」の
ところのリストをみると、Button1Clickと言うのがありますので、これを
選択します。
これで、Button1もButton2も同じイベントハンドラを使うことができます。
でさて(ここからが本題)
このままだとButton2を押しても「Button1をクリックした」と言いますので、
適切な名前を言わせましょう。
先ほどのButton1Clickをこういう風に書き換えます。
procedure TForm1.Button1Click(Sender: TObject);
begin
if sender is TButton then
showMessage(TButton(sender).name+'をクリックしたでしょ?');
end;
一行目はちょっと後回しにして、二行目ですが、
senderというのが呼び出し元ですので、クリックしたボタンが入ってます。
ただこれ、いろんな都合でTButton型ではなくてTObject型になっていますので、
TButton(sender)とすることで、呼び出し元のボタンがわかります。
で、TButton(sender).nameとすれば呼び出したボタンの名前がとれるわけです。
問題なのは、このイベントハンドラを他の方法で呼び出されたときどうする?と
いうことで、たとえば今のフォームにCheckBoxを貼りつけて、おなじくOnClickに
Button1Clickを設定したりすると、妙なことになります。
(TCheckBoxはTButtonとまるで関係ないのに、TButton型に押し込んでます)
これをさけるために、
if sender is TButton then
の一行があります。
[END]
もともとFAQにあげようとしたのですが、もはやサンプルコードと化したので
急遽書き換え^^;
しっぽを引くと、もぎゃあと鳴きます。
daisuke.furukawa@nifty.ne.jp Dia
Original document by Dia 氏 ID:(CQK00014)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|