Возникли проблемы с настройкой массива TStringLists в Delphi

#delphi

#delphi

Вопрос:

 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 .Создать.

Я просто упускаю что-то маленькое?

Комментарии:

1. является ли emailPassword нулевым? Это вызвало бы AV, но на несколько лет раньше.

2. Что вы хотите, чтобы мы сделали с закомментированным кодом?

Ответ №1:

Я исправил код, я верю, что этот код будет работать, но я только проверил его в своей голове.

 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; } 
  

Комментарии:

1. Ах! Отсутствует begin ! Поскольку я никогда не пишу код без begin того, чтобы я потерял способность определять, что он может отсутствовать.

2. @DavidHeffernan, не так часто у кого-то есть возможность отладить вас.

3. О, я не знаю об этом. Происходит постоянно. В любом случае, вы хорошо справились с этим! 1

4. Вы используете i вне цикла for! J-цикл должен находиться внутри i-цикла.

5. Еще раз 1 для школы НИКОГДА НЕ пропускать начало / Конец.

Ответ №2:

Проблема заключается в отсутствии пары begin / end . Без комментариев

 for i := 0 to emailPassword.Lines.Count - 1 do
  

цикл повторяет только строку

 oSLArray[i] := TStringList.Create;
  

строка

 oSLArray[i].Delimiter := ' '; 
  

выполняется после цикла.

Комментарии:

1. 1 за объяснение того, почему код OP не работал.