将标签页动态添加到页面控件并嵌入表单?

Posted

技术标签:

【中文标题】将标签页动态添加到页面控件并嵌入表单?【英文标题】:Dynamically add tab sheets to page control and embed a form? 【发布时间】:2012-08-27 07:49:13 【问题描述】:

我正在开发一个由页面控件组成的模块。默认情况下,此页面控件 (TPageControl) 不应该有任何选项卡表 (TTabSheet),但在初始化时,它应该动态插入这些页面并在其中嵌入一个表单。

问题在于知道如何将标签页插入到页面控件中。我如何创建这个?一旦创建了它以及每个表单中的表单,我如何遍历它们以销毁表单?

【问题讨论】:

【参考方案1】:

1.如何动态创建标签页?

procedure TForm1.Button1Click(Sender: TObject);
var
  TabSheet: TTabSheet;
begin
  TabSheet := TTabSheet.Create(PageControl1);
  TabSheet.Caption := 'New Tab Sheet';
  TabSheet.PageControl := PageControl1;
end;

2.如何在标签页中嵌入表单?

要在选项卡表中插入表单,只需使用父级更改:

Form2.Parent := TabSheet;
Form2.Show;

3.销毁时是否需要手动释放嵌入标签表的表单?

不,释放标签页就足够了。如果表单将有一个标签页,或者更准确地说,TWinControl 作为它们的Parent,则该父级将在释放自身时处理它们的释放。

【讨论】:

我应该担心释放标签页吗?我将如何确保表格免费? 您可以释放标签页,这非常安全。关于那些以标签表为父的表单,它们会在您释放标签表时释放。 控制生命周期的不是所有权而不是父/子吗? @David,好吧,我依赖这个很久了,但这是调试的结果。在TWinControl 析构函数中有类似while ControlCount <> 0 do Controls[ControlCount-1].Destroy; 的(这里简化的)循环。该循环导致所有孩子死亡,所以现在我真的很困惑,如果所有这些答案,说所有者和唯一所有者负责组件销毁是正确的,因为似乎父母关系也是如此。 @TLama Yes (see here),父母也会照顾孩子的毁灭。【参考方案2】:

大卫·赫弗南是对的。

Form2.Parent := TabSheet;
Form2.Show;

此代码仅表示 Form2 的父级是 TabSheet,而不是它的所有者。

您可以像这样创建表单:

Form2 := TForm2.Create(nil);

然后自己释放它。 或者你可以创建一个这样的表单:

Form2 := TForm2.Create(Form1);

Form1 是 Form2 的拥有者,它自己释放后会自动释放 Form2。

【讨论】:

好吧,然后尝试创建表单时发生的情况,将其父级设置为选项卡表,释放选项卡表,然后尝试释放表单。我不是在这里投票,只是说。

以上是关于将标签页动态添加到页面控件并嵌入表单?的主要内容,如果未能解决你的问题,请参考以下文章

利用js动态生成一个简单的商品详情页

以编程方式将控件添加到 WPF 表单

想问一下用html静态页+ajax访问动态页返回数据+js将数据添加到html页面这种方法的可行性

element 动态添加删除标签

RzPageControl(pagecontrol)实现多标签的动态添加,切换,关闭

如何将 Dijit 小部件动态添加到 Dojo 表单?