1

我在尝试将一个字符串分成两部分时制作了这段代码,稍后我将保存到数据库中。现在我已经成功地将 3 个单词字符串(如“单词单词编号”)放入 3 个字段,但是当我尝试将只有 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 回答