Delphi-PRAXiS

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';

himitsu 9. Nov 2013 20:11

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

Zitat von Furtbichler (Beitrag 1235272)
Der Debugger ist unnötig, die Fehlermeldung sagt alles. Die Liste hat 0 Elemente, weil der Zugriff auf Element #1 den Fehler verursacht.

Ja, das schon, aber der kleine Helfer sagt auch wo der Fehler auftritt und man kann mit ihm sehn Warum man überhaupt in der Codezeile gelandet ist.

Furtbichler 9. Nov 2013 20:45

AW: Fehlermeldung: Listenindex überschreitet das Maximum(1)
 
Jo, oder man erkennt, das beim Zugriff des Elementes #1 ein Fehler auftritt, schaut in den Code, sieht die entsprechende Zeile und -facepalm- erkennt den Fehler. Aber dazu... ähm... benötigt...

Ok. Debugger. Is einfacher. ;-)


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