掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
通知先が2カ所以上あるような複数イベントの処理 (ID:13646)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Delphi のイベントはメソッドポインタをひとつだけしか格納できない プロパティーとして実装されています。ですから、普通の意味でのイベント ハンドラは複数保持できません。そこで、発想を変えて、複数のメソッド ポインタを動的に保持することを考えます。下の例では TNotifyEvent 型 のメソッドポインタの動的配列を TList クラスで保持します。メソッド を直接追加・削除できますので、それがどのクラスに属しているかを明示的 に参照する必要はありません。参考にしてください。 type PNotifyEvent = ^TNotifyEvent; TClassA = class(TObject) private EventList:TList; function GetEventCount:integer; protected public constructor Create; destructor Destroy;override; procedure AddNotifyEvent(ne:TNotifyEvent); procedure DeleteNotifyEvent(ne:TNotifyEvent); procedure Fire; property EventCount:integer read GetEventCount; end; TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private 宣言 } public ClassA:TClassA; procedure Method1(Sender: TObject); procedure Method2(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} //----------- TClassA --------------- constructor TClassA.Create; begin EventList := TList.Create; end; destructor TClassA.Destroy; var i:integer; begin for i := 0 to EventList.Count-1 do Dispose(PNotifyEvent(EventList[i])); EventList.Free; inherited; end; function TClassA.GetEventCount:integer; begin result := EventList.Count; end; procedure TClassA.AddNotifyEvent(ne:TNotifyEvent); var p:PNotifyEvent; i:integer; begin for i := 0 to EventList.Count-1 do if @TNotifyEvent(PNotifyEvent(EventList[i])^) = @ne then exit; New(p); p^ := ne; EventList.Add(p) end; procedure TClassA.DeleteNotifyEvent(ne:TNotifyEvent); var i:integer; begin for i := 0 to EventList.Count-1 do if @TNotifyEvent(EventList[i]^) = @ne then begin Dispose(PNotifyEvent(EventList[i])); EventList.Delete(i); break; end; end; procedure TClassA.Fire; var i:integer; begin for i := 0 to EventList.Count-1 do if Assigned(EventList[i]) then PNotifyEvent(EventList[i])^(self); end; //----------- TForm1 --------------- procedure TForm1.FormCreate(Sender: TObject); begin ClassA := TClassA.Create; ClassA.AddNotifyEvent(Method1); ClassA.AddNotifyEvent(Method2); end; procedure TForm1.FormDestroy(Sender: TObject); begin ClassA.Free; end; procedure TForm1.Method1(Sender: TObject); begin Memo1.Lines.Add('Method1 done'); end; procedure TForm1.Method2(Sender: TObject); begin Memo1.Lines.Add('Method2 done'); end; procedure TForm1.Button1Click(Sender: TObject); begin ClassA.Fire; end; procedure TForm1.Button2Click(Sender: TObject); begin ClassA.DeleteNotifyEvent(Method1); ClassA.Fire; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.