Delphi 为什么Treeview.Clear在更改父窗体边框样式时失败?

Delphi 为什么Treeview.Clear在更改父窗体边框样式时失败?,delphi,Delphi,我有两张表格。带有一个面板和两个按钮(pnl1、btnShowTree和btnAddItems)的Form1。还有包含Treeview(tv1)的Form2 请参阅下面的简短代码以理解此小演示: procedure TForm1.btnShowTreeClick(Sender: TObject); begin with Form2 do begin tv1.Items.clear; Tv1.Items.AddChild(nil, '1.' ); Tv1.Items.

我有两张表格。带有一个面板和两个按钮(pnl1、btnShowTree和btnAddItems)的Form1。还有包含Treeview(tv1)的Form2

请参阅下面的简短代码以理解此小演示:

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;

我预计,当我点击BtnadItems时,我会看到3个项目(A.B.C.)。但是它会显示6个项目,因为之前的项目不会被删除!!!任何人都可以打开它,因为我在这里花了好几个小时使程序正常工作,但我仍然不知道我做错了什么…

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

您可能使用的是旧版本的Delphi(请参见下面的注释),它无法正确地从内存中删除存储的内容@M Schenkel正在使用一个更高版本

当然,解决方案是在运行时停止更改BorderStyle,这将停止破坏和重新创建表单。:-)我一直在用Delphi编程,从版本1开始,一直到当前的Delphi2010,在这段时间里,我从来没有需要在运行时更改BorderStyle


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

什么版本的Delphi?我创建了一个程序,我的程序运行良好(表单仅显示a、B和C)。我用的是D2007