怎么把一个类的成员函数指向另一个类的函数? ( 积分: 50 )

  • 主题发起人 主题发起人 songbo_pp
  • 开始时间 开始时间
S

songbo_pp

Unregistered / Unconfirmed
GUEST, unregistred user!
遇到一个问题,想把一个函数指向另外一个同结构的函数,不知道怎么来做:
例如:
A = class
public
procedure PressOtherKey(Key: Word);
end;

B = class
public
procedure PressOtherKey(Key: Word);
end;

a: A;
b: B;

a.PressOtherKey := b.PressOtherKey;//这样会抱错,‘Not enough actual parameter’,不明白;
 
遇到一个问题,想把一个函数指向另外一个同结构的函数,不知道怎么来做:
例如:
A = class
public
procedure PressOtherKey(Key: Word);
end;

B = class
public
procedure PressOtherKey(Key: Word);
end;

a: A;
b: B;

a.PressOtherKey := b.PressOtherKey;//这样会抱错,‘Not enough actual parameter’,不明白;
 
只要在调用时: B(a).PressOtherKey(Key)

不过很多时候你会死的很难看。
 
这样不就结了:
Base = class
public
procedure PressOtherKey(Key: Word);
end;

A = class(Base);
B = class(Base);
 
呵呵,不报错才牛呢!

声明一个事件吧,事件可以说是“指向过程的指针”给指针赋值就不会错了!
 
type
TProc = procedure (Key: Word);of TObject;

A = class
public
ProceB: TProc;
procedure PressOtherKey(Key: Word);
end;

B = class
public
procedure PressOtherKey(Key: Word);
end;
...........
var
A1: A;
B1: B;
begin
A1 := A.Create;
B1 := B.Create;
A1.PrcoB := B1.PressOtherKey;
A1.PrcoB() //调用就可以了
end;
 
"a.PressOtherKey := b.PressOtherKey;//这样会抱错,‘Not enough actual parameter’,不明白;"
提示是参数不足啊, 编译器把a.PressOtherKey ,b.PressOtherKey 都解释为函数调用了,
a.PressOtherKey ,b.PressOtherKey 在编译之后就都是指向函数入口地址了,是一个常量,肯定不能赋值的,
 
一定要published的才可以

就比如TForm1的一个OnClick事件可以被赋值一样
 
就是所谓RTTI的东西,

uses
TypInfo;

// 类方法隐藏了第一个参数为对象的 Self (放在EAX中传递)
// 故第一个参数为 Self: TObject
// 第二个参数对应 TNotifyEvent 的参数
procedure Gproc(Self: TObject
Sender: TObject);
begin
ShowMessage('Test');
end;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
M: TMethod
// 方法记录
begin
M.Code := @Gproc
// 指向方法(这里是全局过程)地址
M.Data := nil
// 指向类实例(该值对应着 Gproc 调用时的 Self 参数值,可为任意值,这里传nil)
SetMethodProp(Button1, 'OnClick', M)
// 调用 RTTI 过程,动态设置事件
end;
 
后退
顶部