- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
自从 Delphi 中出现匿名方法后,我想在 VCL 组件事件中使用它们。显然,为了向后兼容,VCL 没有更新,所以我设法做了一个简单的实现,但有一些注意事项。
type
TNotifyEventDispatcher = class(TComponent)
protected
FClosure: TProc<TObject>;
procedure OnNotifyEvent(Sender: TObject);
public
class function Create(Owner: TComponent; const Closure: TProc<TObject>): TNotifyEvent; overload;
function Attach(const Closure: TProc<TObject>): TNotifyEvent;
end;
implementation
class function TNotifyEventDispatcher.Create(Owner: TComponent; const Closure: TProc<TObject>): TNotifyEvent;
begin
Result := TNotifyEventDispatcher.Create(Owner).Attach(Closure)
end;
function TNotifyEventDispatcher.Attach(const Closure: TProc<TObject>): TNotifyEvent;
begin
FClosure := Closure;
Result := Self.OnNotifyEvent
end;
procedure TNotifyEventDispatcher.OnNotifyEvent(Sender: TObject);
begin
if Assigned(FClosure) then
FClosure(Sender)
end;
end.
这就是它的使用方式:
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.OnClick := TNotifyEventDispatcher.Create(Self,
procedure (Sender: TObject)
begin
Self.Caption := 'DONE!'
end)
end;
我认为很简单,但有两个缺点:
我必须创建一个组件来管理匿名方法的生命周期(我浪费了更多的内存,而且间接的速度有点慢,但我仍然更喜欢在我的应用程序中使用更清晰的代码)
我必须为每个事件签名实现一个新类(非常简单)。这个有点复杂,但 VCL 仍然具有非常常见的事件签名,并且对于每种特殊情况,当我创建类时,它都会永远完成。
您对这个实现有何看法?有什么可以让它变得更好吗?
最佳答案
你可以看看我的multicast event implementation in DSharp .
然后你可以编写这样的代码:
function NotifyEvent(Owner: TComponent; const Delegates: array of TProc<TObject>): TNotifyEvent; overload;
begin
Result := TEventHandler<TNotifyEvent>.Create<TProc<TObject>>(Owner, Delegates).Invoke;
end;
function NotifyEvent(Owner: TComponent; const Delegate: TProc<TObject>): TNotifyEvent; overload;
begin
Result := NotifyEvent(Owner, [Delegate]);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.OnClick := NotifyEvent(Button1, [
procedure(Sender: TObject)
begin
Caption := 'Started';
end,
procedure(Sender: TObject)
begin
if MessageDlg('Continue?', mtConfirmation, mbYesNo, 0) <> mrYes then
begin
Caption := 'Canceled';
Abort;
end;
end,
procedure(Sender: TObject)
begin
Caption := 'Finished';
end]);
end;
关于delphi - 具有匿名方法的 VCL 事件 - 您对此实现有何看法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8025481/
阅读 Doug 的“Javascript: the goods parts”中关于函数的第 4 章谈论“方法调用模式”和“函数调用模式”(第 28 页)。 When a function is sto
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
在 Inkscape 中创建的文件的 svg 路径如下 -- d="m 1.2499932,903.60456 0,146.50004 197.7500068,0 0,-146.50004 -197.
有没有办法只为类对象制作 setter/getter?我的意思是,无论如何要在类里面为 this 设置 get/set 吗?例如: class something { constructor(
int main(int argc,char **argv){ for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount) {
正如 Scott Meyers 和 Andrei Alexandrescu 在 this 中概述的那样文章 简单尝试实现双重检查锁定实现在 C++ 中特别是不安全的,并且通常在不使用内存屏障的多处理器
我正在尝试使用ionic 3 发布一个android 应用程序,但是运行时出现错误 apksigner verify myapp.apk 这些错误显示: WARNING: META-INF/andro
Java网站教程中的这个例子page .两个接口(interface)定义了相同的默认方法 startEngine()。类 FlyingCar 实现了这两个接口(interface),并且由于明显的冲
我在我的桌面应用程序中做了一些非常简单的错误记录,该应用程序通过 SerialPort 与设备通信。我做的一件事是设置一个全局异常捕获器,它除了使用以下方法记录堆栈跟踪外什么都不做: AppDomai
根据 SQL 规范,对此 sql 查询的这些响应中哪些更正确? 这是mysql更高版本的响应 C:\wamp\bin\mysql\mysql5.7.11\bin>mysql.exe --version
我正在尝试解决 GEEK COUNT spoj 的问题。我解决这个问题的方法是先找到所有奇数位的数字,然后从给定的数字中减去它。为了查找所有奇数位的数字计数,我使用了简单的排列。它为我提供了所有可能的
我有这个基本的文本检查代码,在 iOS 7 之前一直运行良好: NSMutableCharacterSet*testchars=[NSCharacterSet alphanumericChara
我对下面的代码感到困惑: class MyException extends Exception {} class AnotherException extends MyException {} cl
我在这段代码中遇到编译错误 #include #include #include using namespace std; void main(int argc
我在我的应用程序中使用导航组件,最近它工作正常但是在将项目更新到 AndroidX 之后我收到错误消息 navigation destination DESTINATION_NAME is unkno
{ "status":"success", "contents":[ { "id":"100", "event":"",
我是一名优秀的程序员,十分优秀!