![]() |
For-Schleife für eine Stringliste mit Insert in der Schleife
Hallo erstmal,
komischer Titel ich weiß :-) Ich habe folgende Frage: Ich habe 2x For-Schleifen ineinander verschachtelt. Die erste geht eine Stringliste.Count-1 durch, die zweite vergleicht einen Wert, mit dem aktuellen Listeneintrag. Das Problem ist jetzt, wenn ich in der zweiten For-Schleife eine Übereinstimmung finde, soll in die Stringliste ein Eintrag hinzugefügt werden ("Count+1"). Damit trifft aber meine erste For-Schleife (for i := 0 to Liste.Count-1) nicht mehr richtig zu, weil sich die Count verändert hat und das i aber nicht auf 0 zurücksetzbar ist. Wisst ihr was ich meine? Wenn ja, wie kann ich das lösen? MFG Alex |
Re: For-Schleife für eine Stringliste mit Insert in der Schl
Moin
Löse es mit einer while-Schlife und als Abbruchbedingung könntest du beispielsweise
Delphi-Quellcode:
nehmen. Die Varbiable musst du natürlich entsprechend hochzählen.
while CounterVar < SL.Items.Count
|
Re: For-Schleife für eine Stringliste mit Insert in der Schl
Man könnte es mit einer while schleifen lösen. Allerdings könnte es dann in einer Endlosschleife enden, wenn der Stringliste neue Zeilen hinzugefügt werden, die wiederum neue Zeilen einfügen...
Delphi-Quellcode:
//...
i := 0; while i < Liste.Count do begin //... if Foo then Liste.Add(Bar); //... Inc(i); end; |
Re: For-Schleife für eine Stringliste mit Insert in der Schl
Du könntest die neuen Strings zunächst in eine zweite, temporäre Stringliste einfügen und erst nach der Schleife in deine "Hauptliste" übernehmen.
|
Re: For-Schleife für eine Stringliste mit Insert in der Schl
achja... :-)
Danke schön. Die Endlosschleife wird nicht zutreffen, weil nicht immer neue Zeilen eingefügt werden und damit kommt er irgendwann mal aus der .Count-1 raus ... MFG Alex PS: Das mit der Zwischenliste dachte ich auch schon. Nur war mir das nicht die schönste Lösung... Trotzdem Danke |
Re: For-Schleife für eine Stringliste mit Insert in der Schl
Ich denke schon, dass du dir mit eine Endlosschleife einhandelst. Was passiert, wenn ein String in die Liste eingefügt wird, und zwar vor der aktuellen i-Position? Dann rücken alle Strings dahinter um eine Indexposition weiter, und beim nächsten i ist wieder der gleiche String an der Reihe und es wird sicher wieder ein neuer eingefügt. Und beim nächsten i wieder.....
|
Re: For-Schleife für eine Stringliste mit Insert in der Schl
Zitat:
|
Re: For-Schleife für eine Stringliste mit Insert in der Schl
Es ist leider doch nicht so einfach wie ich dachte ;-)
Hier mal der Code:
Delphi-Quellcode:
Da unten bei dem Achtung mache ich nur ein Insert...
File_Inhalt.LoadFromFile(FileList.Strings[k]);
for i := 0 to File_Inhalt.Count - 1 do begin if Pos('NETWORK',File_Inhalt.Strings[i]) > 0 then begin if Pos('TITLE',File_Inhalt.Strings[i+1]) > 0 then begin if Pos('=',File_Inhalt.Strings[i+1]) > 0 then begin tmpStr1 := File_Inhalt.Strings[i+1]; Delete(tmpStr1,1,Pos('=',tmpStr1)); tmpStr1 := Trim(tmpStr1); for j := 0 to aGrid.RowCount - 1 do begin if (tmpStr1 = aGrid.Cells[0,j]) and (aGrid.Cells[1,j] <> '') then begin if Pos('//.',File_Inhalt.Strings[i+2]) > 0 then Break else begin //ACHTUNG... Insert ändert List.Count und die erste For-Schleife wird dadurch "ungültig" File_Inhalt.Insert(i+2,'//.' + aGrid.Cells[1,j]); Save := True; if Assigned(GlobalList) then GlobalList.Add(tmpStr1 + '//.' + aGrid.Cells[1,j]); Break; end; end; end; end; end; end; end; File_Inhalt.SaveToFile(FileList.Strings[k]); Könnt ihr euch das mal bitte angucken? MFG Alex |
Re: For-Schleife für eine Stringliste mit Insert in der Schl
Abgesehen von "ACHTUNG" greifst du an mehreren Stellen gnadenlos auf Strings[i+1] bzw. [i+2] zu. Das riecht nach "Index überschreitet das Maximum".
|
Re: For-Schleife für eine Stringliste mit Insert in der Schl
Zitat:
Versuch's mit dieser Vorlage (ungetestet):
Delphi-Quellcode:
Allerdings gehe ich davon aus, dass sich das Parsen und Zerlegen der Strings optimieren lässt (siehe TString.Values und TStrings.Names).
//...
File_Inhalt.LoadFromFile(FileList.Strings[k]); i := 0; while i < File_Inhalt.Count - 1 do begin if (Pos('NETWORK', File_Inhalt.Strings[i]) > 0) and (Pos('TITLE', File_Inhalt.Strings[i + 1]) > 0) and (Pos('=', File_Inhalt.Strings[i + 1]) > 0) then begin TmpStr1 := File_Inhalt.Strings[i + 1]; Delete(TmpStr1, 1, Pos('=', TmpStr1)); TmpStr1 := Trim(TmpStr1); for j := 0 to AGrid.RowCount - 1 do if (TmpStr1 = AGrid.Cells[0, j]) and (AGrid.Cells[1, j] <> EmptyStr) then begin {$BOOLEVAL OFF} if (File_Inhalt.Count - i <= 2) or (Pos('//.', File_Inhalt.Strings[i + 2]) <= 0) then begin File_Inhalt.Insert(i + 2, '//.' + AGrid.Cells[1, j]); Save := True; if Assigned(GlobalList) then GlobalList.Add(TmpStr1 + '//.' + AGrid.Cells[1, j]); end; Inc(i, 2); // Überspringe auch 'NETWORK' und 'TITLE' Break; end; end; Inc(i); end; File_Inhalt.SaveToFile(FileList.Strings[k]); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz