我有2个表格。 Form1有一个面板和2个按钮(pnl1,btnShowTree和btnAddItems)。还有Form2,其中包含Treeview(tv1)。
请参阅下面的简短代码,了解这个小小的演示:
procedure TForm1.btnShowTreeClick(Sender: TObject);
begin
with Form2 do
begin
tv1.Items.clear;
Tv1.Items.AddChild(nil, '1.' );
Tv1.Items.AddChild(nil, '2.' );
Tv1.Items.AddChild(nil, '3.' );
Form2.Parent:=pnl1;
Form2.BorderStyle:=bsNone;
Form2.show;
end;
end;
procedure TForm1.btnAddItemsClick(Sender: TObject);
begin
with Form2 do
begin
BorderStyle:=bsSizeable; // here it works wrong
tv1.Items.clear;
Tv1.Items.AddChild(nil, 'A.' );
Tv1.Items.AddChild(nil, 'B.' );
Tv1.Items.AddChild(nil, 'C.' );
// BorderStyle:=bsSizeable; here it works fine. WHY ?????
Form2.Show;
end;
end;
procedure TForm2.btnCloseForm2Click(Sender: TObject);
begin
Parent:=nil;
Hide;
// when I exchange instructions order like:
// Hide;
// Parent:=nil;
// I get the same problem with improperly nested BorderStyle:=bsSizeable; I have
// only blur idea why it is so...
end;
我预计,当我点击btnAddItems时,我会看到3个项目(A. B. C.)。但它会显示6项,因为以前的项目都没有删除!任何人都可以点亮它,因为我在这里坚持了几个小时才能使程序运作良好,但我仍然没有最简单的想法我做错了什么......
答案 0 :(得分:2)
在运行时更改BorderStyle意味着必须销毁并重新创建窗口。这意味着VCL必须存储表单上任何控件的内容(如TTreeView),销毁表单,使用新的BorderStyle创建表单,重新创建表单上的所有控件,然后还原所有内容。
您可能正在使用旧版本的Delphi(请参阅下面的注释),该版本无法从内存中正确删除存储的内容。 @M Schenkel正在使用更新的版本。
当然,解决方案是在运行时停止更改BorderStyle,这将停止导致表单被销毁和重新创建。 :-)我一直在使用Delphi进行编程,从版本1开始,继续使用当前的Delphi 2010,在所有这些时间里,我从来没有需要在运行时更改BorderStyle。
注意:发布Delphi问题时,应始终指出您正在使用的Delphi版本。 Delphi版本的差异意味着VCL的差异,并且这些不同版本中的不同内容可能会导致问题。了解您正在使用的Delphi版本可以更轻松地解决您的问题或回答您的问题。