现在我为发票打印机构建了一个模板。 但我真的不知道,为什么崩溃没有任何错误。
我的目标是在';'处分隔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;
答案 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;