假设我有一个链接到 Button1Click 过程的 Button1.OnClick 事件。我还有 Button2.OnClick 链接到其他一些程序。如何检查这两个事件是否从运行时链接到不同或相同的过程?
我尝试测试是否:
- Button1.OnClick = Button2.OnClick,但这给了我一个错误(没有足够的实际参数)
- @(Button1.OnClick) = @(Button2.OnClick),再次出错(实际参数不够)
我该如何正确测试它?
方法引用可以分为两部分:指向对象的指针和指向方法本身的指针。中定义了一个方便的记录类型System
单位称为TMethod
这使我们能够做到这一点。
有了这些知识,我们可以写出这样的东西:
function SameMethod(AMethod1, AMethod2: TNotifyEvent): boolean;
begin
result := (TMethod(AMethod1).Code = TMethod(AMethod2).Code)
and (TMethod(AMethod1).Data = TMethod(AMethod2).Data);
end;
希望这可以帮助。 :)
Edit:只是为了以更好的格式列出我试图在这里解决的问题(正如评论中提到的)。
如果您有两个表单,两者都从同一个基类实例化:
Form1 := TMyForm.Create(nil);
Form2 := TMyForm.Create(nil);
然后将这些表单中的相同方法分配给这两个按钮:
Button1.OnClick := Form1.ButtonClick;
Button2.OnClick := Form2.ButtonClick;
并将两者进行比较OnClick
属性,你会发现Code
是一样的,但是Data
是不同的。那是因为它是相同的方法,但是在类的两个不同实例上......
现在,如果您对同一个对象有两个方法:
Form1 := TMyForm.Create(nil);
Button1.OnClick := Form1.ButtonClick1;
Button2.OnClick := Form1.ButtonClick2;
然后他们的Data
会是一样的,但是他们的Code
会有所不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)