我2个类之间需要用指针传递。代码大致如下:假设传递 TMyClass自己定义的一个类
PMyClass = ^MyClass;
TMyClass = class
end;TForm1 = class(TForm)
private 
  List: TList;
  fMyClass: TMyClass;
  ....
end;TForm2 = class(TForm)
procedure 
  MyClass: PMyClass;
public
  procedure Add(PMyClass);
  ....
  ....
end;implementation{ Form2 }
procedure TForm2.add(PMyClass);
begin
  MyClass:= PMyClass;
end;
{ Form1 }constructor TForm1.create;
begin
  List:= TList.create;
  List.add(TMyClass.create);//不知道是不是可以这样写。
  fMyClass:= TMyClass.create;
end;destructor TForm1.destroy;
begin
  TMyClass(List.Items[0]).free;
  list.free;
  fMyClass.free;
end;procedure TForm1.Send;
begin
  //传递上面创建的TStringList给另外一个类。
  TForm2.Add(@MyClass);       //在form2里使用不会出错。
  TForm2.add(List.items[0]);  //在form2里使用 MyClass^ 就会出错    TFrom2.add(@TMyClass(List.Items[0]));//编译错误  TMyClass(List.items[0]).string //如果在form1里使用,这样写好像不会出错。
end;请问下为什么用@MyClass在Form2里就可以正常使用。而list.Items[0],即Point类型的就会出错呢。
而用 TMyClass(List.Items[0]) 在form1里却可以正常使用。
不解。
哪位大大指点下小弟。谢谢!

解决方案 »

  1.   

    看来楼主把对象与类混成一团了...如果这样定义变量
      fMyClass: TMyClass;//这儿定义的是一个对象引用(也可以说成是指针,占四字节)
      

  2.   

    Pointer 指针是个变体指针.  
    实际使用时要转换为类型指针.
    例:
    type
     Tb=^integer;
    .....
    Var
     a:pointer;
    .....
    a:=@xxx;//@地址转换符 xxx整数
    Tb(a)^:=xxx;
      

  3.   

    >aClass: TMyClass; 
    aClass是个指针,指向TMyClass的实例
    @aClass是aClass的地址,在C里来说就是指针的指针>@TMyClass(List.Items[0])
    @是对变量取指,而TMyClass(List.Items[0])只是个表达式,不是变量,所以出错。TMyClass(x)是将表达式x转换类型为TMyClass。>TForm2.add(List.items[0]); //在form2里使用 MyClass^ 就会出错 
    TForm2中需要是^TMyClass类型,即指针的指针(指向一个指针,后面的指针指向TMyClass对象实例),而List.items[0]实际上是指向TMyClass对象实例的,类型不一样,当然要出错。--
    http://agui.net.googlepages.com
    mailto: agui.cn @ gmail.com