我定义了如下一个指针。
PTTriList=^TTriList;
  TTriList=RECORD
    GUIDInt:LongWord;
    RImage:TRotateImage;
    Flage:Byte;
  End;
定义了一个list
TRIList:TList;
我用如下函数操作这个list
function TMainWindow.AddNode(WControl: TWinControl):Integer;
//添加一条横线条到list中。
var
  GUID:TGUID;
  TempTTriList:PTTriList;
  TempInt:Integer;
Begin
  if(TRIList=nil) then Begin
    TRIList:=TList.Create;
    TRIList.Clear;
  End;
  CreateGuid(GUID);
  GetMem(TempTTriList,Sizeof(PTTriList));
  TempTTriList^.RImage:=TRotateImage.Create(WControl);
  TempTTriList^.RImage.Parent:=WControl;
  TempTTriList^.GUIDInt:=GUID.D1;
  TempTTriList^.RImage.Name:='Image'+intToStr(GUID.D1);
  TempTTriList^.Flage:=1;
  TempTTriList^.RImage.PopupMenu:=PopupMenu8;
  TempTTriList^.RImage.OnDblClick := RotateImage1DblClick; //鼠标双击事件
  TempTTriList^.RImage.OnMouseDown := RotateImage1MouseDown; //鼠标 OnMouseDown事件
  TempTTriList^.RImage.OnMouseMove := RotateImage1MouseMove; //鼠标OnMouseMove事件
  TempTTriList^.RImage.OnMouseUp := RotateImage1MouseUp;//鼠标OnMouseUp事件
  TempTTriList^.RImage.Tag:=TRIList.Count;
  TempInt:=TRIList.Add(TempTTriList);
  Result:=TempInt;
End;function TMainWindow.DeleteNode(IndexInt:Integer):Integer;
//删除一条横线
Begin
  if(TRIList=nil) Then Exit;
  if(TRIList.Count=0) Then Exit;
  PTTriList(TRIList.Items[IndexInt])^.RImage.Free;
  PTTriList(TRIList.Items[IndexInt])^.RImage:=nil;
  //FreeMem(TRIList.Items[IndexInt], Sizeof(PTTriList));
  TRIList.Delete(IndexInt);
End;function TMainWindow.GetNode(IndexInt:Integer):PTTriList;
//
//获取一个指定位置的线条
Begin
  Result:=PTTriList(TRIList.Items[IndexInt]);
End;在删除一个节点后,DeleteNode,退出程序提示:Invalid pointer operation
不退出依然可以删除下个,退出就提示这个错误。
我在获取一个节点后,GetNode,发现RImage为nil,而Flage和guid却有值。
请问各位高手,我错在哪里?是不是addnode函数中,创建timage方式不对?

解决方案 »

  1.   

    增加结点:
      New(TempTTriList);
      TempTTriList^.…… := ……;
      TempTTriList^.RImage := …….Create(nil);
      ……;
      TRIList.Add(TempTTriList);
    删除结点:
      FreeAndNil(TempTTriList^.RImage);
      Dispose(TempTTriList);
      TRIList.Delete(i);
      

  2.   

    function TMainWindow.DeleteNode(IndexInt:Integer):Integer;
    //删除一条横线
    Begin
      if(TRIList=nil) Then Exit;
      if(TRIList.Count=0) Then Exit;
      PTTriList(TRIList.Items[IndexInt])^.RImage.Free;
      PTTriList(TRIList.Items[IndexInt])^.RImage:=nil;
      FreeMem(TRIList.Items[IndexInt], Sizeof(PTTriList));//或者用Dispose(TRIList.Items[IndexInt])
      TRIList.Delete(IndexInt);
    End;