【问题标题】:Delphi 5: value of constant changes when it gets passed as function parameterDelphi 5:常量值作为函数参数传递时会发生变化
【发布时间】:2015-09-22 17:36:42
【问题描述】:

我在非常古老的代码(15 年)中有一个位置刚刚开始起作用:

cTemp := tblMemList.FieldByName('TTType').AsString;

在 Delphi 的 DB.pas 中,FieldByName 函数传递的“FieldName”常量显示的值是“点击保存或取消”,而不是“TTType”。

一开始我以为可能是因为在一个有点大的 pas 单元(大约 17k 行)中造成的,所以我把它分成了两个 pas 单元,但没有任何效果。

我被难住了。有什么想法吗?

【问题讨论】:

  • 您的代码可能存在缺陷。请出示minimal reproducible example
  • 显而易见的问题:自上次正常工作以来,您对源代码进行了哪些更改?无论如何,症状听起来像是内存覆盖。你试过使用 FastMM4 吗?这可以捕捉到这样的事情。
  • (不确定这是否是对建议的回应)我按照建议安装了 FastMM4,它确实发现了一个内存泄漏,但修复它对问题没有影响。当那条线运行时,我仍然得到一个 AV。至于展示一个例子,我不知道还能发布什么。当我 F7 这一行时,它立即转到 FieldByName 函数,并且作为参数传递的值不是我的代码中显示的值。这里的所有都是它的。 F7之前是'TTType';在我按 F7 后,它显示为“lick onSave or Cancel”。

标签: delphi memory constants


【解决方案1】:

最终的原因是一个表单上的组件太多。它上面有大约 1,500 个组件。当我删除大约 300 个时,问题就消失了。感觉像是内存/资源问题。

因此,我的下一步是重新构建该表单,以便我可以在其上放置 1,500 个(或更多)组件,而不会再次导致此问题。

如果有人对其他解决方案有任何建议,我很乐意听取他们的意见。

【讨论】:

    【解决方案2】:

    我会使用中介来调试:

    field := tblMemList.FieldByName ('TTTYpe') ;
    cTemp := field.asString ;
    

    【讨论】:

    • 这不是答案,应该是评论
    • 可以。无论如何,这不是借口。不要将 cmets 写成答案。
    猜你喜欢
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多