- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
除此之外post其接受的答案仍然非常神秘:
@Button1.OnClick := pPointer(Cardinal(pPointer( procedure (sender: tObject) begin ((sender as TButton).Owner as TForm).Caption := 'Freedom to anonymous methods!' end )^ ) + $0C)^;
我想知道是否有可能设计出一种简单而优雅的方式,类似于:
Button.OnClick :=
AnonProc2NotifyEvent (
procedure (Sender: TObject)
begin
((Sender as TButton).Owner as TForm).Caption := 'Freedom to anonymous methods!'
end
);
为了达到相同的目的,其中 AnonProc2NotifyEvent 是 Button 所有者的方法,具有以下签名:
TOwnerOfButton = class(TForm)
Button: TButton;
...
private
...
protected
function AnonProc2NotifyEvent(aProc: TProc<TObject>): TNotifyEvent;
public
...
end;
这可行吗?如果可行如何实现?
最佳答案
这将很容易完成这项工作:
type
TNotifyEventWrapper = class(TComponent)
private
FProc: TProc<TObject>;
public
constructor Create(Owner: TComponent; Proc: TProc<TObject>);
published
procedure Event(Sender: TObject);
end;
constructor TNotifyEventWrapper.Create(Owner: TComponent; Proc: TProc<TObject>);
begin
inherited Create(Owner);
FProc := Proc;
end;
procedure TNotifyEventWrapper.Event(Sender: TObject);
begin
FProc(Sender);
end;
function AnonProc2NotifyEvent(Owner: TComponent; Proc: TProc<TObject>): TNotifyEvent;
begin
Result := TNotifyEventWrapper.Create(Owner, Proc).Event;
end;
Owner
AnonProc2NotifyEvent
中的参数以便可以管理包装对象的生命周期。如果没有类似的东西,你就会泄漏 TNotifyEventWrapper
的实例。
传递为Owner
,您要将事件连接到的组件。例如:
Button1.OnClick := AnonProc2NotifyEvent(
Button1,
procedure(Sender: TObject)
begin
(Sender as TButton).Caption := 'Clicked';
end
);
因此,当按钮被销毁时,TNotifyEventWrapper
也将被摧毁。包装器对象的生存时间必须至少与与其事件关联的对象一样长。所以选择Button1
因为所有者是自然而明显的。
关于delphi - TProc<TObject> 到 TNotifyEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11491593/
我正在寻找创建 TNotifyEvent Hook /包装器的简单方法所以我想到了将其创建为对象以使事情变得更容易 但我不知道如何正确附加/交换方法指针...:/ 也许你们中有人以前做过类似的事情?
我正在尝试使用 RTTI 将事件处理程序添加到控件,该控件可能已经设置了事件处理程序。代码看起来像这样: var prop: TRttiProperty; val: TValue; begin
除此之外post其接受的答案仍然非常神秘: @Button1.OnClick := pPointer(Cardinal(pPointer( procedure (sender: tObject) be
我需要在 C++ Builder 中连接到应用程序的 OnDeactivate 事件。因此,我需要编写自己的函数,以便在应用程序的 OnDeactivate 事件触发时运行,但我不知道在哪里或如何定义
我是一名优秀的程序员,十分优秀!