Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Konsolenanwendung: Stringlist error (https://www.delphipraxis.net/108470-konsolenanwendung-stringlist-error.html)

cherry 14. Feb 2008 08:43


Konsolenanwendung: Stringlist error
 
Mein Code:

Delphi-Quellcode:
for i := 0 to supi.Count - 1 do
      begin
        if (supi.ValueFromIndex[i] = paramStr(4)) then
        begin
          eFound := True;
          supi.Delete(i-1);
          supi.Delete(i-1);
          supi.Delete(i-1);
          supi.Delete(i-1);
          supi.SaveToFile(paramStr(2));
        end;
      end;
Der Fehler:

Q:\>Q:\DATEN\Projekte\delupientry\delupientry -f C:\upm.his -e hideext.upi
Exception EStringListError in Modul delupientry.exe bei 00011CF5.
Listenindex überschreitet das Maximum (52).

Das Problem:

Der Fehler erscheint aber das Programm funktioniert ansonsten genau so wie ich das will...
Es soll mir aus einer Textdatei 4 Zeilen löschen... Es werden genau die Vier Zeilen gelöscht die ich will, alles funktioniert so wies soll.. aber woher der Fehler???

Wenn ich die vier "supi.Delete(i-1);" weglasse kommt der Fehler nicht... - Dann werden aber auch die gewünschten Zeilen nicht gelöscht... :?

Jmd eine Idee was ich schon wieder nicht korrekt mache?

DeddyH 14. Feb 2008 08:47

Re: Konsolenanwendung: Stringlist error
 
supi.Count wird nur ein einziges Mal ausgelesen. Wenn Du nun innerhalb der Schleife Zeilen löschst, wird dieser nicht durch den tatsächlichen Wert ersetzt. Du musst Dir eine andere Lösung suchen (evtl. mit while?).

cherry 14. Feb 2008 08:52

Re: Konsolenanwendung: Stringlist error
 
Sorry... ich Raffs nicht... kannst dus nochmals mit anderen Worten erklären bitte? :oops:

//EDIT...

Habs nochmals versucht zu verstehen... ich kappier jetzt was du meinst... hehe

cherry 14. Feb 2008 08:57

Re: Konsolenanwendung: Stringlist error
 
Ok und wie könnte ich das nun sonst bewältigen?

taaktaak 14. Feb 2008 08:57

Re: Konsolenanwendung: Stringlist error
 
Die Obergrenze der Schleife supi.count wird nur einmal zum Beginn der Schleifendurchläufe ermittelt. Innerhalb der Schleife wird aber die Anzahl der Elemente verringert, dadurch ist die Obergrenze der Schleife dann falsch (zu hoch/groß), was dann den Fehler verursacht. Du musst also die Obergrenze bei jedem Schleifendurchlauf neu bestimmen >> also z.B. mit einer while-Schleife

DeddyH 14. Feb 2008 09:00

Re: Konsolenanwendung: Stringlist error
 
Ich hab mal ein Beispiel mit einem Memo erstellt.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const weg = 4;
var Anzahl, Zeile, j: integer;
begin
  Anzahl := Memo1.Lines.Count;
  Zeile := weg; //wir fangen erst bei der 5. Zeile an, sonst kracht es beim Löschen
  while Zeile < Anzahl do
    begin
      if Memo1.Lines[Zeile] = 'weg' then
        begin
          for j := 1 to weg do
            Memo1.Lines.Delete(Zeile - j);
          dec(Anzahl,weg); //Anzahl der Zeilen neu berechnen
        end;
      inc(Zeile);
      if Zeile < weg then
        Zeile := weg; //ggf. wieder auf 4 erhöhen, s.o.
    end;
end;

cherry 14. Feb 2008 09:02

Re: Konsolenanwendung: Stringlist error
 
Vielen Dank euch allen...

Ich könnte ja auch einfach meine for Schleife verwenden und ein break; einsetzen, wäre das nich so gut?

DeddyH 14. Feb 2008 09:03

Re: Konsolenanwendung: Stringlist error
 
Jens, das reicht auch nicht. Wenn z.B. die letzte Zeile einen Treffer bringt, werden die direkten Vorgänger gelöscht und anschließend versucht, darauf zuzugreifen.

[edit] Super, löscht der einfach seinen Post, nun steh ich dumm da :( [/edit]

Thomas_Pape 14. Feb 2008 09:24

Re: Konsolenanwendung: Stringlist error
 
Hallo alle miteinander,

ich glaube die Lösung ist relativ einfach. Hier mal meine

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

Var
Zeile : Integer;

begin
  Zeile := 0;
  While Zeile < Memo1.Lines.Count Do
  Begin
    If Memo1.Lines[Zeile] = 'weg'
      Then Memo1.Lines.Delete(Zeile)
      Else Zeile := Zeile + 1;
  End;
end;
Gruß Thomas

DeddyH 14. Feb 2008 09:32

Re: Konsolenanwendung: Stringlist error
 
Da hast Du aber dasselbe Problem.

[edit] Nee, Du inkrementierst ja, könnte klappen. [/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 Uhr.
Seite 1 von 2  1 2      

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