TTabSet与TTabControl对比TPageCtrl/TTabSheet?

Gul*_*har 16 delphi controls

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

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

谢谢.

Mas*_*ler 23

从TTabSet上的helpfile:

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

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

TPageControl对于您希望在屏幕上放置比屏幕空间更适合的对话框非常有用.将UI组织成类别并将每个类别放在一个页面上.例如,您在"选项"对话框中看到了很多这种模式.

另一方面,TTabControl适用于处理数组/对象列表.创建一个UI来显示和编辑单个对象的属性,并将其放在TTabControl上,然后为每个对象创建一个选项卡并设置事件处理程序,这样它就会在每次你将数组中的新对象加载到控件中改变标签.

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

  • 在编辑相同类型的对象列表的属性时,TTabControl是首选解决方案,因为更改选项卡不会更改您看到的控件,只会更改选项卡索引.页面控件用于一次在表单上放置多页不同的控件.(而吉姆没有写出那个答案;我做了.他对它进行了编辑.) (2认同)

ska*_*adt 5

我已经成功使用的一种方法是使用带有TPageControl的帧,并在第一次选择页面时将我的帧绑定到tPageControl.这样可以缩短表单加载时间,不创建从未查看过的帧,但允许创建的灵活性,在选项卡之间切换时保持状态.最近我转而使用表单并嵌入它们而不是框架...但概念是相同的.

使用TTabControl上的单个"挂载点"并在更改选项卡时将其切换出来也可以完成相同的操作,但是随后也会出现如何处理选项卡状态作为选项卡切换回来的问题.

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

type
  IFormInterface = interface
    [guid]
    procedure FormProc;
  end;

  IFrameInterface = interface
    [guid]
    procedure SetFormController(Intf:IFormInterface);
  end;
Run Code Online (Sandbox Code Playgroud)

有表格实现IFormInterface,框架实现IFrameInterface.单击选项卡并显示框架时,请运行如下代码:

var
  FrameIntf : IFrameInterface;
begin
  if Supports(FrameObj,IFrameINterface,FrameIntf) then
    FrameIntf.SetFormController(Self);
end;  
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)