一个功能中把类的对象的指针存入一个数据结构中,出现了内存访问的异常,如果把类换成记录就好了,请问这是什么原因啊?下面是那个类,(是别人写的,不知道为什么非要用类,而不用记录):type
TCard =class(TObject)
  public
    Index       :Integer;
    TPID        :Integer;
    MName       :String;
    MAttr1      :String;
    MAttr2      :String;
    MField      :String;
    MAttr3      :String;
end;procedure TForm1.Button1Click(Sender: TObject);
var
  ActionList :TList;
  ARecord :^TCard;
  Size : integer;
begin
  ActionList := Tlist.Create;
  New(ARecord);  //是不是这里出了问题?
  Size := Sizeof(ARecord^);
  showmessage('ARecord: '+inttostr(Size)); {如果是类,大小是4,错了;如果是记录,大小是28,对的}
  
  ARecord^.Index := 1;
  ARecord^.TPID := 3; //在这里就出现异常了
  ARecord^.MName := '左移';
  ARecord^.MAttr1 := '8000';
  ARecord^.MAttr2 := '2';
  ARecord^.MField := 'LMR';
  ARecord^.MAttr3 := '1500';
  ActionList.Add(ARecord);  New(ARecord);
  ARecord^.Index := 2;
  ARecord^.TPID := 3;
  ARecord^.MName := '下降';
  ARecord^.MAttr1 := '6500';
  ARecord^.MAttr2 := '1';
  ARecord^.MField := 'PTS';
  ARecord^.MAttr3 := '1500';
  ActionList.Add(ARecord);  New(ARecord);
  ARecord^.Index := 3;
  ARecord^.TPID := 7;
  ARecord^.MName := '减速';
  ARecord^.MAttr1 := '8500';
  ARecord^.MAttr2 := '1';
  ARecord^.MField := 'DTS';
  ARecord^.MAttr3 := '1500';
  ActionList.Add(ARecord);
end;
把那个类换成这样的记录就好了,只是把类换成记录
type
  TCard =record
    Index  :Integer;
    TPID   :Integer;
    MName  :String;
    MAttr1 :String;
    MAttr2 :String;
    MField :String;
    MAttr3 :String;
end;
大家帮忙看看,谢谢啊~

解决方案 »

  1.   

    New(ARecord);  //是不是这里出了问题?应该用:
    ARecord.Create;
    吧?
      

  2.   

    结构的话用你的代码没问题
    但是类不能用New,要用TCard.Create
    另外记得不管你是用Record还是Class都要自己释放
    TList不会替你释放
    我一般是自己继承一个TList然后重载Notify方法释放
    D7自己带有一个TObjectList类也会自己释放Item指向的类
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      ActionList :TList;
      ARecord : TCard;
      Size : integer;
    begin
      ActionList := Tlist.Create;
      ARecord := TCard.Create;
      ARecord.Index := 1;
      ActionList.Add(ARecord);
    .....
      

  4.   

    TCard =class(TObject)
    中,其中定义为TCard的对象,已经是指针(引用)了!