过程类型: Type
TMyProc=Procedure(X:Integer) of Tobject;
procedure Tform1.Proc(X:Integer); //都已声明,这是实现部分
begin
X:=X*2;
showmessage(inttostr(X));
end;procedure TForm1.button1click(sender:Tobject);
var
F:TMyProc;
begin
F:=Proc;
showmessage(Tobject(F).classname); -------为什么这里不能通过指针强制转换成它所属对象了.
end;
TMyProc=Procedure(X:Integer) of Tobject;
procedure Tform1.Proc(X:Integer); //都已声明,这是实现部分
begin
X:=X*2;
showmessage(inttostr(X));
end;procedure TForm1.button1click(sender:Tobject);
var
F:TMyProc;
begin
F:=Proc;
showmessage(Tobject(F).classname); -------为什么这里不能通过指针强制转换成它所属对象了.
end;
普通得全局函數(非成員函數指針)只是一個函數得地址而已
而成員函數指針還包括一個對對象地引用...那你想想Tobject(F)這個是怎麼轉換那...F不是一個類地對象呀。。或者不僅僅是。。他們在概念上根本就不同了
自然轉換失敗
大龙驹老师:我以前听说在过程类型声明时加 of object;后,这个过程类型的变量除了是指向该方针的指针外,还包括指向该方法所属对象。我问就是怎么得到它所属的对象.在这里得到是Classname
var
p: MyMemberProcPtr;
p1: Pointer;
begin
p := Self.Button1Click;
P1 := Pointer(Integer(@p) + 4);
ShowMessage(TObject(p1).ClassName);
end;有空給你看看
MyMemberProcPtr = procedure(Sender: TObject) of object;
var
Proc: MyMemberProcPtr;这样相当于定义了一个结构:
struct tagMyMemberProcPtr
{
DWORD pointer; // 成员函数的地址
DWORD sefl; // 对象的地址
};
而 Proc 是一个指向tagMyMemberProcPtr的指针。
然后:@Proc 得到 pointer,而 @@Proc 得到指针 Proc 所代表的地址。
测试:
procedure TForm1.Button2Click(Sender: TObject);
var
p: MyMemberProcPtr;
p1: PCardinal;
begin
p := Button1Click;
P1 := PCardinal(@@p);
// P1 := Pointer(Integer(@@p) + 4); // OK --> Addr of Button1Click
Inc(P1);
ShowMessage(TObject(p1^).ClassName); // OK --> TForm1
end;
这一句是错的。应该是:
@p = Addr of Button1Click = PCardinal(@@p)^。