Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Listindex überschreitet Maximum - Einmal ja, einmal nein? (https://www.delphipraxis.net/79943-listindex-ueberschreitet-maximum-einmal-ja-einmal-nein.html)

draGo 31. Okt 2006 15:33


Listindex überschreitet Maximum - Einmal ja, einmal nein?
 
Huhu DP,

ich stehe mal wieder vor einem (komischen) Problem...
Ich habe hier vor einiger Zeit mal eine Split Funktion gefunden die auch ganz das tut was sie soll. (Gibt eine StringList zurück).
Um die Stringlist bearbeiten zu können habe ich mir noch eine eigene erstellt und folgendes gemacht:

Delphi-Quellcode:
StringLst := Split(Str,'|',false,false);
Nun habe ich mit

Delphi-Quellcode:
    Stringlst.Text := Stringreplace(Ergebnisse.Text,' ','',[rfreplaceall]);
 stringlst.Text := Stringreplace(Ergebnisse.Text,'#',' ',[rfreplaceall]);
etwas ersetzt. Alles schön und gut.
Wenn ich jetzt aber mit einer Schleife arbeiten möchte kommt das Problem...

Delphi-Quellcode:
for I := 0 to StringLst.Count -1  do begin
  //...
Es erfolgt der Fehler "Listindex überschreitet Maximum"
Wenn ich es folgend mache

Delphi-Quellcode:
for I := 0 to Split(Str,'|',false,false).count -1 do begin
  //...
funktioniert alles wunderbar.
Wenn ich das ersetzen auslasse funktioniert es... Nur warum?
Ich würde nämlich gerne mit meiner StringList arbeiten :?
Hoffe ihr könnt mir helfen :)

mfg,
draGo

Bernhard Geyer 31. Okt 2006 15:41

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
Zitat:

Zitat von draGo
etwas ersetzt. Alles schön und gut.
Wenn ich jetzt aber mit einer Schleife arbeiten möchte kommt das Problem...

Delphi-Quellcode:
for I := 0 to StringLst.Count -1  do begin
  //...
Es erfolgt der Fehler "Listindex überschreitet Maximum"

Also diese Zeile kann nicht das Problem sein. Zeig doch mal die ganze Funktion. Der Fehler ist ja in der Scheife (von der wir keinen Code haben).

Helmi 31. Okt 2006 15:42

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
Hallo,

anstatt:
Delphi-Quellcode:
StringLst := Split(Str,'|',false,false);
musst du die eine StringList der anderen StringList so übergeben:
Delphi-Quellcode:
StringLst.Assign(Split(Str,'|',false,false));

RavenIV 31. Okt 2006 15:47

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
ich hab auch noch eine Idee:
jeder String wird doch durch #0 abgeschlossen. Mit Deinen Ersetzen klaust Du dem #0 das #.
Prüfe das doch mal in diese Richtung...

draGo 31. Okt 2006 15:48

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
Hallo Bernhard,

es scheint eher am ersetzen zu liegen.

Delphi-Quellcode:
Stringlst.Text := Stringreplace(Ergebnisse.Text,' ','',[rfreplaceall]);
stringlst.Text := Stringreplace(Ergebnisse.Text,'#',' ',[rfreplaceall]);
Wenn ich diese beiden Zeilen (Eine weglassen führt zum Fehler wieder, egal welche) weglasse gibt Delphi mir keinen Error aus.
Der (etwas chaotische) Code der Schleife ist folgender:


Delphi-Quellcode:
for I := 0 to StringLst.Count -1  do begin
  frmmain.anzeige.Rowcount := frmmain.anzeige.rowcount +1;

  if zeile > 7 then
    zeile := 0;

   if StringLst.Strings[i] = '' then
      StringLst.Delete(i);


  Frmmain.Anzeige.Cols[zeile].Add(StringLst.strings[i]);
  zeile := zeile +1;

 end;
Wobei "Anzeige" ein StringGrid ist.

____________________

Hallo Helmi, habe es jetzt so gemacht. Jedoch behebt das nicht das Problem :(

____________________

Hallo RavenIV,
werde es mal nachprüfen . Danke :)

mfG draGo

Helmi 31. Okt 2006 15:51

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
erzeugst du auch die StringList "Stringlst" mit
Delphi-Quellcode:
Stringlst := TStringList.Create;
:?: :?:

draGo 31. Okt 2006 15:54

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
Hallo Helmi,

ja das tue ich schon vorher ;)

Hawkeye219 31. Okt 2006 16:07

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
Hallo draGgo,

