我有两个不同的方法指针。
type
TComponentMethod = procedure(const AComponent: TComponent) of object;
TFormMethod = procedure(const AForm: TForm) of object;
唯一的区别是参数的类型,但是两者都是对象引用,因此从调用约定的角度来看应该没有任何区别。
(但是,由于协/逆,这可能是类型安全问题。)
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure M2(const AForm: TForm);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
FormMethod: TFormMethod;
ComponentMethod: TComponentMethod;
begin
FormMethod := M2;
// How to cast this?
ComponentMethod := M2;
end;
编译器不允许我这样做。
[dcc32 Error] Unit1.pas(32): E2010 Incompatible types: 'TComponent' and 'TForm'
有什么方法可以将方法指针类型转换为另一个“兼容”方法指针?
最佳答案
你可以这样做:
var
FormMethod: TFormMethod;
ComponentMethod: TComponentMethod;
begin
FormMethod := M2;
ComponentMethod := TComponentMethod(FormMethod);
end;
据我所知,诀窍是您需要先分配一个临时局部变量,然后再将其分配给
ComponentMethod
。如您所知,这不是类型安全的。如果
ComponentMethod
用不是从TForm
派生的参数调用,则编译器将无法保存您。