1

後でデータベースに保存する 1 つの文字列を 2 つの部分に分割しようとしているときに、このコードを作成しました。今のところ、「word word number」のような 3 単語の文字列を 3 つのフィールドに取得することに成功しましたが、「word number」のような 1 つの単語と数字のみの文字列を 2 つのフィールドに分割しようとすると、理解できないエラー メッセージが表示されます。

procedure Split
   (const Delimiter: Char;
    Input: string;
    const Strings: TStrings) ;
begin
   Assert(Assigned(Strings)) ;
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.DelimitedText := Input;
end;

procedure TForm2.Button64Click(Sender: TObject);
var
   A: TStringList; i,c:integer;
begin
c:=0;
//for i:= 0 to ListBox1.Items.Count  do
//begin
   A := TStringList.Create;
 //  try
    // Split(' ',listbox1.Items.Strings[0], A) ;
     Split(' ',ListBox1.Items.Strings[ListBox1.ItemIndex], A) ;
  // finally
   //  A.Free;
   for i := 48 to 57 do
if A[1]<>char(i) then
  c:=1
else
if A[1]=char(i) then
  c:=2;

if c=1 then
begin
  edit81.Text:=(A[0]+' '+A[1]);
  edit82.Text:=A[2];
end
else
if c=2 then
begin
  edit81.Text:=A[0];
  edit82.Text:=A[1];
end;
end;

エラーメッセージは次のとおりです。

First chance exception at $7C812FD3. Exception class EStringListError with message 'List index out of bounds (2)'. Process paligs.exe (732)

edit81フィールドの文字列とedit 82フィールドの数字からすべての単語を取得しようとしています。

フォームからの私の画像: http://i.stack.imgur.com/7vnS8.jpg

4

1 に答える 1

9

ここで学ぶべき最も重要なことは、コンパイラが生成するエラー メッセージを解釈する方法です。あまり役に立たないこともありますが、この場合、メッセージは知っておくべきことをすべて教えてくれます。

エラーメッセージは次のとおりです。

List index out of bounds (2)

これは、リストの要素 2 にアクセスしていて、要素 2 が存在しないことを意味します。これは、リストに 0 または 1 の可能性があることを意味します。 を記述すると、リストは存在しないA[2]ため、例外が発生します。A[2]

これは完全に予想されることです。分割'word number'すると、結果は次のようになります。

A[0] = 'word'
A[1] = 'number'

インデックス 2 の要素はありません。

コードがアクセスする理由は次のA[2]場所にあります。

for i := 48 to 57 do if A[1]<>char(i) then c:=1 else if A[1]=char(i) then c:=2;

明らかに はのどの値に対しても'number'等しくないため、 に設定されます。次に、このコードの実行につながります。char(i)ic1

if c=1 then
begin
  edit81.Text:=(A[0]+' '+A[1]);
  edit82.Text:=A[2]; // BOOM!
end
于 2013-06-18T13:26:22.983 に答える