type
  TDerived=class
    public 
       function mymethod2;boolean;
    end;
var
  p:pointer;
begin
  [red]p:=pointer(@TDerived.mymethod2); 
   与 p:[email protected]有何区别?[/red] 我试着用二种形式运行程序,结果都是一样的。
还请指点其中的区别,谢谢!

解决方案 »

  1.   

    p:=pointer(@TDerived.mymethod2);//---1 
    p:[email protected]//---2这两句代码都是取地址的操作。只是第一句中加入了一句强制类型转换。
    其实用取址操作符@取出地址就可以了,这与你所定义的变量类型POINTER有关。
      

  2.   

    是呀,我也是这样想的,pointer类型本身就是存储地址的,@操作符就是取出变量或方法的地址,直接就可以赋值给pointer类型的变量,弄不明白为何p:=Pointer(..)要加上pointer强制转换。
      

  3.   

    p:=pointer(@TDerived.mymethod2); //取得TDerived.mymethod2的地址,将该地址强制转换成Pointer类型
     p:[email protected]//直接把函数地址赋给p其实没什么变化
      

  4.   

    p:=pointer(@TDerived.mymethod2); 
    多此一举就象这样一样 p:=Pointer(Pointer(pointer(@TDerived.mymethod2)))); @TDerived.mymethod2 的返回值本来就是 Pointer 类型的。
      

  5.   

    对最终结果来说加不加pointer没有区别,但对写代码时还是有一定作用的,如果不加pointer(..)时你输入@TDerived.后IDE中多半不会弹出TDerived中的方法/属性列表(或者弹出列表中的把你需要的东西给过滤掉了),但前面加了‘pointer(’就大不一样了,IDE里能正确弹出TDerived的所有属性/方法/变量列表。
    特别适用于你不熟悉TDerived中有点什么(或者记不清需要的那个方法/属性/变量名字又不想查帮助或根本没有帮助可查)的时候。