掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ほかのクラスのボタンなどのイベントを発生させるときのSenderの扱い (ID:39690)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Form2.BtnON.OnClick の値がころころ変わる場合は別ですが Form2.BtnON.OnClick のイベントハンドラがスコープ内(アクセスできる位置)にあるなら 直接呼んだほうがいいのでは。 OnClickに限らず、イベントは、Form2.BtnON.OnClickは、Form2.BtnONのためのものであって欲しい場合のほうが多いと思いますので。 procedure Form2.BtnONClick(Sender); begin MessageDlg('test',mtInformation,[mbOK],0); end; みたいなイベントハンドラがForm2にあるとして Procedure Form1.BtnOnClick1(Sender:TObject); begin Form2.BtnONClick(Sender); end; のように直接メソッド(イベントハンドラ)を呼べるなら、そうしたほうがよいと思います。 なお、Form2.BtnOn.OnClick()を使ってイベントハンドラを呼び出すには、アサインされてるかどうか確認するようにしたほうが、よいと思う。 if Assigned(Form2.BtnON.OnClick) then Form2.BtnON.OnClick(Form2.BtnON) Sender が重要になる場合というのは、イベントハンドラ内でSenderを使う場合だけなので、nil で呼び出しても問題ありません。 Form2.BtnONClick(nil); むしろ、直に呼び出す場合は、特に意図してSenderを伝えたい場合以外は nil にするべき。 そうすれば、ハンドルする側で、直接呼ばれたものなのか、イベントによって呼ばれたものなのかが判断できます。 イベントハンドラ内では procedure TForm2.BtnONClick(Sender:TObject); begin if Assigned(Sender) then begin さらに if Sender is TButton then begin TButton(Sender).Caption:='OK'; end; あるいは if Sender=Form1.Button1 then begin Form1.Button1.Caption:='OK'; end; 場合によっては if Sender is TList then begin TList(Sender).Add() end; end; end; のような処理例が考えられるので、その辺を踏まえて Sender を渡すかどうか考えるようにすれば、よいと思います この場合TNotifyEventでパラメータはSenderのみですが、それ以外の場合もパラメータリストさえあえば イベントハンドラを1つにまとめることもできるわけで、まあいろいろ、どーするのが効率がよいか 可読性が高いかとか、処理速度を優先するか、リソース効率を高めるかで、その都度考えるように なるかと思います。 ということで、特に決まったやり方というのは無く、その都度考えなければならないということです。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.