【问题标题】:Delphi IDE treating TFrame as if it were a FormDelphi IDE 将 TFrame 视为表单
【发布时间】:2010-10-10 00:36:15
【问题描述】:

每隔一段时间,当我调整我的 TFrame 类(添加属性、方法等)时,IDE 就会感到困惑,并表现得好像它认为框架是一个表单,包含标题/标题、边框等。然而,显然该类被声明为 TFrame 后代。关于导致这种情况的原因,如何预防以及如何解决的任何想法?

我使用的是 Delphi 2007 Pro。另请注意(如果重要的话),TFrame 后代通常通过设计时包在 IDE 中注册(即在调色板上)。


稍后:其他“细节”:我目前遇到此问题的框架在视觉上是一个非常基本的 TFrame(与全新 TFrame 相比的唯一变化是尺寸和背景颜色)。

这是它的类声明:

TBasePanel = class(TFrame)
  private
    FPanelManager: TPanelManager;
    procedure SetPanelManager(const Value: TPanelManager);
  protected
    procedure Connect; virtual; abstract;
    procedure Disconnect; virtual; abstract;
    procedure Refresh; virtual;
    procedure Requery; virtual; abstract;
  published
    property PanelManager: TPanelManager read FPanelManager write
        SetPanelManager;

这个框架被用作许多其他框架的基类。我通常直接从它所属的 BPL 项目编辑它(因为所有这些框架都安装到调色板),而不是作为 EXE 项目的一部分,打开相关的表单等。

此外,在工具 -> 选项中选中了“嵌入式设计器”。

我也将所有 DFM 文件保存为文本而不是二进制文件(如果这很重要的话)。

【问题讨论】:

  • 只是对此的更新:答案似乎是下面的 birger 答案的组合加上创建一个“基本框架类”,它与普通 TFrame 没有任何变化,然后在添加任何之前从它继承属性、方法等。似乎以某种方式稳定了继承流。

标签: delphi inheritance ide tframe


【解决方案1】:

我也遇到了同样的问题。以下步骤为我们解决了问题,它也可能对您有用:

  1. 在 IDE 中:关闭所有使用框架的表单
  2. 打开框架,以文本形式查看 (*.dfm)
  3. dfm 可能以对象 MyFrame: TMyFrameClass 开头
  4. 将此更改为继承的 MyFrame:TMyFrameClass

我不知道是什么导致了问题。

【讨论】:

  • 这似乎适用于祖先类,但有时我仍然会遇到“根”类(从 TFrame 下降的那个)的问题。那个“第一个”应该是“对象”,对吧?
  • 我不确定,在我遇到这个问题的项目中,所有帧都以'inherited MyFrame:TMyFrame'开头。我们使用的 TFrame 的第一个后代没有 dfm,所以我无法检查 dfm 中应该有什么。
  • 有趣!我没有想过让那个“第一个”TFrame 后代完全没有 DFM。这可能会消除我怀疑的“基本 TFrame”问题。嗯...感谢您提供的信息。将尝试这种方法!
  • 我的英雄!谢谢!你刚刚结束了几个小时毫无意义的漏洞搜寻。 ;) 我完全没有注意到 DFM 的变化。如果文件已经在版本控制之下,可能会更容易发现......
【解决方案2】:

也许您没有选中“嵌入式设计器”复选框? (工具 | 选项 | 环境选项 | VCL 设计器)。然后,确实,您的框架在设计时显示为一种形式(带有标题、边框等)。您有问题的 TFrame 后代的具体代码或有关您的案例的更多详细信息也会有所帮助。

【讨论】:

    【解决方案3】:

    据我所知,在编辑框架时,您必须在编辑器中同时打开表单和框架。否则可能会出现更新问题。虽然我没见过这个。

    但我很久以前就放弃了框架,因为我发现它们不太可靠。

    现在我只将它们用于原型设计,创建自定义组件(派生自带有适当控件的面板)。

    【讨论】:

      【解决方案4】:

      You may have to register custom module to the IDE 但是除非它们在祖先类中,否则您的附加属性将无法正常工作。

      【讨论】:

      • 即使整个基于框架的组件是通过设计包注册的,您还需要这样做吗?它很好地显示在调色板上,并且已发布的属性显示在检查器中。它确实“失去了它的框架行为”,但这实际上是我想要的。不遵循它的作用。
      • 这与将其注册为常规组件无关。您可能需要注册自定义模块才能获得适当的设计器特定行为。我仍然不确定,因为 ide 在设计时如何处理 Tframe 对程序员来说并不透明。但我认为值得一试。
      【解决方案5】:

      我在使用 TFrame 时遇到了很多问题,最终找到了解决我所有问题的解决方法:我直观地创建和设计框架,但只能通过手动编码来使用它们。

      由于 dfm-s 更少,我的应用程序变得更小了。

      【讨论】:

        猜你喜欢
        • 2012-07-02
        • 2013-09-28
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        • 2011-06-12
        • 2016-02-14
        相关资源
        最近更新 更多