- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 RTTI 将事件处理程序添加到控件,该控件可能已经设置了事件处理程序。代码看起来像这样:
var
prop: TRttiProperty;
val: TValue;
begin
prop := FContext.GetType(MyControl.ClassInfo).GetProperty('OnChange');
val := prop.GetValue(MyControl);
FOldOnChange := val.AsType<TNotifyEvent>;
prop.SetValue(MyControl, TValue.From<TNotifyEvent>(self.MyOnChange));
end;
我想要这个,这样我就可以在 MyOnChange 中执行此操作:
begin
if assigned(FOldOnChange) then
FOldOnChange(Sender);
//additional code here
end;
不幸的是,编译器似乎不喜欢 FOldOnChange := val.AsType<TNotifyEvent>;
行。它说
E2010 Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'TNotifyEvent'
有人知道这是为什么或者如何解决吗?我觉得很合适...
最佳答案
FOldOnChange
是方法指针类型,而AsType<TNotifyEvent>
是一种方法。编译器认为您正在尝试将该方法分配给方法指针。解决方案是附加 ()
到方法调用来强制它,并使用方法的返回值作为分配给 FOldOnChange
的值.
这是一个完整的示例:
uses SysUtils, Rtti;
type
TEv = procedure(Sender: TObject) of object;
TObj = class
private
FEv: TEv;
public
property Ev: TEv read FEv write FEv;
class procedure Meth(Sender: TObject);
end;
class procedure TObj.Meth(Sender: TObject);
begin
end;
procedure P;
var
ctx: TRttiContext;
t: TRttiType;
p: TRttiProperty;
v: TValue;
o: TObj;
e: TEv;
begin
t := ctx.GetType(TObj);
p := t.GetProperty('Ev');
o := TObj.Create;
try
// Set value explicitly
o.Ev := TObj.Meth;
// Get value via RTTI
v := p.GetValue(o);
//e := v.AsType<TEv>; // doesn't work
e := v.AsType<TEv>(); // works
finally
o.Free;
end;
end;
begin
try
P;
except
on e: Exception do
Writeln(e.Message);
end;
end.
关于delphi - 如何正确使用 TValue.AsType<TNotifyEvent>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2419552/
我正在寻找创建 TNotifyEvent Hook /包装器的简单方法所以我想到了将其创建为对象以使事情变得更容易 但我不知道如何正确附加/交换方法指针...:/ 也许你们中有人以前做过类似的事情?
我正在尝试使用 RTTI 将事件处理程序添加到控件,该控件可能已经设置了事件处理程序。代码看起来像这样: var prop: TRttiProperty; val: TValue; begin
除此之外post其接受的答案仍然非常神秘: @Button1.OnClick := pPointer(Cardinal(pPointer( procedure (sender: tObject) be
我需要在 C++ Builder 中连接到应用程序的 OnDeactivate 事件。因此,我需要编写自己的函数,以便在应用程序的 OnDeactivate 事件触发时运行,但我不知道在哪里或如何定义
我是一名优秀的程序员,十分优秀!