过程类型:     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;

解决方案 »

  1.   

    F是一個函數指針 而且是一個成員函數指針
    普通得全局函數(非成員函數指針)只是一個函數得地址而已
    而成員函數指針還包括一個對對象地引用...那你想想Tobject(F)這個是怎麼轉換那...F不是一個類地對象呀。。或者不僅僅是。。他們在概念上根本就不同了
    自然轉換失敗
      

  2.   

    谢谢
    大龙驹老师:我以前听说在过程类型声明时加  of object;后,这个过程类型的变量除了是指向该方针的指针外,还包括指向该方法所属对象。我问就是怎么得到它所属的对象.在这里得到是Classname
      

  3.   

    恩 我現在還不清楚 這個member method ptr地內存布局 我剛這麼測試 不對。。MyMemberProcPtr = procedure(Sender: TObject) of object;procedure TForm1.Button2Click(Sender: TObject);
    var
      p: MyMemberProcPtr;
      p1: Pointer;
    begin
      p := Self.Button1Click;
      P1 := Pointer(Integer(@p) + 4);
      ShowMessage(TObject(p1).ClassName);
    end;有空給你看看
      

  4.   

    在 Delphi 6 里:
    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;
      

  5.   

    //  P1 := Pointer(Integer(@@p) + 4);      // OK --> Addr of Button1Click
    这一句是错的。应该是:
    @p = Addr of Button1Click = PCardinal(@@p)^。
      

  6.   

    OK..3x樓上的..把內存佈局講解清楚了...樓主結帖把,分全給樓上的兄弟.