数字隐喻Report Builder 11.05:为什么我的DELPHI代码崩溃而没有任何错误?

时间:2013-03-28 17:37:10

标签: reportbuilder

现在我为发票打印机构建了一个模板。 但我真的不知道,为什么崩溃没有任何错误。

我的目标是在';'处分隔String ItemName并将每个部分打印到Memo1的新行。

procedure DetailBeforeGenerate;
var
  s1: String;
  s2: String;
  wordcount: Integer;
  notelength: Integer;

begin
 s1 := plPrintInvLine['ItemName'];
 notelength := Length(s1);
while notelength > 0 do
begin
    notelength := Length(s1);
    wordcount := Pos(';' , s1);
    s2 :=   Copy(s1, 0, wordcount-1);
    Memo1.Lines.Add(s2);
    Delete(s1, 0, wordcount);
end;

end;

2 个答案:

答案 0 :(得分:2)

请参阅以下关于访问字符串中索引[0]的评论,感谢David Heffernen和Ken White。的 BUT

看起来你的代码中有一个无限循环:

notelength := Length(s1);
while notelength > 0 do
begin
    notelength := Length(s1);
    wordcount := Pos(';' , s1);
    s2 :=   Copy(s1, 0, wordcount-1);
    Memo1.Lines.Add(s2);
    Delete(s1, 0, wordcount);
end;

删除(s1,0,wordcount); 无效!在Delphi调试器中试一试。结果? notelength永远不会递减,所以你将永远循环。 '删除(s1,0,wordcount);'不会爆炸,但也不会删除。请改用删除(s1,1,wordcount)

Delphi字符串中的索引[0]不包含您的字符数据 - 如果您尝试编译myString [0],则根据编译器“无法访问”;

另外:编写代码的方式,你必须以';'结束或者这样的字符串:

s1:='mikey; was; here;'; 将在';'后的最后一个字符串上无限循环( 'a')的

我也使用ReportBuilder模板等:在Delphi本身你将无法编译MyString [0],但是复制和删除方法受到保护而不受此错误的影响(正如David所解释的那样)然而它看起来就像我看到的那样在调试器中,“删除(s1,0,wordcount)”不会抛出异常但无法删除。所以我不希望RBuilder变得更好,也许更糟糕的是 - 在RAP中字符串[0]上复制()也可能失败。

RAP NOT Delphi - 它是一个运行时脚本环境,在您的模板中运行,基于Object Pascal,但它不支持所有内容,并且您不能总是期望它的行为与Delphi完全相同

BTW - ReportBuilder现在达到版本14.0X - 如果可能的话你应该升级 - 在RAP环境中有很多改进。在以后的版本中,您的代码可能正常工作,或者您将从RAP返回错误消息。

另外:如果你想在RAP中调试,那就不那么容易了。但是为了向您提供有关错误发生位置的线索,请在报表上添加文本标签,并在每行代码后添加

mylabel.caption:='statementxxx ran';

mylabel.caption:= myVariable.value;

等。这会给你一个小小的临时追踪器 - 可能会告诉你失败的原因/原因等等。

答案 1 :(得分:1)

对于所有搜索人员:我在这个社区的帮助下找到了解决方案!

工作代码如下所示:

    procedure DetailBeforeGenerate;
var
  S1: String;
  S2: String;
  wordcount: Integer;
  notelength: Integer;

begin
 S1 := plPrintInvLine['ArtName'];
 notelength := Length(S1);
while (notelength > 0) do
begin
    wordcount := Pos(';',S1);
    S2 :=   Copy(S1, 1, wordcount-1);
    if ( Pos(' ',S2) = 1 ) then Delete(S2, 1, 1);
    Memo1.Lines.Add(S2);
    Delete(S1, 1, wordcount);
    notelength := notelength - wordcount;
end;

end;