gpt4 book ai didi

delphi - Hook TNotifyEvent/寻找使用方法和过程指针的正确方法

转载 作者:行者123 更新时间:2023-12-02 10:18:25 26 4
gpt4 key购买 nike

我正在寻找创建 TNotifyEvent Hook /包装器的简单方法所以我想到了将其创建为对象以使事情变得更容易

但我不知道如何正确附加/交换方法指针...:/

也许你们中有人以前做过类似的事情?

这是我的类(class)的骨架

  TNotifyEventHook = class
private
NotifyEvent: ???????;
OldProc, NewProc: ???????;

FContinueEventChain: Boolean;
procedure Wrapper(Sender: TObject);
public
constructor Create(OriginalNotifyEvent: ???????; ChainNotifyEvent???????);
destructor Destroy; override;
property ContinueEventChain: Boolean read FContinueEventChain write FContinueEventChain default True;
end;



constructor TNotifyEventHook.Create(OriginalNotifyEvent: ???????; ChainNotifyEvent: ???????);
begin
NotifyEvent := ??????? // save
OldProc := ???????
NewProc := ???????

NotifyEvent := ??????? // redirect NotifyEvent to Wrapper
end;

destructor TNotifyEventHook.Destroy;
begin
??????? // detach chain
end;

procedure TNotifyEventHook.Wrapper(Sender: TObject);
begin
if Assigned(NewProc) then
NewProc(Sender);
if FContinueEvenChain and Assigned(OldProc) then
OldProc(Sender);
end;

我真的很感激您的帮助...或者也许只是更好的想法?

最佳答案

这是行不通的,因为您无法将事件属性本身的引用存储在变量或参数中。 NotifyEventOldProc/NewProc。换句话说:存储在事件属性中的是事件处理程序,当从对象内部触发该属性时,该事件处理程序将被调用。因此,有效的 TNotifyEvent 实例仅告诉调用哪个例程,而不告诉例程链接到哪个对象或属性。

如果您的问题仅限于一个特定事件,例如TControl.OnClick,则以下内容有效。否则,我建议您使用多播事件模型,例如 TApplicationEvents 所做的。

type
TOnClickRedirector = class
private
FControl: TControl;
FFireOriginalToo: Boolean;
FOriginal: TNotifyEvent;
FRedirect: TNotifyEvent;
procedure Fire(Sender: TObject);
public
constructor Create(Control: TControl; OnClick: TNotifyEvent);
destructor Destroy; override;
property FireOriginalToo: Boolean read FFireOriginalToo
write FFireOriginalToo default True;
end;

TControlAccess = class(TControl);

{ TOnClickRedirector }

constructor TOnClickRedirector.Create(Control: TControl; OnClick: TNotifyEvent);
begin
FControl := Control;
FOriginal := TControlAccess(FControl).OnClick;
FRedirect := OnClick;
TControlAccess(FControl).OnClick := Fire;
FFireOriginalToo := True;
end;

destructor TOnClickRedirector.Destroy;
begin
TControlAccess(FControl).OnClick := FOriginal;
inherited Destroy;
end;

procedure TOnClickRedirector.Fire(Sender: TObject);
begin
if Assigned(FRedirect) then
FRedirect(Sender);
if FFireOriginalToo and Assigned(FOriginal) then
FOriginal(Sender);
end;

为您想要拦截的每个特定事件复制此内容。请注意,此代码示例并不能保证 FControl 在该对象销毁时不再存在的可能性。因此,最好从 TComponent 继承并使用 FreeNotification

关于delphi - Hook TNotifyEvent/寻找使用方法和过程指针的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28718643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com