【问题标题】:class EVariantTypeCastError with message 'Could not convert variant of type (String) into type (Double)class EVariantTypeCastError with message 'Could not convert of type of type (String) into type (Double)
【发布时间】:2013-04-25 22:47:11
【问题描述】:

使用 Delphi 和 FastReport 我在 Delphi 中调试时收到此错误消息:

<FastReport_Component>.ShowReport(true);

然后出现这个错误:

Project myapp.exe 引发异常类 EVariantTypeCastError,并带有消息“无法转换类型的变体” (String) 转换成 (Double)' 类型。

它在显示报告之前出现两次。但如果我在不调试的情况下运行 myapp,则不会出现错误消息。

如何找到导致此错误的备忘录?报告有很多备忘录。有些在内部也有使用IIF 的表达式,并且错误消息不会显示更多信息。

【问题讨论】:

    标签: delphi fastreport


    【解决方案1】:

    这只是调试器。它可能只是得到一个预期的错误(由 FR 代码中的try..except 处理)并正确处理它,但调试器无法知道并告诉您发生了异常。 (在使用 Indy 时这是一个常见问题,它会在正常程序流程中引发异常。)

    在调试的时候有三种方式来处理这种情况:

    1. 只要在出现异常对话框时点击Continue。 (您可以判断这是一个调试器异常,因为您获得了BreakContinue 选项,而且它只在调试时发生。)

    2. 您可以在调试时禁用特定异常类(或所有异常),使用Tools-&gt;Options-&gt;Debugger Options。在这种情况下,您可以将EVariantTypeCastError 添加到要忽略的异常列表中。

    3. (我的首选方法)使用Advanced Breakpoint Properties 对话框跳过调试器围绕您知道会引发您想要忽略的异常的特定代码行的异常处理。

      • 在问题代码行之前的行设置断点。
      • 右击前一行的断点,从上下文菜单中选择Breakpoint Properties
      • 单击Breakpoint Properties 对话框中的Advanced 按钮,然后在Actions 组框中,取消选中Break 并选中Ignore subsequent exceptions
      • 在问题代码后的行上重复前面的步骤,除了在第二个断点上选中 Break 并取消选中 Ignore subsequent exceptions
      • 照常运行您的代码。调试器将跳过它对两个断点之间代码的异常处理。

    选项 #3 的优点是它忽略所有异常处理,但仅在两个断点之间的代码块上,因此您仍然会在代码的所有其他区域中遇到异常,这些异常可能是调试器中的有效异常。

    【讨论】:

    • 您的选项 3,虽然在理论上是一个非常好的解决方案,但只有在有人删除这些断点之前才有效。这可以通过 Delete All Breakpoints 菜单轻松实现。我经常这样做,因为我的 IDE 倾向于保留无法单独删除的无效断点。
    • @dummzeuch:此时您重复简单的 5 步过程,将其放回您需要的位置。我没有在任何地方说这是处理异常的永久方法(那将是选项 2)。
    【解决方案2】:

    我得到了同样的错误,但 FastReport 没有。我将留下我的错误的上下文,因为它可能对其他人有所帮助。我得到了这个错误:

    RESTRequest.Execute();

    我将 TClientDataSet 与 TRESTResponseDataSetAdapter 一起使用,以便在向我的 Web 服务发出请求后,适配器将使用 Web 服务返回的 JSON 字符串加载数据集。该数据集用于自动选中/取消选中复选框并加载文本编辑和组合框。由于 TJSONObject 无法正确解析 json 中的布尔值,因此我将一些复选框更改为基于整数值而不是布尔值来选中/取消选中。然后我更改了我的 web 服务,以便它在数据表中查找布尔列为整数值 1 或 0。出于某种原因(完全是我的错),我在该字段中输出了一个带有“”而不是整数(“ 1”或“0”)。这产生了那个确切的错误。更正后,错误消失了。

    【讨论】:

      【解决方案3】:

      我在 FastReport 中遇到了类似的问题。在我的情况下,它是应用于 MemoView 的错误格式。我可以通过这种方式找到违规组件的名称:

      • 使用 Break 停止执行
      • 在调用堆栈面板中,找到来自 fastreport 类的最新调用(在我的例子中:frxClass.TfrxCustomMemoView.FormatData(...) 并双击它。
      • 如果您没有快速报告的源代码,则会出现一个对话框 - 只需点击取消
      • 在局部变量面板中,您可能会看到违规组件的名称/值/格式。

      【讨论】:

        猜你喜欢
        • 2020-04-25
        • 2023-01-12
        • 2021-10-22
        • 2022-11-20
        • 2022-12-27
        • 2022-12-27
        • 1970-01-01
        • 1970-01-01
        • 2021-10-19
        相关资源
        最近更新 更多