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/)
-   -   Fehlermeldung: Listenindex überschreitet das Maximum(1) (https://www.delphipraxis.net/177498-fehlermeldung-listenindex-ueberschreitet-das-maximum-1-a.html)

Jansteger 9. Nov 2013 17:56

Fehlermeldung: Listenindex überschreitet das Maximum(1)
 
Hallo,

Wenn ich beim beim Open- und Save-Dialog auf Abbrechen klicke kommt immer diese Fehlermeldung. Wie kann ich das beheben?

Quellcode:
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  List: TStrings;
begin
  List := TStringList.Create;
  try
    if SaveDialog1.Execute then
      List.LoadFromFile(SaveDialog1.FileName);
    if List.Count>0 then
      Edit1.Text:=List[0];
      Edit2.Text:=List[1];
      Edit3.Text:=List[2];
      Edit4.Text:=List[3];
      Edit5.Text:=List[4];
      Edit6.Text:=List[5];
      Edit7.Text:=List[6];
  finally
    List.Free;
  end;
end;

jfheins 9. Nov 2013 18:01

AW: Fehlermeldung: Listenindex überschreitet das Maximum(1)
 
Ohne begin/end zu setzen, bezieht sich das if immer nur auf eine Zeile. Da steht also sowas:
Delphi-Quellcode:
    if SaveDialog1.Execute then
        List.LoadFromFile(SaveDialog1.FileName);

    if List.Count>0 then
        Edit1.Text:=List[0];

    Edit2.Text:=List[1];
    Edit3.Text:=List[2];
Jetzt mal schöner gruppiert. Mit begin/end geht's so:
Delphi-Quellcode:
if (Bedingung)
begin
    // Anweisungen
    // jetzt auch mehr als eine Zeile
end

Aviator 9. Nov 2013 18:02

AW: Fehlermeldung: Listenindex überschreitet das Maximum(1)
 
Woher weißt du, dass in der Liste immer mindestens 7 Einträge vorhanden sind? Wenn du auf abbrechen drückst, könnte es sein, dass schon ein Eintrag in der Liste ist und er dann an der Stelle
Delphi-Quellcode:
Edit2.Text:=List[1];
abschmiert.

Setz doch zum Test noch ein
Delphi-Quellcode:
List.Clear;
hinter dein Create der Liste um sicherzustellen, dass nichts in deiner Liste steht.

Des Weiteren würde ich auf die gewünschte Anzahl an Einträgen prüfen und nicht nur auf > 0. Prüfe, ob mindestens 7 Einträge in der Liste sind, damit beim Auslesen der Liste keine Fehler auftreten.

Edit: Das was JFHeins gesagt hat, kommt natürlich noch dazu. Hab ich total über"lesen".

Jansteger 9. Nov 2013 18:04

AW: Fehlermeldung: Listenindex überschreitet das Maximum(1)
 
Mit begin/end funktioniert das.

Danke.

sx2008 9. Nov 2013 18:07

AW: Fehlermeldung: Listenindex überschreitet das Maximum(1)
 
Die Datei hat keine 7 Zeilen, deshalb greift z.B. List[6] ins Leere.
Verwende einfach folgende Funktion:

Delphi-Quellcode:
// 1. Zeile eine Stringliste auslesen und Eintrag in Liste löschen
function GetFirstLine(list:TStrings):string;
begin
  if list.Count > 0 then
  begin
    result := list[0];
    list.Delete(0);
  end
  else
    result := 0;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  List: TStrings;
begin
  List := TStringList.Create;
  try
    if SaveDialog1.Execute then
      List.LoadFromFile(SaveDialog1.FileName)
    else
      Exit;

    Edit1.Text:=GetFirstLine(List);
    Edit2.Text:=GetFirstLine(List);
    Edit3.Text:=GetFirstLine(List);
    Edit4.Text:=GetFirstLine(List);
    Edit5.Text:=GetFirstLine(List);
    Edit6.Text:=GetFirstLine(List);
    Edit7.Text:=GetFirstLine(List);
  finally
    List.Free;
  end;
end;
PS: deine Vorgehensweise ist unsicher! Probier mal aus was passiert wenn in der Datei nur 5 Zeilen sind.

Jansteger 9. Nov 2013 18:10

AW: Fehlermeldung: Listenindex überschreitet das Maximum(1)
 
Ihr braucht keine Vorschläge mehr zu machen.
Es gibt jetzt keine Probleme mehr!

Mit begin und end in der IF-Schleife gibt es keine Fehlermeldung mehr :):thumb:

