【问题标题】:Delphi: Managing multiple instances of TFramesDelphi:管理多个 TFrame 实例
【发布时间】:2011-06-12 13:49:02
【问题描述】:

this article 中解释了如何在 Delphi PageControl 中使用 TFrames 作为 TTabSheets 的替代方法。

我一直在思考一个类似的练习,上面似乎没有提供解决方案,而且我的解决方案似乎过于复杂。

要求是选项卡式界面,其中每个选项卡都可以是多种不同设计之一。每个设计都作为 TFrame 实现。

由于正在设计的应用程序的性质,我们可能会在任何特定时刻打开任何框架的多个副本(每个选项卡的内容不同,但设计不一样),以便用户可以比较 2 /3 个不同的项目同时进行。

例如,在一个会话中,我们可能打开了 3 个选项卡,全部为框架设计 A。 在另一种情况下,我们可能会分别打开 Frame A、B 和 C 的 3 个选项卡。

设计需要足够灵活,以便我们可以根据要求将框架添加到设计中。

目前我的解决方案是让单独的 TLists 管理我们打开的每种类型的 Frame,也许还有一个主 TList 来跟踪打开的选项卡。正如我所说,过于复杂。

有没有人建议如何更简单地处理这个问题?

【问题讨论】:

  • 我没有得到管理的要求。特定帧的副本是不同的实例,对吗?所以有什么问题? IOW,你的 list 服务于什么?
  • 这就是我喜欢 SE 的原因 :) 太沉迷于更大的概念而无法减少它。 Sertac,您能否将其发布为答案,以便我接受:)
  • 我不可能从一堆问题中找出一个合理的答案。 ;) 如果现有的都不能满足这个问题,请自己提供一个答案,你最了解你的设计..

标签: delphi tframe


【解决方案1】:

我们使用 TPageControl 并创建运行时 TTabSheet 后代,它具有我们自己的 TFrame 的新属性(我们不需要每次都扫描 .Controls 或 .Components 来搜索我们的框架)。

【讨论】:

    【解决方案2】:

    我有一个应用程序,它使用我自己的菜单控件来管理单个面板上的框架,以控制哪个框架可见。当我需要使框架可见时,我只需为面板上的每个框架设置 visible:=false ,但我想要的框架除外。我可以控制面板上的内容,因此我知道至少每个控件都是一个 Tframe,并且我可以通过遍历面板的 Controls 属性来访问每个帧。然后我使用接口在我的主窗体和我的框架之间进行通信。

    现在,如果您想使用标准的 Windows 选项卡式界面,您仍然可以按照您的建议使用页面控件,您知道每个 TtabSheet 上都有一个 Tframe,您可以检查它的类型并根据需要使用它。我不明白您为什么需要 Tlist,因为如果您真的需要获取“Tframe 列表”,则无论如何都可以通过迭代页面控件中的 TtabSheets 来动态构建它。

    与我的第一种方法类似,但可以为您提供漂亮的 Windows 选项卡的另一种方法是使用 TtabControl 而不是 TpageControl。使用 TtabControl,您基本上只需获得一个代表所有选项卡的 Tstrings 实例(在 Tabs 属性中)。由于它是一个 Tstrings,您可以将一个对象(即您的 Tframe)与每个项目以及每个选项卡相关联。当您单击一个选项卡时,您会隐藏所有内容并显示正确的 Tframe。您还拥有您的列表,因为它通过 Tabs 属性附加到 TtabControl。您只需要自己处理框架的可见性。

    【讨论】:

    • 如果我对每种类型的 Frame 只有一个实例,那将是有意义的。例如,如果我有 3 个框架设计(A、B 和 C)和三个打开的​​选项卡,它们可能是 AAA、BBC、ABC 等。我在设计时不知道每个框架有多少是打开的......
    • 我在设计时也没有我的框架。只需动态创建框架,为所选场景适当地设置父级并将对齐设置为 alClient。对于每个场景,您仍然可以遍历父/页面并找到您的框架。我想正如其他人所暗示的那样,没有必要维护一个(或多个)列表。我只是想提供几种不同的方法来实现相同的目标。
    【解决方案3】:

    我可能会省略框架实例的主 TList。

    如果您需要它们,您可以通过直接询问 TPageControl 或通过每个帧类型的每个单独的 TList 来获取它们。

    除此之外,您的方法听起来很合理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 2010-10-11
      相关资源
      最近更新 更多