schaue mal in diesen Thread hinein, da findest du die Erklärung für die Fehlermeldung.

Zu deiner Split-Funktion: wenn diese dir eine Stringliste liefert, dann bist du als Aufrufer für die Freigabe der Liste verantwortlich. Befehle wie

Delphi-Quellcode:
for I := 0 to Split(Str,'|',false,false).count -1 do begin
oder
Delphi-Quellcode:
StringLst.Assign(Split(Str,'|',false,false));
erzeugen somit Speicherlecks, weil du keine Referenz speicherst, mit der du die Liste wieder freigeben kannst.

@RavenIV
Du machst Witze, oder? klick

Gruß Hawkeye

RavenIV 31. Okt 2006 16:14

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
Zitat:

Zitat von Hawkeye219
@RavenIV
Du machst Witze, oder? klick

War nur so ne spontane (und dumme) Idee.
Jetzt, wo ich den Link gelesen habe, ist es wieder klar.
Auch ich sollte eben zweimal überlegen, bevor ich den "Absenden"-Button drücke. :oops: :|

marabu 31. Okt 2006 17:53

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
Hallo draGo,

ein wesentliches Problem mit deinem Code aus Beitrag #1 ist:

Delphi-Quellcode:
begin
  Ergebnisse := Split(Str,'|',false,false);
  Stringlst.Text := StringReplace(Ergebnisse.Text, ' ', '',[rfReplaceAll]);
  //  Stringlst.Text := Stringreplace(Ergebnisse.Text, '#', ' ',[rfReplaceAll]);
  //  Wenn du das Resultat der ersten Ersetzung nicht weiter verarbeitest,
  //  dann dürfte das Eregbnis nicht deinen Erwartungen entsprechen.
  Stringlst.Text := StringReplace(Stringlst.Text, '#', ' ',[rfReplaceAll]);
// ...
Grüße vom marabu

Muetze1 31. Okt 2006 18:37

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
Zitat:

Zitat von draGo
Delphi-Quellcode:
for I := 0 to StringLst.Count -1  do begin
  frmmain.anzeige.Rowcount := frmmain.anzeige.rowcount +1;

  if zeile > 7 then
    zeile := 0;

   if StringLst.Strings[i] = '' then
      StringLst.Delete(i);


  Frmmain.Anzeige.Cols[zeile].Add(StringLst.strings[i]);
  zeile := zeile +1;

 end;

Du löscht Einträge in der StringList und dabei verringert sich der Count. Das Problem dabei: For Schleifen evaluieren nur einmal die Laufvariablengrenzen und während des Durchlaufs nicht mehr. Dadurch läuft er zu der Originalen Count Anzahl durch und greift damit auf die ungültigen Einträge zu, wenn welche gelöscht wurden. Abhilfe schafft hier die Schleife rückwärts laufen zu lassen (DownTo) oder einen anderen Schleifentyp zu nutzen wie z.B. While.

draGo 31. Okt 2006 22:21

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
Hallo Muetze,

habe die Schleife jetzt rückwärts laufen lassen mit

Delphi-Quellcode:
for I := StringLst.Count -1 DOWNTO 0 do begin
//code...
Mache ich da etwas falsch? Denn einen Error mit "Listindex überschreitet Maximum" erhalte ich immer noch...

mfg
drago

Ghostwalker 1. Nov 2006 00:17

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
Prüf mal mit dem Debugger ob "StringLst.Count" auch größer 0 ist :)

TStringlist 1. Nov 2006 07:35

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
@Ghostwalker, wäre "StringLst.Count"=0 (dh. der I-Startwert=-1), dann würde diese DownTo-0-Schleife überhaupt nicht durchlaufen.

Ghostwalker 1. Nov 2006 09:08

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
Ähm...das ist natürlich richtig. Ich sollte Nachts um Eins keine Postings mehr mache....:)

Hawkeye219 1. Nov 2006 09:16

Re: Listindex überschreitet Maximum - Einmal ja, einmal nein
 
Hallo draGo,

beim Löschen eines Listenelements rücken normalerweise alle folgenden Elemente nach. Das letzte Element einer Liste hat aber keine Nachfolger. Entfernst du es aus der Liste, muß jeder Zugriff auf diese Position zu der von dir beschriebenen Fehlermeldung führen.

Wenn das letzte Element ein Leerstring ist, entfernst du es durch einen Aufruf von Delete(). In der nachfolgenden Zeile versuchst du dann dieses (nun ungültige) Listenelement einer anderen Liste hinzuzufügen.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 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