【问题标题】:How to debug or fix "Module has open descendants or linked modules" error?如何调试或修复“模块已打开后代或链接模块”错误?
【发布时间】:2014-12-18 23:33:27
【问题描述】:

我一直有这个问题,我不能将我继承的项目的主要表单视为文本。即使没有其他表单打开。

如何调试此错误消息的原因?我有什么选择来解决它?

我找到了一篇相关的新闻组帖子http://embarcadero.newsgroups.archived.at/public.delphi.ide/200906/0906193960.html,但这仅解决了表单继承问题,并没有解释任何有关链接模块的内容。我不相信我在使用表单继承。

我确实有一个项目的 DM(数据模块),并且表单确实通过表单上的 TTreeView 的属性从 dm 加载了几个图像——具有数据模块是否自动意味着我永远无法查看在 Delphi 中给表单发送文本(除了在记事本中将表单作为文本查看)?我的 DM 在 IDE 中是打开还是关闭似乎并不重要。

我还发现了一个带有相关标题 (Module %s has open descendants or linked modules. can not reload) 的 SO 问题,但问题本身及其答案并不特别相关。

【问题讨论】:

  • 你不能做一个最小的复制吗?事实上,如果你这样做了,我预测你会自己解决问题。当您减少代码和组件时,您会发现问题消失了。因此,您剥离的最后一件事是关键。这是必须学习的调试技能。隔离问题。
  • 我会尝试做一个最小的复制。但我仍然想了解该错误的含义,因为我尚未成功找到有关此错误的任何官方文档;-)

标签: delphi delphi-xe4


【解决方案1】:

这有时是由从项目(或库)中的另一个表单继承的表单引起的(在文档中称为 Visual Form Inheritance,IIRC)。 IDE 不知道如何找到表单的基类;它需要在后代表单之前打开。例如,如果包含 TMyBaseForm 的单元没有在 IDE 中首先打开,这可能会导致相同的错误,特别是如果基础(祖先)单元没有首先包含在项目中:

unit SpecialForm;

interface

uses
  Forms, { all the other usual stuff }, BaseForm;

type
  TMySpecialForm = class(TMyBaseForm)
  private

  public

  end;

您可以通过查看表单的类声明来判断是否是这种情况 - 如果它源自 TForm 以外的任何内容,这可能是错误的原因。

(另一种情况经常发生在使用数据模块时,因为基础TDataModule .DFM 不可用。尝试以文本形式查看数据模块.DFM 每次都会导致此错误;解决方案是关闭您的项目并使用记事本或 Notepad++ 等外部编辑器来编辑数据模块的 .dfm。)

【讨论】:

  • 嗯...我能够验证我的表单直接扩展了 TForm,中间没有基类,而且 Forms 肯定在 uses 子句中...所以我仍然倾向于怀疑在我的情况下,继承不是原因。关于“链接模块”的任何指针可能导致此错误?
  • 不,抱歉。这是我遇到过这个问题的唯一原因(这就是我写“有时”而不是“原因是”的原因)。您是否在相关单元的项目文件(项目->查看源代码)中缺少一行?它应该类似于uses Forms, Unit4 in 'Unit4.pas' {Form4}; - 请注意最后{} 中的部分。那是您遇到问题的表格的礼物吗? (如果您发布一些我们可以看到的代码或相关细节,这将那么容易得多,而不必推测您可能拥有或可能没有什么。)
  • 另外,如果您从记事本打开有问题的 .dfm,该 .dfm 中的第一行是什么意思?它应该是 object Form4: TForm4(当然,在这两种情况下都用表单的名称和类替换 Form4)。
  • 其实问题不在于找不到base。而是IDE已经打开了基础。而后裔开放。该错误告诉您由于后代已打开,您无法修改基础。
  • @David:实际上,没有。 IDE 很困惑,因为它认为您已将其打开,但实际上并未打开。 (如果是,你可以在编辑器选项卡中找到它并关闭它,但你不能。)正如我所说,我以前经历过这种情况(事实上,就在几分钟前,一个数据模块显然没有IDE 中加载的祖先)。
【解决方案2】:

我偶尔会遇到这个问题,也许是在我使用框架时,但我的最新实例不涉及框架、数据模块或继承的表单。

经过大量工作创建表单副本(该副本没有问题)并重命名原始单元和表单本身(最初似乎解决了问题),结果证明这是一个表单之间的实时绑定。

具体来说,在我的 FMX 应用程序中,Form A 有一个带有 TSpinBox 的选项页面,允许用户在 Form B 上设置 TTrackBar 的最小值(这是让我感到悲伤的表单)。因此 TSpinBox.Value 设置为通过实时绑定更新 TTrackBar.Min 字段。关闭表单 A,或移除该实时绑定(并用事件处理程序替换它来做同样的事情)解决了这个问题。

【讨论】:

    【解决方案3】:

    我想请求 Phillip J. Rayment 和 ADD 的回答,即您不必进行实时绑定即可出现此问题。拥有自定义控件(类)就足够了,您在该控件(类)中拥有另一种形式的实例。然后可能会出现 RLink32 问题,并且在您关闭拥有实例的表单之前无法解决。我遇到的问题给出了以下消息: -RLink32 (during building) - 模块 designide160.bpl` 中的访问冲突(如果我对有问题的表单进行了修改) -模块有打开的后代或链接的模块”错误(如果我尝试“查看为表单”)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2017-11-07
      • 1970-01-01
      相关资源
      最近更新 更多