在Delphi中设置TStringLists数组有问题

6
Var
  i : Integer;
  j : Integer;
  oSLArray : array of TStringList;
  oSL : TStringList;
begin
  SetLength(oSLArray, emailPassword.Lines.Count);
  for i := 0 to emailPassword.Lines.Count - 1 do
    {oSLArray[i] := TStringList.Create;
    oSLArray[i].Delimiter := ' ';
    oSLArray[i].DelimitedText := emailPassword.Lines[i];
    for j := 0 to oSLArray[i].Count-1 do begin
      Showmessage( oSLArray[i].Strings[j] );
    end; }
    oSL := TStringList.Create;
    oSL.Delimiter := ' ';
    oSL.DelimitedText := emailPassword.Lines[i];
    for j := 0 to oSL.Count-1 do begin
      Showmessage( oSL[j] );
    end;
  end;

我正在尝试创建一个TStringLists数组,读取来自RichEdit“EmailPassword”的内容,然后打印它(在我完成之后将其放入数组中)。
当我取消注释oSLarray时,我会收到访问冲突的错误。
当我使用oSL尝试时,没有任何内容被打印出来。
现在,我理解访问违规意味着指针可能未正确设置,因为我认为访问违规发生在oSLArray[i]:= TStringList.Create处。
我是否只是忽略了一些小细节?

电子邮件密码是否为空?这将导致 AV,但在前几行有一些内容。 - David Zimmerman
你希望我们如何处理被注释掉的代码? - David Heffernan
2个回答

8

我已经纠正了代码,我相信这段代码会起作用,但是我只在脑海中测试过。

var 
  i : Integer; 
  j : Integer; 
  oSLArray : array of TStringList; 
  oSL : TStringList; 
begin
  if not(Assigned(emailpassword)) then exit;
  SetLength(oSLArray, emailPassword.Lines.Count); 
  for i := 0 to emailPassword.Lines.Count - 1 do begin
    oSLArray[i] := TStringList.Create; 
    oSLArray[i].Delimiter := ' '; 
    oSLArray[i].DelimitedText := emailPassword.Lines[i]; 
    for j := 0 to oSLArray[i].Count-1 do begin 
      Showmessage( oSLArray[i].Strings[j] );   <<--- The error has here
    end; {for j} 
  end; {for i}

    //oSL := TStringList.Create; 
    //try
    //  oSL.Delimiter := ' '; 
    //  oSL.DelimitedText := emailPassword.Lines[i]; 
    //  for j := 0 to oSL.Count-1 do begin 
    //    Showmessage( oSL[j] ); 
    //  end; {for j}
    //finally
    //  oSL.Free;
    //end; {try}
    //end; {for i} 
end;

以下是带有注释的旧代码:

for i := 0 to emailPassword.Lines.Count - 1 do //don't forget begin
  oSLArray[i] := TStringList.Create; 
  oSLArray[i].Delimiter := ' '; 
  oSLArray[i].DelimitedText := emailPassword.Lines[i]; 
//<<<--  Here for i loop should end, but it does not.
    for j := 0 to oSLArray[i].Count-1 do begin 
 //You loop though all members of OSLArtray, even though only the first item is set, 
 //the rest is unassigned.
      Showmessage( oSLArray[i].Strings[j] );  <<-- Access Violation 
    end; } 

2
啊!缺少了 begin!因为我从不写没有 begin 的代码,所以我已经失去了发现它可能会丢失的能力。 - David Heffernan
@DavidHeffernan,很少有机会超越您的调试水平。 - Johan
1
哦,我不知道那个。这种情况经常发生。无论如何,你在这方面做得非常好!+1 - David Heffernan
你在for循环外使用了i!j循环应该在i循环内部。 - Uwe Raabe
1
再次为永远不要省略Begin/End的派别加上+1。 - Toby Allen

5
缺少begin/end对是问题所在。没有注释,
for i := 0 to emailPassword.Lines.Count - 1 do

循环仅迭代行

oSLArray[i] := TStringList.Create;

这条线

oSLArray[i].Delimiter := ' '; 

循环执行后,此代码将被执行。

2
+1 是为了表扬那些解释为什么原帖中的代码无法正常工作的人。 - Marjan Venema

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接