首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TTabSet与TTabControl还是TPageCtrl/TTabSheet?

TTabSet与TTabControl还是TPageCtrl/TTabSheet?
EN

Stack Overflow用户
提问于 2009-08-17 15:54:00
回答 2查看 16.1K关注 0票数 17

我想知道为什么Delphi (2007)提供了三个似乎做同样事情的小部件,以及每个小部件的优缺点是什么。

在同一主题上,如果我想显示不同的控件集,我为什么要支持例如。PageControl + TabSheets + Frames,而不是直接在父窗体上显示不同的框架?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-17 16:06:41

从TTabSet上的帮助文件:

选项卡集控件通常用于在对话框中显示选项卡式页面。提供TTabSet是为了向后兼容。在32位Windows应用程序中使用TTabControl组件。

所以真正的问题是,TTabControl和TPageControl之间的区别是什么?不同之处在于,TTabControl只有一个“页面”,而TPageControl的每个选项卡都有一个页面。这使得它们在不同的情况下都很有用。

对于想要在屏幕上容纳比屏幕空间更多的UI的对话框,TPageControl非常有用。将UI组织成类别,并将每个类别放在一个页面上。例如,您在选项对话框中经常看到这种模式。

另一方面,TTabControl可以很好地处理对象数组/列表。创建一个UI来显示和编辑单个对象的属性,并将其放在TTabControl上,然后为每个对象创建一个选项卡并设置事件处理程序,以便每当您更改选项卡时,它都会将新对象从数组加载到控件中。

至于框架问题,将TPageControl与框架结合使用的主要原因是,它提供了一种预先构建的方法来决定显示哪个框架。这样你就不必为它重新发明一种机制了。

票数 25
EN

Stack Overflow用户

发布于 2009-08-17 23:00:55

我使用的一种方法非常成功,那就是使用带有TPageControl的框架,并在第一次选择页面时将框架绑定到tPageControl。这使得表单加载时间更短,因为不会创建从未查看过的框架,但允许创建的灵活性,当在选项卡之间更改时,状态将保持不变。最近,我转而使用表单并嵌入表单,而不是frames...but,概念是相同的。

同样可以使用TTabControl上的单个“挂载点”,并在选项卡更改时将其切换出来,但随后也会出现如何在选项卡切换回来时处理选项卡状态的问题。

EDIT问题出现了,我该如何处理框架和父窗体之间的通信。实际上,使用接口很容易做到这一点。只需创建一个将由表单和框架共享的新单元,并添加两个接口:

代码语言:javascript
复制
type
  IFormInterface = interface
    [guid]
    procedure FormProc;
  end;

  IFrameInterface = interface
    [guid]
    procedure SetFormController(Intf:IFormInterface);
  end;

让窗体实现IFormInterface,让框架实现IFrameInterface。当你点击一个标签并显示一个框架,然后运行如下代码:

代码语言:javascript
复制
var
  FrameIntf : IFrameInterface;
begin
  if Supports(FrameObj,IFrameINterface,FrameIntf) then
    FrameIntf.SetFormController(Self);
end;  

然后,SetFormController方法的框架实现将保留传递的引用,这将允许它向上调用表单。

代码语言:javascript
复制
procedure TFrame1.SetFormController(Intf:IFormInterface);
begin
  fFormController := Intf;
end;

Procedure TFrame1.Destroy; override;
begin
  fFormController := nil;  // release the reference
  inherited;
end;

Procedure TFrame1.Button1Click(Sender:tObject);
begin
  if fFormController <> nil then
    fFormController.FormProc
  else
    Raise Exception.Create('Form controller not set');
end;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1288754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档