为什么Treeview.Clear在父表单bordertyle更改失败?

时间:2010-01-26 16:13:32

标签: delphi

我有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项,因为以前的项目都没有删除!任何人都可以点亮它,因为我在这里坚持了几个小时才能使程序运作良好,但我仍然没有最简单的想法我做错了什么......

1 个答案:

答案 0 :(得分:2)

在运行时更改BorderStyle意味着必须销毁并重新创建窗口。这意味着VCL必须存储表单上任何控件的内容(如TTreeView),销毁表单,使用新的BorderStyle创建表单,重新创建表单上的所有控件,然后还原所有内容。

您可能正在使用旧版本的Delphi(请参阅下面的注释),该版本无法从内存中正确删除存储的内容。 @M Schenkel正在使用更新的版本。

当然,解决方案是在运行时停止更改BorderStyle,这将停止导致表单被销毁和重新创建。 :-)我一直在使用Delphi进行编程,从版本1开始,继续使用当前的Delphi 2010,在所有这些时间里,我从来没有需要在运行时更改BorderStyle。

注意:发布Delphi问题时,应始终指出您正在使用的Delphi版本。 Delphi版本的差异意味着VCL的差异,并且这些不同版本中的不同内容可能会导致问题。了解您正在使用的Delphi版本可以更轻松地解决您的问题或回答您的问题。