Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   For-Schleife für eine Stringliste mit Insert in der Schleife (https://www.delphipraxis.net/62270-schleife-fuer-eine-stringliste-mit-insert-der-schleife.html)

Alex_ITA01 2. Feb 2006 07:52


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

Matze 2. Feb 2006 08:00

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:
while CounterVar < SL.Items.Count
nehmen. Die Varbiable musst du natürlich entsprechend hochzählen.

NicoDE 2. Feb 2006 08:03

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;

tomsel 2. Feb 2006 08:08

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.

Alex_ITA01 2. Feb 2006 08:09

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

tomsel 2. Feb 2006 08:20

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.....

NicoDE 2. Feb 2006 08:27

Re: For-Schleife für eine Stringliste mit Insert in der Schl
 
Zitat:

Zitat von tomsel
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.....

bei InsertIndex <= i würde er Inc(i) aufrufen müssen...

Alex_ITA01 2. Feb 2006 08:36

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:
          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]);
Da unten bei dem Achtung mache ich nur ein Insert...
Könnt ihr euch das mal bitte angucken?
MFG Alex

tomsel 2. Feb 2006 09:07

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".

NicoDE 2. Feb 2006 09:07

Re: For-Schleife für eine Stringliste mit Insert in der Schl
 
Zitat:

Zitat von Alex_ITA01
Code:
//...
          File_Inhalt.LoadFromFile(FileList.Strings[k]);
          for i := 0 to [color=red]File_Inhalt.Count - 1[/color] do
          begin
            if Pos('NETWORK',File_Inhalt.Strings[i]) > 0 then
            begin
              if Pos('TITLE',[color=red]File_Inhalt.Strings[i+1][/color]) > 0 then

Unangenehmer Bug. Du greifst am Ende der Schleife auf Strings[Count] zu!

Versuch's mit dieser Vorlage (ungetestet):
Delphi-Quellcode:
//...
          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]);
Allerdings gehe ich davon aus, dass sich das Parsen und Zerlegen der Strings optimieren lässt (siehe TString.Values und TStrings.Names).


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz