为什么删除一个TreeView的子节点总是报错啊?请大侠看看问题出在哪里?
var
i,j,k : integer;
RootItem : TTreeNode ;
begin
RootItem := nil;
for i := 0 to tvCamera.Items.Count -1 do
begin
if integer(tvCamera.Items[i].Data) = intStationHandle then
begin
RootItem := tvCamera.Items[i];
RootItem.DeleteChildren;
RootItem.Delete;
end;
end;
end;
var
i,j,k : integer;
RootItem : TTreeNode ;
begin
RootItem := nil;
for i := 0 to tvCamera.Items.Count -1 do
begin
if integer(tvCamera.Items[i].Data) = intStationHandle then
begin
RootItem := tvCamera.Items[i];
RootItem.DeleteChildren;
RootItem.Delete;
end;
end;
end;
for i := 0 to tvCamera.Items.Count -1 do
改为
for i := tvCamera.Items.Count -1 downto 0 do或者
i := 0;
while(i<tvCamera.Items.Count)do
begin
if integer(tvCamera.Items[i].Data) = intStationHandle then
begin
RootItem := tvCamera.Items[i];
RootItem.DeleteChildren;
RootItem.Delete;
end
else inc(i);
end;
var
i,j,k : integer;
RootItem : TTreeNode ;
label
loop;
begin
loop:
RootItem := nil;
for i := 0 to tvCamera.Items.Count -1 do
begin
if integer(tvCamera.Items[i].Data) = intStationHandle then
begin
RootItem := tvCamera.Items[i];
RootItem.DeleteChildren;
RootItem.Delete;
Break; ///////////////////////////////////////////////
end;
end;
end;否则,可以考虑:
var
i,j,k : integer;
RootItem : TTreeNode ;
begin
RootItem := nil;
for i := 0 to tvCamera.Items.Count -1 do
begin
if integer(tvCamera.Items[i].Data) = intStationHandle then
begin
RootItem := tvCamera.Items[i];
RootItem.DeleteChildren;
RootItem.Delete;
goto loop;////////////////////////////////////////////
end;
end;
end;
var
i,j,k : integer;
RootItem : TTreeNode ;
begin
RootItem := nil;
for i := 0 to tvCamera.Items.Count -1 do
begin
if integer(tvCamera.Items[i].Data) = intStationHandle then
begin
RootItem := tvCamera.Items[i];
RootItem.DeleteChildren;
RootItem.Delete;
Break; ///////////////////////////////////////////////
end;
end;
end;否则,可以考虑:
var
i,j,k : integer;
RootItem : TTreeNode ;
label
loop;
begin
loop:
RootItem := nil;
for i := 0 to tvCamera.Items.Count -1 do
begin
if integer(tvCamera.Items[i].Data) = intStationHandle then
begin
RootItem := tvCamera.Items[i];
RootItem.DeleteChildren;
RootItem.Delete;
goto loop;////////////////////////////////////////////
end;
end;
end;
Delete(i)这样肯定会出错了。for i:=L downto 0 do
Delete(i)这样才行,for 循环删除列表都要倒着来。要不就用 While 循环因为 Count 只会在开始的时候计算一次的
而且就算你使用DELETE(0),因为每次删除都要修改指针,效率也要低下,不如倒序删除效率高。
Delete(i)
新建一个工程,使用相同的代码,没有出现内存错误。真是奇怪得很,在节点建立上也没有发现什么问题。在工程中,我是使用了data属性,用来保存一些数据。可以我将data设置为nil问题依然存在。
var
i,j : integer;
RootItem : TTreeNode ;
begin
for i := tvCamera.Items.Count -1 downto 0 do
begin
if integer(tvCamera.Items[i].Data) = intStationHandle then
begin
RootItem := tvCamera.Items[i];
for j := 0 to tvCamera.Items.Count -1 do
if tvCamera.Items[i].Parent = RootItem then tvCamera.Items[i].Data := nil;
RootItem.Data := nil;
RootItem.Delete;
Result := 1;
break;
end;
end;
这样能销毁对象么?你需要自己去销毁,DELPHI不是VB,也不是.NET。
tvCamera.Items[i].Data := nil;这里我不是要删除什么对象。data属性是一个无类型的指针,我原来指向的是一块内存空间,这里只是把指针置空。