我已经制作了这段代码,同时尝试将一个字符串拆分成2个部分,稍后我将保存到数据库中。现在我已成功将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字段中的字符串和编辑82字段中的数字中获取所有单词。
答案 0 :(得分:9)
这里要学习的最重要的事情是如何解释编译器生成的错误消息。有时他们没有那么多帮助,但在这种情况下,消息会告诉你所有你需要知道的事情。
错误消息是:
List index out of bounds (2)
这意味着您正在访问列表的元素2,并且元素2不存在。这意味着列表的can为0或1.当您编写A[2]
时,列表会引发异常,因为A[2]
不存在。
这完全是预料之中的。如果您拆分'word number'
,则结果为:
A[0] = 'word'
A[1] = 'number'
并且没有索引2的元素。
您的代码访问A[2]
的原因可以在此处找到:
表示i:= 48到57 如果A [1]&lt;&gt; char(i)则 C:= 1 其他 如果A [1] = char(i)那么 C:= 2;
对于'number'
的任何值,显然char(i)
永远不等于i
,因此将c
设置为1
。然后导致此代码执行:
if c=1 then
begin
edit81.Text:=(A[0]+' '+A[1]);
edit82.Text:=A[2]; // BOOM!
end