2010-01-26 74 views
2

我有2種形式。 Form1帶有一個面板和2個按鈕(pnl1,btnShowTree和btnAddItems)。還有Form2包含Treeview(tv1)。爲什麼Treeview.Clear在父窗體邊框樣式更改上失敗?

請參閱下面的短代碼,瞭解這個小演示:

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

什麼版本的Delphi?我創建了一個程序,我的工作正常(表格只顯示A,B和C)。我正在使用D2007 – 2010-01-27 16:06:35

+0

我使用德爾福7 – lyborko 2010-01-28 15:24:57

回答

2

在運行時更改BorderStyle意味着窗口有被銷燬並重新創建。這意味着VCL必須存儲表單上的任何控件的內容(如TTreeView),銷燬表單,使用新的BorderStyle創建表單,重新創建表單上的所有控件,然後恢復所有內容。

您可能正在使用Delphi的舊版本(請參閱下面的註釋),該版本未正確從內存中刪除存儲的內容。 @M Schenkel正在使用一個更高版本。

當然,解決方案是停止在運行時更改BorderStyle,這將停止導致窗體被銷燬和重新創建。 :-)我從Delphi開始編寫Delphi,並繼續使用當前的Delphi 2010,在那段時間裏,我從來沒有需要在運行時更改BorderStyle。

注意:發佈Delphi問題時,您應該始終指出您使用的Delphi版本。 Delphi版本中的差異意味着VCL中的差異,並且這些不同版本中的不同內容可能會導致問題。知道你使用的是什麼版本的Delphi可以解決你的問題或者更容易地回答你的問題。

+0

非常感謝...越來越聰明;-) 我正在使用Delphi 7 ... – lyborko 2010-01-28 15:24:27