himitsu 9. Nov 2013 18:23

AW: Fehlermeldung: Listenindex überschreitet das Maximum(1)
 
Laß das Exit weg.

Stattdessen ein Begin-End um alles (LoadFromFile bis hinter's Edit7.Text) drumrum ist doch auch ganz nett.

Außerdem:
- Warum wird eigentlich scheinbar ein SaveDialog für's Laden verwendet?
- Ich würde dir empfehlen den Komponenten ein paar orgentliche Namen zu geben, damit man weiß was was ist.
- Etwas Fehlerbehandlung kann nie schaden. (angefangen bei Try-Except, über eine Fehlermeldung, wenn die Datei nicht geladen wurde)
- Ich empfehle dir auch mal das Lesen/anschauen eines Tutorial für den Debugger und vorallem dessen Verwendung.

Zitat:

Wie kann ich das beheben?
Denn der Debugger hätte dir genau gezeigt, was da falsch läuft.
Und wenn du beim Testen auch mal den Datei-Dialog mit "Abbechen" oder mit einer zu kleinen Datei ausprobiert hättest, dann wäre dir dann auch das fehlende Begin-End aufgefallen.

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  List: TStrings;
begin
  if OpenDialog1.Execute then begin
    List := TStringList.Create;
    try
      List.LoadFromFile(SaveDialog1.FileName);
      if List.Count = 7 then begin // oder > 6 bzw. >= 7
        Edit1.Text := List[0];
        Edit2.Text := List[1];
        Edit3.Text := List[2];
        Edit4.Text := List[3];
        Edit5.Text := List[4];
        Edit6.Text := List[5];
        Edit7.Text := List[6];
      end else
        ShowMessage('Ungültige Datei.');
    finally
      List.Free;
    end;
  end;
end;

Aber daß es wenigstens einen Ressourcenschutzblock (Try-Finally) gab, welcher auch noch richtig verwendet wurde, ist schonmal ein guter Anfang. :thumb:

Dalai 9. Nov 2013 19:03

AW: Fehlermeldung: Listenindex überschreitet das Maximum(1)
 
Zitat:

Zitat von Jansteger (Beitrag 1235267)
Mit begin und end in der IF-Schleife [...]

Da isse wieder, die "if-Schleife".

MfG Dalai

Furtbichler 9. Nov 2013 19:07

AW: Fehlermeldung: Listenindex überschreitet das Maximum(1)
 
Zitat:

Zitat von himitsu (Beitrag 1235269)
Denn der Debugger hätte dir genau gezeigt, was da falsch läuft.

Der Debugger ist unnötig, die Fehlermeldung sagt alles. Die Liste hat 0 Elemente, weil der Zugriff auf Element #1 den Fehler verursacht.

Helmi 9. Nov 2013 19:27

AW: Fehlermeldung: Listenindex überschreitet das Maximum(1)
 
Zitat:

Zitat von sx2008 (Beitrag 1235266)
Delphi-Quellcode:
// 1. Zeile eine Stringliste auslesen und Eintrag in Liste löschen
function GetFirstLine(list:TStrings):string;
begin
  if list.Count > 0 then
  begin
    result := list[0];
    list.Delete(0);
  end
  else
    result := 0;
end;

Nur der Richtigkeit halber, bei
Delphi-Quellcode:
result := 0;
würdest einen Fehler erhalten, weil 0 ein Integer ist, Result aber ein String.
Also
Delphi-Quellcode:
Result := '0';


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