1

次に、請求書プリンター用のテンプレートを作成します。しかし、なぜエラーなしでクラッシュするのか、私には本当にわかりません。

私の目標は、「;」で文字列 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;
4

2 に答える 2

3

文字列内の index[0] へのアクセスに関する以下のコメントを参照してください。David Hefferen と 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, 単語数);' 爆発はしませんが、削除もしません。代わりにDelete(s1,1, wordcount)を使用してください。

Delphi 文字列の Index[0] には文字データが含まれていません。myString[0] をコンパイルしようとすると、コンパイラによると「アクセスできません」。

また、コードの書き方によっては、';' で終了する必要があります。または次のような文字列:

s1 := 'マイキー;だった;ここ;a'; 「;」の後の最後の文字列で無限にループします ('a')

ReportBuilder テンプレートなども使用します。Delphi 自体では MyString[0] をコンパイルすることはできませんが、コピー メソッドと削除メソッドはこのエラーから保護されています (David が説明したように)。その 'Delete(s1, 0, wordcount)' は例外をスローしませんが、削除に失敗します。したがって、RBuilder がこれ以上優れているとは思いませんし、おそらく悪くなるとは思いません。RAP の string[0] で copy() も失敗する可能性があります。

RAP はDelphi ではありません。RAP はObject Pascal に基づいてテンプレートで実行されるランタイム スクリプト環境ですが、すべてをサポートしているわけではなく、常に Delphi とまったく同じように動作するとは限りません。

ところで、ReportBuilder はバージョン 14.0X になりました。可能であればアップグレードする必要があります。RAP 環境には多くの改良が加えられています。それ以降のバージョンでは、コードが正常に機能するか、RAP からエラー メッセージが返される可能性があります。

また、RAP でデバッグするのは簡単ではありません。ただし、エラーが発生している場所の手がかりを得るために、レポートにテキスト ラベルを付け、コードの各行の後に追加します。

mylabel.caption:='statementxxx ran';

また

mylabel.caption:= myVariable.value;

など。これにより、アドホックなトレーサーが得られます。おそらく、失敗した場所や理由などを示すことができます。

于 2013-03-28T19:32:32.090 に答える