1

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

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

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;
4

2 回答 2

3

请参阅下面有关在字符串中访问 index[0] 的评论,感谢 David Heffernen 和 Ken White。但是

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

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,字数);没有效果!在 Delphi 调试器中试一试。结果?notelength 永远不会递减,因此您将永远循环。'删除(s1, 0, wordcount);' 不会炸毁,但也不会删除。请改用Delete(s1,1, wordcount)

Delphi 字符串中的 Index[0] 不包含您的字符数据 - 如果您尝试编译 myString[0],根据编译器,它是“不可访问的”;

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

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

我还使用 ReportBuilder 模板等:在 Delphi 本身中,您将无法编译 MyString[0],但复制和删除方法不受此错误的影响,(正如 David 解释的那样)但是它出现在我在调试器中看到的内容中'Delete(s1, 0, wordcount)' 不会抛出异常但无法删除。所以我不认为 RBuilder 会更好,甚至可能更糟 - copy() 也可能在 RAP 中的 string[0] 上失败。

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

顺便说一句 - ReportBuilder 现在升级到 14.0X 版 - 如果可能,您应该升级 - RAP 环境有很多改进。在以后的版本中,您的代码可能可以正常工作,或者您会从 RAP 收到错误消息。

另外:如果您想在 RAP 中进行调试,这并不容易。但是为了给你一个关于错误可能发生在哪里的线索,在你的报告上放一个文本标签,在你的代码的每一行之后添加

mylabel.caption:='statementxxx ran';

或者

mylabel.caption:= myVariable.value;

等等,这会给你一个临时的跟踪器——也许会告诉你失败的地方/原因,等等。

于 2013-03-28T19:32:32.090 回答
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;
于 2013-04-02T08:53:16.337 回答