2012-04-16 42 views
0

我有一個TPageControlTTabSheet。並在那TTabSheet我有一堆功能和組件。我想在運行時通過一個按鈕來複制那個tabSheet,其中所有的功能和組件仍在工作。如何動態複製選項卡?

現在我設法複製標籤頁。但是,新的標籤頁完全是空的。

這是我的那個按鈕的代碼。

TTabSheet * NewTabSheet= new TTabSheet(pageControlMain); 
NewTabSheet->PageControl = pageControlMain; 
NewTabSheet->Caption = "TabSheet"; 
pageControlMain->ActivePage = NewTabSheet; 

我錯過了什麼?

至於TTabSheets內部的組件和功能,它們只是滾動框,編輯框,按鈕和麪板。

+1

也許你需要克隆表內的對象? – CharlesB 2012-04-16 18:27:35

+0

我在想同樣的事情,因爲我動態地完成了一個tframe的重複,並且組件和函數最終仍然工作。不過,標籤頁有點不同。我試圖用與tframes相同的方式複製它,但它不起作用。標籤頁中沒有任何內容會被重複。 MB我需要把所有的標籤頁放在一個tframe上,並將tframe添加到新的標籤頁上?你會如何建議我去做這件事? – livelaughlove 2012-04-16 19:13:57

+0

是的,將'TFrame'放在'TTabSheet'上將是一個很好的解決方案。 – 2012-04-18 04:18:38

回答

1

TTabSheet類本身沒有任何子控件,這就是爲什麼你什麼都看不到。您必須實例化每個單獨的控件並複製其數據。要做到這一點

一種方法是使用TStream.WriteComponent()TStream.ReadComponent()方法源TTabSheet保存到一個臨時DFM,然後是加載到新TTabSheet,如:

TMemoryStream *Strm = new TMemoryStream; 
Strm->WriteComponent(SourceTabSheet); 
Strm->Position = 0; 
TTabSheet *NewTabSheet = new TTabSheet(pageControlMain); 
NewTabSheet->PageControl = pageControlMain; 
Strm->ReadComponent(NewTabSheet); 
pageControlMain->ActivePage = NewTabSheet; 
delete Strm; 

另一種選擇是把你的組件到在設計時TFrame派生類,然後在運行時創建類的實例,並將其放置到每個TTabSheet,讓它處理控制你,例如:

TTabSheet *NewTabSheet = new TTabSheet(pageControlMain); 
NewTabSheet->PageControl = pageControlMain; 
TMyFrame *NewFrame = new TMyFrame(NewTabSheet); 
NewFrame->Parent = NewTabSheet; 
pageControlMain->ActivePage = NewTabSheet; 
+0

在這裏你再次拯救我! ty = D – livelaughlove 2012-04-18 13:39:13

+0

我不明白爲什麼這個工作。我在一個表單上試過這個,它不起作用,因爲這些子組件的名稱保持不變,並且不能創建兩個具有相同名稱的組件。柏林的這種行爲有所改變嗎? – 2017-03-23 08:24:12

+1

@MikeVersteeg同一所有者中的兩個組件不能具有相同的名稱。我展示的兩種方法創建一個新的所有者,所以沒有重複。如果你寫一個表單到DFM,然後再讀回到同一個Form對象中,那麼是的,你最終會得到重複的結果。 – 2017-03-23 14:34:51