我有两个不同的方法指针。

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派生的参数调用,则编译器将无法保存您。

09-09 20:00