【问题标题】:Delphi pass string to procedure gets an access violation errorDelphi 将字符串传递给过程得到访问冲突错误
【发布时间】:2015-04-07 16:56:08
【问题描述】:

我目前正在尝试创建一个测试程序并将其传递给一个字符串。该函数检查字符串是否相等。问题是,当测试运行时,我在过程中传递的字符串上收到 EAccessViolation 的访问冲突错误。我知道这是一个内存声明问题,但我不知道如何解决它。

这是我的代码:

声明

TestTForm1 = class(TTestCase)
strict private
    FForm1: TForm1;
public
    procedure SetUp; override;
    procedure TearDown; override;
published
    procedure TestCompareListBoxToFile(Method : String);
end;

打电话

TestCompareListBoxToFile('Save');

程序

procedure TestTForm1.TestCompareListBoxToFile(Method : String);  
begin
    Check('Save' = Method,'they dont match');
end;

我是 delphi 的新手,所以如果有什么我遗漏的,请告诉我。请在回复中具体说明。谢谢。

【问题讨论】:

  • 你在哪里声明TestCompareListBoxToFile 过程? (我怀疑它在 DLL 中,这意味着您违反了标准“不要将字符串传递给 DLL,因为它们不兼容”。)
  • 在TestTForm1 = class(TTestCase)之后
  • 没有意义。鉴于您发布的代码,绝对不会导致 AV。
  • 没有证据表明 A/V 是如何在这里发生的。你确定这是它发生的代码吗?另一方面,您不应该在published 下放置任何程序 - 该部分保留用于在对象检查器中显示组件和控件的属性。但这也不会引起您的问题。
  • 很难过,但我 100% 确定这就是它正在发生的地方。

标签: string delphi access-violation dunit


【解决方案1】:

该代码由单元测试运行程序调用。它使用 RTTI 查找名称以 'Test' 开头的已发布方法。从表面上看,这似乎是一个 DUnit 测试用例。

运行程序需要一个不接受参数的过程,并按原样调用该方法。另一方面,您提供一个需要参数的方法。未提供的参数。因此运行时错误。

现在,您在代码中的某处说您正在调用这样的方法:

TestCompareListBoxToFile('Save');

但这并不是调用测试的方式。测试由使用 RTTI 的运行程序调用。如果您也尝试调用该函数,那是错误的。

你必须像这样声明你的方法:

procedure TestCompareListBoxToFile;

您可能需要返回到单元测试框架的文档和示例,并学习如何设计您的测试用例以能够接受参数。事实上,在这样做之前,我建议您直接回到基础,并确保您完全了解运行程序如何发现您的测试然后运行它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2011-07-04
    相关资源
    最近更新 更多