#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 не работал.