首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Delphi 中使用TList的有关问题

2012-03-28 
Delphi 中使用TList的问题。我定义了如下一个指针。PTTriList^TTriListTTriListRECORDGUIDInt:LongWordR

Delphi 中使用TList的问题。
我定义了如下一个指针。
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方式不对?


[解决办法]

Delphi(Pascal) code
增加结点:  New(TempTTriList);  TempTTriList^.…… := ……;  TempTTriList^.RImage := …….Create(nil);  ……;  TRIList.Add(TempTTriList);删除结点:  FreeAndNil(TempTTriList^.RImage);  Dispose(TempTTriList);  TRIList.Delete(i);
[解决办法]
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;

热点排行