DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: Rebafseken
今日帖子: 2
在线用户: 3
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 keeray (keeray) ▲▲▲▲▲ -
普通会员
2018/7/5 16:04:46
标题:
如何在Delphi中匿名方法动态绑定事件 浏览:456
加入我的收藏
楼主: 在QDAC博客中看到Delphi中匿名方法动态绑定事件,但文章提到“【注意】 由于匿名函数中,我将TMethod.Data指向了匿名函数对应的接口对象,所以在匿名函数中,不要使用Self来代表当前对象。如果非要使用的话,那么自己修改下Wrap的代码,”
有那位大侠知道如何修改让它支持Self不?
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/7/5 16:49:54
1楼: 不知道
原帖都没见着。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 keeray (keeray) ▲▲▲▲▲ -
普通会员
2018/7/5 17:05:39
2楼: http://blog.qdac.cc/?s=%E5%8C%BF%E5%90%8D%E6%96%B9%E6%B3%95
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/7/5 17:58:43
3楼: type
  TAnonEvent=class
  public
    class function Wrap<T1,T2>(Onwer:TObject; OnEvent:T1):T2;
  end;
{ TAnonEvent }
class function TAnonEvent.Wrap<T1,T2>(Onwer:TObject; OnEvent: T1):T2;
var
  Addr:Pointer;
  AMethod:PMethod;
begin
Addr:=PPointer(@OnEvent)^;
AMethod:=@Result;
AMethod.Code:=PPointer(IntPtr(PPointer(Addr)^)+SizeOf(Pointer)*3)^;//QueryInterface/AddRef/Release/Invoke
AMethod.Data:=Onwer;
end;
 
type
  TNotifyEventA=reference to procedure(ASender:TObject);
procedure TForm3.Button1Click(Sender: TObject);
begin
Button2.OnClick:=TAnonEvent.Wrap<Self, TNotifyEventA,TNotifyEvent>(procedure (sender: tObject)
     begin
      Button2.Caption:=DateTimeToStr(Now);
       ShowMessage('OK');
     end);
Button2.OnClick(Sender);
end;

按上述代码修改 看看。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 keeray (keeray) ▲▲▲▲▲ -
普通会员
2018/7/5 18:09:45
4楼: @wang_80919 (Flying Wang)
不行!整个代码如下,虽然可以执行,但button2的caption没有改变
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TAnonEvent = class
  public
    class function Wrap<T1, T2>(Owner: TObject; OnEvent: T1): T2;
  end;

  TForm1 = class(TForm)
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TNotifyEventA = reference to procedure(ASender: TObject);

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button2.OnClick := TAnonEvent.Wrap<TNotifyEventA, TNotifyEvent>(Self,
    procedure(Sender: TObject)
    begin
      Button2.Caption := DateTimeToStr(Now);
      ShowMessage('OK');
    end);
end;

{ TAnonEvent }

class function TAnonEvent.Wrap<T1, T2>(Owner: TObject; OnEvent: T1): T2;
var
  Addr: Pointer;
  AMethod: PMethod;
begin
  Addr := PPointer(@OnEvent)^;
  AMethod := @Result;
  AMethod.Code := PPointer(IntPtr(PPointer(Addr)^) + SizeOf(Pointer) * 3)^; // QueryInterface/AddRef/Release/Invoke
  AMethod.Data := Pointer(Owner);
end;

end.
----------------------------------------------
-
作者:
男 looper (keyo) ★☆☆☆☆ -
盒子活跃会员
2018/7/5 18:21:27
5楼: Button2.Caption := DateTimeToStr(Now);
改成
TButton(Sender).Caption := DateTimeToStr(Now);

试看看
----------------------------------------------
虽千万人吾往矣!
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/7/5 18:36:08
6楼: 可能我这种改法,其实是破坏了内存的结构。建议还是不要改了。
按 5 楼写吧。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 keeray (keeray) ▲▲▲▲▲ -
普通会员
2018/7/5 19:05:37
7楼: @looper (keyo)
我不是想修改Button2.Caption,我是想在匿名函数中能做到Self就是代表Form1
----------------------------------------------
-
作者:
男 msfm (清洁工) ★☆☆☆☆ -
盒子活跃会员
2018/7/6 8:41:22
8楼: 搞的 现在 代码 越来越看不懂了 表示以前的代码够用了
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2018/7/6 14:32:59
9楼: 问下楼主:匿名方法动态绑定事件 比 其他方式动态绑定事件 的好处有哪些?
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ▲▲▲▲▲ -
普通会员
2018/7/7 13:40:10
10楼: owner绑进去,在匿名函数被调用的时候,会有偏移的。
这个和匿名函数的结构有关。

intptr(pointer(self)) + sizeof(int) * 4 + sizeof(void *) * 4
这样应该就差不多了。

不过你这够非主流的。本来人家的事件都不是匿名函数。。。
----------------------------------------------
--
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行15.625毫秒 RSS