如何截获指定类的事件?(100分)

  • 主题发起人 主题发起人 io_box
  • 开始时间 开始时间
I

io_box

Unregistered / Unconfirmed
GUEST, unregistred user!
需求:
代码中很多地方写了 Menuitem1.Onclick事件, 现在需要在指定 menuitem 的 onclick 事件触发前执行 另一个过程: preCon。 因为目前该dpr已经有很多地方写了,所以再继承 menuitem 重载 click 虚方法的思路不可行!

btw: 在一个控件的源码中见过类似的处理:
HookFieldChangeEvent(self, PreFieldChangeEvent) ,这样self 中触发fieldchange事件时,都会先执行 PreFieldChangeEvent。 可惜该HookFieldChangeEvent是dcu封装了:(
 
维护一个列表不就行了
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
FEventList : TList;
procedure NewButtonClick(Sender: TObject);
procedure SetAfterEvent(AObject:TObject);
public
{ Public declarations }
end;

PEventRecord = ^TEventRecord;
TEventRecord = Record
Obj : TObject;
OldEvent : TNotifyEvent;
end;


procedure TForm1.SetAfterEvent(AObject: TObject);
var
p : PEventRecord;
begin
if AObject is TButton then
begin
new(p);
p.Obj := AObject;
p.OldEvent := TButton(AObject).OnClick;
FEventList.Add(p)

TButton(AObject).OnClick := NewButtonClick;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
FEventList := TList.Create;
for i := 0 to self.ComponentCount - 1 do
SetAfterEvent(self.Components);
end;
procedure TForm1.NewButtonClick(Sender: TObject);
var
i : integer;
begin
ShowMessage((sender as tbutton).Caption);
for i := 0 to FEventList.Count - 1 do
begin
if PEventRecord(FEventList.Items).Obj = sender then
begin
PEventRecord(FEventList.Items).OldEvent(sender);
break;
end;
end;
end;

注意没写释放FEventList的代码,自己加
 
menuitem.onclick事件中添加执行preCon。不就行了!
 
不错的思路,我自己想复杂了,一看到hook就开始晕了。 ^-^ 。 谢谢 '轻舞肥羊'
 
后退
顶部