掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
再入防止のためにイベントハンドラを別メソッドでラップするには? (ID:14463)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
面白そうなので作ってみました。 長いけど勘弁。 // オリジナルのイベントを保持するクラス type TEventWrapper = class private _OriginalEvent : TMethod; //とりあえず今回はSelectCellだけ。 procedure OnSelectCell(Sender: TObject; ACol, ARow: Longint; var CanSelect: Boolean); public constructor Create(orig : TMethod); class function WrapSelectCell(c : TComponent) : TEventWrapper; end; { TEventWrapper } constructor TEventWrapper.Create(orig: TMethod); begin _OriginalEvent := orig; end; //ラップしたいイベントの数だけ同じようなメソッドを作る procedure TEventWrapper.OnSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); var m : TSelectCellEvent; begin m := (Sender as TStringGrid).OnSelectCell; try (Sender as TStringGrid).OnSelectCell := nil; if Assigned(TSelectCellEvent(_OriginalEvent)) then TSelectCellEvent(_OriginalEvent)(Sender, ACol, ARow, CanSelect); finally (Sender as TStringGrid).OnSelectCell := m; end; end; class function TEventWrapper.WrapSelectCell(c: TComponent): TEventWrapper; var pi : PPropInfo; m : TSelectCellEvent; begin Result := nil; pi := GetPropInfo(c.ClassInfo, 'OnSelectCell'); if Assigned(pi) then begin Result := TEventWrapper.Create(GetMethodProp(c, pi)); m := Result.OnSelectCell; SetMethodProp(c, pi, TMethod(m)); end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.