我想知道为什么Delphi (2007)提供了三个似乎做同样事情的小部件,以及每个小部件的优缺点是什么。
在同一主题上,如果我想显示不同的控件集,我为什么要支持例如。PageControl + TabSheets + Frames,而不是直接在父窗体上显示不同的框架?
谢谢。
发布于 2009-08-17 16:06:41
从TTabSet上的帮助文件:
选项卡集控件通常用于在对话框中显示选项卡式页面。提供TTabSet是为了向后兼容。在32位Windows应用程序中使用TTabControl组件。
所以真正的问题是,TTabControl和TPageControl之间的区别是什么?不同之处在于,TTabControl只有一个“页面”,而TPageControl的每个选项卡都有一个页面。这使得它们在不同的情况下都很有用。
对于想要在屏幕上容纳比屏幕空间更多的UI的对话框,TPageControl非常有用。将UI组织成类别,并将每个类别放在一个页面上。例如,您在选项对话框中经常看到这种模式。
另一方面,TTabControl可以很好地处理对象数组/列表。创建一个UI来显示和编辑单个对象的属性,并将其放在TTabControl上,然后为每个对象创建一个选项卡并设置事件处理程序,以便每当您更改选项卡时,它都会将新对象从数组加载到控件中。
至于框架问题,将TPageControl与框架结合使用的主要原因是,它提供了一种预先构建的方法来决定显示哪个框架。这样你就不必为它重新发明一种机制了。
发布于 2009-08-17 23:00:55
我使用的一种方法非常成功,那就是使用带有TPageControl的框架,并在第一次选择页面时将框架绑定到tPageControl。这使得表单加载时间更短,因为不会创建从未查看过的框架,但允许创建的灵活性,当在选项卡之间更改时,状态将保持不变。最近,我转而使用表单并嵌入表单,而不是frames...but,概念是相同的。
同样可以使用TTabControl上的单个“挂载点”,并在选项卡更改时将其切换出来,但随后也会出现如何在选项卡切换回来时处理选项卡状态的问题。
EDIT问题出现了,我该如何处理框架和父窗体之间的通信。实际上,使用接口很容易做到这一点。只需创建一个将由表单和框架共享的新单元,并添加两个接口:
type
IFormInterface = interface
[guid]
procedure FormProc;
end;
IFrameInterface = interface
[guid]
procedure SetFormController(Intf:IFormInterface);
end;让窗体实现IFormInterface,让框架实现IFrameInterface。当你点击一个标签并显示一个框架,然后运行如下代码:
var
FrameIntf : IFrameInterface;
begin
if Supports(FrameObj,IFrameINterface,FrameIntf) then
FrameIntf.SetFormController(Self);
end; 然后,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;https://stackoverflow.com/questions/1288754
复制相似问题