【问题标题】:Troubleshooting runtime exceptions when in Design mode在设计模式下对运行时异常进行故障排除
【发布时间】:2012-06-07 01:49:28
【问题描述】:

当我打开一个表单时,我突然收到一条错误消息:

"错误读取表格:'X'"

缓存未初始化。必须先调用 TCache.Initialise。忽略错误并继续?注意:忽略错误可能会导致组件被删除或属性值丢失”

“缓存未初始化”位是我们的一个类引发的异常。

我的第一个问题是,为什么 Delphi IDE 运行我的代码而没有我要求它“运行程序”?它运行什么代码?有什么办法可以关闭吗?

其次,有什么方法可以在调试器中捕获此错误,以便找出此异常在调用堆栈中发生的位置?我尝试在抛出异常的地方设置断点,但 Delphi 忽略了它。

而且,一旦我确定了这个异常的来源,有没有办法告诉我何时处于“设计模式”而不运行该代码,或者运行不同的代码?或者更好的是,如果在设计模式下根本不运行该代码? [更新:请参阅 Francois 对如何停止在设计模式下运行代码的回答。]

【问题讨论】:

  • IDE 没有运行您的代码,它在读取 .dfm 时遇到了一个它不知道的组件。
  • 对不起,如果我的问题不清楚。 IDE 正在显示我编写的代码引发的异常的文本。除非有一些内存损坏,否则该代码必须在某处运行。
  • 那么,您的代码在设计时包中。必须运行您的代码才能实例化您的组件以进行设计。我知道的唯一调试方法是使用 IDE 的另一个实例来调试 IDE。
  • 您描述的错误(“忽略错误并继续?`)正如@Sertac 所说的两次,因为 IDE 正在加载 .DFM 并且无法创建它的组件之一遇到(或发现缺少存储在 .DFM 中的某些属性的设计时包的不同版本)。它应该准确地告诉您该属性是什么,但您在错误消息的引用中省略了该属性。如果你不知道它在哪里,张贴错误对话框的屏幕截图。(包含组件的设计时包在设计时在 IDE 中执行。)
  • 好的。所以你知道问题在于初始化TCache。它是表单上的组件(还是表单上的组件包含的组件)?这是由 DFM 中的流式传输引起的错误,您知道涉及哪个类。在记事本或其他文本编辑器中打开 .DFM,查看 TCache 或包含它的组件所在的位置。当表单被流入时,TCache 的一个实例正在被创建,并且正在发生的事情没有以正确的顺序调用它的方法。它是什么? (从这里我看不到TCache,所以我猜不出来。)

标签: delphi delphi-2010


【解决方案1】:

您编写的一些组件代码在 IDE 尝试加载 dfm 时执行。

如果您的组件处于“设计模式”,您可以在代码中测试

  if (csDesigning in ComponentState) then

【讨论】:

  • @Ken 据我所知,这是一个不同的答案。
  • @KenWhite:……你的意思是?在我回答的时候,一连串的 cmets/edit 已经完成了吗?谢谢,我知道了!
  • @François,无意冒犯。不知道你打字很慢。
  • 一旦我解决了有问题的组件,这确实让我能够检查设计时间并停止运行导致崩溃的代码。
【解决方案2】:

当 IDE 加载 DFM 时,它会在表单设计器中创建活动对象,这意味着组件运行时代码实际上是在 IDE 中运行的。因此,如果组件代码想要在设计时跳过其代码的运行部分,则需要检查 TComponent.ComponentState 属性中的 csDesigning 标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多