【问题标题】:Tabbed document interface in DelphiDelphi 中的选项卡式文档界面
【发布时间】:2011-01-16 02:22:48
【问题描述】:

我正在为我的下一个项目考虑不同的用户界面布局,我想知道是否有集成或第 3 方框架允许我创建选项卡式文档界面?

澄清一下,我想要的不是某种对接机制或 MDI 界面,而是主要是一个框架,它允许我拥有一个主窗体和一个或多个辅助窗体,这些辅助窗体将在主窗体内显示为选项卡。

虽然我说我不想要任何类型的对接机制,但我制作了一个实际使用它的小型测试应用程序。我得到的结果非常接近我想要的。首先,我错过了一些功能,例如每个选项卡上的关闭按钮。其次,我必须创建自己的某种框架来自动执行所有任务,例如创建和销毁选项卡、将每个新表单与其选项卡相关联、在相关选项卡关闭时释放表单等等。我并不是说我做不到,但我想知道是否有任何现成的框架已经具备所有这些功能。虽然我更喜欢开源解决方案,但也欢迎商业解决方案。

【问题讨论】:

  • 选项卡界面的问题远不止添加选项卡。那是容易的部分。还有更复杂的,例如以合理的方式添加菜单/工具栏/功能区的合并。
  • 在我的例子中,只有主窗体将包含菜单栏,并且不会与其他窗体的菜单合并,因为那里没有菜单。使用工具栏就不同了。在每个表单中都有额外的工具栏是正常的,因为这些表单将“集成”在主表单中并连接到它的选项卡,这些辅助工具栏将“就在家里”,其功能仅与它们放置的表单相关在。

标签: delphi user-interface delphi-2010 docking tabbed-document-interface


【解决方案1】:

第三方组件在这里不是强制性的。

您可以使用标准的 Delphi 控件来获得您想要的:

  • 在表单上放置一个 TPageControl(从 Win32 选项卡);
  • 将其 Align 属性设置为 alClient;
  • 右键单击控件,然后选择“新建页面”以添加新页面。

那么不要在表单上写你的“标签式”界面,而是在框架上。

您也可以通过代码创建页面,在每个页面内显示框架。

【讨论】:

  • 您有使用 DLL 中的帧的经验吗?我的应用程序是模块化的,每个模块都在不同的 DLL 中。如果我错了,请纠正我,但我认为 Frames 只能在 BPL 中工作。
  • @LightBulb:BPL 是一个 DLL,是分割单体应用程序的首选方式。
  • 你不需要框架来坚持 A.Bouchez 的其他建议。使用您喜欢的任何 wincontrol 作为 DLL 中的通用父级,并使用 setParent 将其放到 TPageControl 上。
  • 我在将表单嵌入到另一个表单中时发现的一个严重问题,尤其是如果它们来自 DLL 时,我会丢失快捷方式(例如在 TAc​​tionList 中)并且似乎存在一些聚焦问题(TAB 是不按顺序将焦点移动到下一个控件)。到目前为止,我还没有找到解决这些问题的方法。我希望我尝试的对接方法不会导致同样的问题。
  • @LightBulb:为什么框架只能在 BPL 中工作?我看不出有任何理由,因为它们是某种 DLL。关于 TActionList 问题,您只需要使用它的一个实例,恕我直言,它将按预期工作。 @Paul-Jan:当然,问题是关于在表单中嵌入一些组件,而不仅仅是一个。这就是我提出框架方法的原因。
【解决方案2】:

我认为标签式界面没有任何框架,但是对于每个标签上带有关闭按钮的漂亮标签/页面控件,请检查以下内容:

  1. rkSmartTabs,它模拟了 Google Chrome 浏览器的标签式 UI。而且它是开源的。
  2. TAdvOfficePager,MS Office 风格。

希望对你有帮助。

【讨论】:

  • rkSmartTabs 组件真的很好看,代码也很清晰!
  • 感谢您推荐两者,它们看起来确实不错,但我必须检查一下我得到的功能。当我这样做时,我会发表另一条评论。
  • rkSmartTabs 看起来不错,而且似乎是一个很好的起点。它在 D2010 中存在一些设计时绘制问题,属性名称不一致,我在 IDE 中安装它时遇到了一些问题,因为作者没有提供任何有关需求的信息,但我现在可以忍受所有这些。我还没有尝试过 TAdvOfficePager。
  • +1 for rkSmartTabs - 可爱的组件,它是免费的,太棒了!
【解决方案3】:

我建议使用工具栏(TToolBar 或任何类似工具)和框架(TFrame)来模拟选项卡式界面,原因?!好吧,Delphi 正在跨平台(这不是什么秘密),他们将移植 Delphi 附带的大部分标准 VCL,如果不是全部,那么 为什么不 将此作为优势?

当用户点击工具栏上的按钮时(动态)创建框架并销毁前一个(如果存在),这样您就可以将内存使用量保持在最低限度,应用程序启动/关闭时间会非常好,在另一方面,如果您选择使用 (cx)TPageControl、TAdvPager 等,您可能会陷入这样一种情况,即一种形式(我怀疑的主要形式)将具有如此多的 VCL,以至于它会占用大量不必要的内存并且它会很慢。

使用框架有很多优点,如果您的应用程序的某个地方需要显示“标签”,您可以简单地动态创建所需的框架并使用它而无需额外工作。

无论如何,这是我的两分钱,希望这会有所帮助。

【讨论】:

  • 我需要一个动态 UI,这意味着我将创建和销毁用户操作的表单/框架。选项卡式 UI 似乎是一个不错的布局。使用 TToolBar 是一种方法,但使用简单的 TTabSet 并将新创建的窗体/框架停靠在主窗体的客户区域内对我来说听起来很简单,因为我可以创建整个框架。关键是我能否找到已经存在的东西。
  • @LightBulb 哦,好吧,我不知道有任何组件接近您的需求,但是我强烈建议您将项目尽可能远离您可以生活的第三方组件,特别是如果您的团队负责人或公司所有者,随着项目的发展,您会明白我的意思。
  • 我很明白你在说什么。我是我公司的团队负责人,我必须决定将哪种方法用于下一个版本的软件。我非常想坚持集成解决方案或使用积极开发的开源组件。如果您确切知道自己需要什么以及如何正确使用它们,那么使用 3rd 方组件并不是那么糟糕。我通常最终制作自己的组件或框架,但能够使用已经存在的东西意味着节省资源。
  • 当 Delphi 跨平台时,AFAIK 它不会使用 VCL。它将使用类似于旧 CLX 的东西。如果您使用 CLX,您会知道您无法获得 VCL 应用程序并将其轻松转换为 CLX 应用程序。
  • @ldsandon 老实说,我没有使用过 CLX,但我很有信心他们至少会提供“导入 VCL 应用程序”选项……至少这是我的众多期望之一:)
【解决方案4】:

我推荐 TvjPageList,它是JVCL 组件套件的一部分。它是开源的,似乎符合您的要求。

【讨论】:

  • 我在此组件中看不到任何选项卡。在我看来,它的行为类似于 TNotebook。
  • @LightBulb:如果它类似于 TNoteBook,那只是意味着您将框架/表单放在 TNotebook 外观下方的主表单的客户区域中。这也意味着您不需要管理 TTabControls 的创建/销毁,否则您将在其上放置框架/表单,因为这是 TPageControl 所要求的。
【解决方案5】:

我使用 JVCL JvDocking 及其选项卡式停靠系统来制作类似 MDI 的应用程序。

除了将它们放在选项卡中之外,您还可以浮动或平铺窗口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2011-12-02
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多