2012-04-16 82 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