掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
再入防止のためにイベントハンドラを別メソッドでラップするには? (ID:14451)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
キーを連続して叩くなどでのイベントハンドラへの再入を防止するために 通常は、 procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin StringGrid1.OnSelectCell:=nil; try ...//処理 finally StringGrid1.OnSelectCell:=StringGrid1SelectCell; end; end; などと書くと思うのですが、いちいちすべてのイベントハンドラに上記のような コードを入れるのは手間なので、フォームのCreate時に全てのイベントハンドラに対して 上記処理でラップしたいのですが、うまくいきません。 //やりたいこと procedure TForm1.FormCreate(Sender: TObject); begin for i:=0 to ComponentCount - 1 do begin WrapEventHandlersToAvoidReEntrant(Components[i]); end; end; procedure TForm1.WrapEventHandlersToAvoidReEntrant(c: TComponet); begin //設定されているすべてのイベントハンドラを再入防止の処理でラップする //(ここは本当はOn〜という名前のプロパティの型と、それがnilかどうかを動的に調べたい) c.OnClick:=GetWrappedEventHandler(c.OnClick); end; //以下は多分イベントの型ごとに必要? function TForm1.GetWrappedEventHandler(e: TNotifyEvent):TNotifyEvent; begin Result:=...; end; function TForm1.GetWrappedEventHandler(e: TKeyEvent):TKeyEvent; begin Result:=...; end; あるMLの過去ログで調べたのですが、PropInfo やTMethod などを使えばいいのかなと 思いつつ、いろいろ試行錯誤して結局できませんでした。 どなたかアドバイスありましたらよろしくお願いします。。。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.