gpt4 book ai didi

delphi - TProc 到 TNotifyEvent

转载 作者:行者123 更新时间:2023-12-03 14:35:22 33 4
gpt4 key购买 nike

除此之外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/

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