AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein For-Schleife für eine Stringliste mit Insert in der Schleife
Thema durchsuchen
Ansicht
Themen-Optionen

For-Schleife für eine Stringliste mit Insert in der Schleife

Ein Thema von Alex_ITA01 · begonnen am 2. Feb 2006 · letzter Beitrag vom 2. Feb 2006
Antwort Antwort
Seite 1 von 2  1 2      
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#1

For-Schleife für eine Stringliste mit Insert in der Schleife

  Alt 2. Feb 2006, 08:52
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#2

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

  Alt 2. Feb 2006, 09:00
Moin

Löse es mit einer while-Schlife und als Abbruchbedingung könntest du beispielsweise

while CounterVar < SL.Items.Count nehmen. Die Varbiable musst du natürlich entsprechend hochzählen.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

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

  Alt 2. Feb 2006, 09:03
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;
  Mit Zitat antworten Zitat
Benutzerbild von tomsel
tomsel

Registriert seit: 8. Dez 2005
Ort: am Chiemsee
304 Beiträge
 
Delphi 7 Professional
 
#4

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

  Alt 2. Feb 2006, 09:08
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.
Ein Experte ist ein Mann, der hinterher genau sagen kann, warum seine Prognose nicht gestimmt hat. (Winston Churchill)
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 2. Feb 2006, 09:09
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von tomsel
tomsel

Registriert seit: 8. Dez 2005
Ort: am Chiemsee
304 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 2. Feb 2006, 09:20
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.....
Ein Experte ist ein Mann, der hinterher genau sagen kann, warum seine Prognose nicht gestimmt hat. (Winston Churchill)
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#7

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

  Alt 2. Feb 2006, 09:27
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...
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 2. Feb 2006, 09:36
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von tomsel
tomsel

Registriert seit: 8. Dez 2005
Ort: am Chiemsee
304 Beiträge
 
Delphi 7 Professional
 
#9

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

  Alt 2. Feb 2006, 10:07
Abgesehen von "ACHTUNG" greifst du an mehreren Stellen gnadenlos auf Strings[i+1] bzw. [i+2] zu. Das riecht nach "Index überschreitet das Maximum".
Ein Experte ist ein Mann, der hinterher genau sagen kann, warum seine Prognose nicht gestimmt hat. (Winston Churchill)
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#10

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

  Alt 2. Feb 2006, 10:07
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).
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 Uhr.
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