2011-10-13 5 views
5
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; 

Próbuję zrobić tablicę TStringLists, przeczytaj co nadchodzi z RichEdit „EmailPassword”, a następnie je wydrukować (położę go w tablicy kiedy się tak daleko).uwzględniając ustawienie tablicy TStringLists w Delphi kłopoty

Kiedy odkomentuję OSLarray, otrzymuję naruszenie dostępu. Kiedy wypróbowałem to przy pomocy języka, nic nie zostało wydrukowane.

Teraz rozumiem, że naruszenie zasad dostępu oznacza, że ​​wskaźnik może nie być ustawiony prawidłowo, ponieważ myślę, że naruszenie dostępu występuje w oSLArray [i]: = TStringList.Create.

Czy brakuje mi czegoś małego?

+0

to emailPassword zero? To by spowodowało AV, ale kilka minut wcześniej. –

+0

Co mamy zrobić z kodem, który został skomentowany? –

Odpowiedz

7

Poprawiłem kod, wierzę, że ten kod zadziała, ale testowałem go tylko w mojej głowie.

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; 

Oto twój stary kod z komentarzami:

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

Ah! Brakujące "rozpocznij"! Ponieważ nigdy nie piszę kodu bez 'początku ', straciłem zdolność do zauważenia, że ​​może go brakować. –

+0

@DavidHeffernan, nieczęsto zdarza się, że ktoś ma szansę na debugowanie. – Johan

+1

Och, nie wiem o tym. Dzieje się cały czas. W każdym razie, wytrwaliście dobrze na tym! +1 –

4

Nieobecność kroki/pary końcowego jest problem. Bez uwag,

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

iteracje pętli tylko linia

oSLArray[i] := TStringList.Create; 

linia

oSLArray[i].Delimiter := ' '; 

jest wykonywany po pętli.

+2

+1 za dostarczenie wyjaśnienia, dlaczego kod OP nie zadziałał. –