Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Listenindex wird überschritten (https://www.delphipraxis.net/41236-listenindex-wird-ueberschritten.html)

Daniel67 28. Feb 2005 13:28


Listenindex wird überschritten
 
Hi!
Ich hab nen großes Problem mit meinem Programm!! Ich find den Fehler einfach nicht :
Es geht um folgendes : Ich habe mehrere Buttons in meinem Programm.
Einer ist Button6, wenn ich diesen klicke, klappt alles. Wenn ich jedoch vorher
den Button3 klicke, der einfach nur ein Info Fenster anzeigt, und danach den
Button 6 klicke kommt die Fehlermeldung :
Im Projekt1.exe ist eine Exception der Klasse EListError aufgetreten.
Meldung : 'Listenindex überschreitet das Maximum(je nachdem 1/2/3..)
Prozess wurde angehalten.
Es muss irgendwo hinter einem Fenster gelesen werden. ich verstehe nicht
wo das problem liegt?? :wall:
Ich hoffe Ihr könnt es finden und mir helfen. :|
Hier der Quelltext (im wesentlichen 2 Units):

Delphi-Quellcode:

var zliste : tzeiger;

procedure TForm1.FormActivate(Sender: TObject);
begin
  laden (zliste);
end;


procedure laden (var zladen : tzeiger);
var datensatz : tinhalt;
    anz      : integer;
    zaktuell : tzeiger;

   
begin
   assignfile (datei, 'C:\...\anmeldung.txt');
{$I-}
  reset (datei);
{$I+}
if ioresult <> 0 then begin
    form1.checklistbox2.items.add ('Keine Datei vorhanden');
    rewrite (datei)
   end
  else begin
    form1.checklistbox2.clear;
    while not eof (datei) do begin
      read (datei, datensatz);
      anfuegen (datensatz, zladen);
      form1.checklistbox2.items.add (datensatz.vor + ' ' + datensatz.nach + ' ' +
        datensatz.kurs + ' ' + datensatz.lehrer + ' ' + datensatz.zeit + ' '
          + datensatz.datum + ' ' + inttostr (datensatz.counter));
    end;

   {Überprüfen ob überhaupt Datensätze in der Datei stehen} 

   anz := 0;
   zaktuell := zliste;
   while zaktuell <> nil do begin
    inc (anz);
    zaktuell := zaktuell^.znaechster;
   end;
   IF anz < 1 THEN
   form1.checklistbox2.items.add('Datei existiert zwar, aber keine Datensätze vorhanden');
 end;
  closefile (datei);
end;

procedure TForm1.Button1Click(Sender: TObject);
var daten : tinhalt;
begin
  if (form1.edit1.text = '') or (form1.edit2.text = '') or (form1.edit3.text = '')
    or (form1.edit4.text = '') then form2.visible := true
  else begin
    daten.vor    := edit1.text;
    daten.nach   := edit2.text;
    daten.kurs   := edit3.text;
    daten.lehrer := edit4.text;
    daten.zeit   := uhrzeit;
    daten.datum  := dat;
    daten.counter := 1;
    anfuegen (daten, zliste);
    speichern (zliste);
    laden (zliste);
    form1.close;
  end;
end;



function markiert : boolean;
var zaktuell        : tzeiger;
    j, anzahl       : integer;
begin
    markiert := false;
    anzahl  := 0;
    zaktuell := zliste;
    while zaktuell <> nil do begin
    inc(anzahl);
    zaktuell := zaktuell^.znaechster;
    end;
    FOR j:=0 TO anzahl-1 do
    IF form1.checklistbox2.selected[j] THEN markiert:=TRUE;
end;



procedure TForm1.Button6Click(Sender: TObject);
var anz, i, index, f, hilf       : integer;
    zaktuell, zaktueller         : tzeiger;
    daten                        : tinhalt;

begin
  IF markiert THEN begin
    anz := -1;
    zaktuell := zliste;
    while zaktuell <> nil do begin
      inc (anz);
      zaktuell := zaktuell^.znaechster;
    end;
    index := 0;
    for i := 0 to anz do
      if checklistbox2.checked[i] then index := i;
      zaktueller := zliste;
    for f := 0 to anz do
      if f = index then begin
        daten.vor    := zaktueller^.inhalt.vor;
        daten.nach   := zaktueller^.inhalt.nach;
        daten.kurs   := zaktueller^.inhalt.kurs;
        daten.lehrer := zaktueller^.inhalt.lehrer;
        daten.zeit   := uhrzeit;
        daten.datum  := dat;
        hilf         := zaktueller^.inhalt.counter;
        daten.counter := count (hilf);
        anfuegen (daten, zliste);
        loeschen (zaktueller, zliste);
        speichern (zliste);
        laden (zliste);
        end else
         zaktueller := zaktueller^.znaechster;
         form1.close;
  end
 else form3.visible:=true; {Wenn kein Häkchen makiert ist}
end;



procedure TForm1.Button3Click(Sender: TObject);
begin
  Form4.visible:=true;
end;


---------------------

unit zeigermodul;

interface

type tzeiger = ^telement;
     tinhalt = record
                 vor,nach,kurs,lehrer,zeit,datum : shortstring;
                 counter                        : integer
               end;
     telement = record
                  inhalt    : tinhalt;
                  znaechster : tzeiger;
                end;
     tdatei = file of tinhalt;

var datei : tdatei;


procedure anfuegen (datensatz : tinhalt; var zanfuegen : tzeiger);
var zneu, zaktuell : tzeiger;
begin
  new (zneu);
  zneu^.inhalt.vor    := datensatz.vor;
  zneu^.inhalt.nach   := datensatz.nach;
  zneu^.inhalt.kurs   := datensatz.kurs;
  zneu^.inhalt.lehrer := datensatz.lehrer;
  zneu^.inhalt.zeit   := datensatz.zeit;
  zneu^.inhalt.datum  := datensatz.datum;
  zneu^.inhalt.counter := datensatz.counter;
  zneu^.znaechster := nil;
  if zanfuegen = nil then
    zanfuegen := zneu
  else begin
    zaktuell := zanfuegen;
    while zaktuell^.znaechster <> nil do
      zaktuell := zaktuell^.znaechster;
    zaktuell^.znaechster := zneu;
  end;
end;

procedure speichern (var zspeichern : tzeiger);
var
  zaktuell : tzeiger;
begin
  assignfile (datei, 'C:\...\anmeldung.txt');
  zaktuell := zspeichern;
{$I-}
  reset (datei);
{$I+}
  if ioresult <> 0 then
    rewrite (datei)
  else
    while zaktuell <> nil do begin
      write (datei, zaktuell^.inhalt);
      zaktuell := zaktuell^.znaechster
    end;
  closefile (datei);
end;

procedure loeschen (zknoten : tzeiger; var zloeschen : tzeiger);
var zvorgaenger : tzeiger;
begin
  if zloeschen <> nil then begin
    if zknoten = zloeschen then
      zloeschen := zknoten^.znaechster
    else begin
      zvorgaenger := zloeschen;
      while zvorgaenger^.znaechster <> zknoten do
        zvorgaenger := zvorgaenger^.znaechster;
      zvorgaenger^.znaechster := zknoten^.znaechster;
    end;
    dispose (zknoten);
  end;
end;

end.

Luckie 28. Feb 2005 13:49

Re: Listenindex wird überschritten
 
Zitat:

Zitat von Daniel67
Hier der Quelltext (im wesentlichen 2 Units):

Es wäre wahrscheinlich wesentlich hoöfreicher, wenn du den Quelltext auf die weesentlichen Stellen kürzt und hier postest. Die wenigsten werden lust haben sich da jetzt durch zu wühlen.

Binärbaum 28. Feb 2005 14:28

Re: Listenindex wird überschritten
 
Zitat:

Zitat von Daniel67
Im Projekt1.exe ist eine Exception der Klasse EListError aufgetreten.
Meldung : 'Listenindex überschreitet das Maximum(je nachdem 1/2/3..)
Prozess wurde angehalten.

Das liegt in den meisten Fällen daran, dass der Index von 0 bis Count-1 läuft, aber irgendeine Schleife im Code von 1 bis Count.

MfG
Binärbaum

generic 28. Feb 2005 14:58

Re: Listenindex wird überschritten
 
warum baust du eigendlich noch soviel mit zeigern rum?
du hast doch objekt in d7 zur verfügung!

wenn du es geschickt machst können die sich sogar dann selbst streamen.

Daniel67 28. Feb 2005 15:00

Re: Listenindex wird überschritten
 
Die Schleifen laufen alle richtig!!! Hab ich alles gecheckt!!!
Es funzt ja auch, wenn ich nur den Button6 drücke.
Aber wehe ich drück vorher nen anderen Button der überhaupt
nichts damit zu tun hat, dann geht er raus aus dem Programm...

Muetze1 28. Feb 2005 16:16

Re: Listenindex wird überschritten
 
Moin!

Ich glaube nicht unbedingt das die Schleifen alle richtig laufen, weil ich vermute, dass Anz grösser werden kann als deine Zeigerliste ist - wodran das wiederrum liegt ist eine andere Frage. Aber um meine Vermutung zu bestätigen folgendes:

Delphi-Quellcode:
procedure TForm1.Button6Click(Sender: TObject);
var anz, i, index, f, hilf       : integer;
    zaktuell, zaktueller         : tzeiger;
    daten                        : tinhalt;

begin
  IF markiert THEN begin
    anz := -1;
    zaktuell := zliste;
    while zaktuell <> nil do begin
      inc (anz);
      zaktuell := zaktuell^.znaechster;
    end;
    index := 0;

    If ( Anz >= checklistbox2.Items.Count ) Then
      ShowMessage('Wie vermutet: Anz ist grösser als es Elemente in der CheckListBox2 gibt!');

    for i := 0 to anz do
  ....
MfG
Muetze1

ibp 28. Feb 2005 16:23

Re: Listenindex wird überschritten
 
Zitat:

Zitat von Daniel67
dann geht er raus aus dem Programm...

und an welcher stelle?

Daniel67 28. Feb 2005 17:48

Re: Listenindex wird überschritten
 
Hab jetzt den Fehler! Die schleifen waren richtig :
Wenn man debuggt (also was passiert nach dem 1. aufruf von markiert?) merkt
man, dass danach noch einmal alle daten aus der datei geladen werden,
es wird nämlich wieder Form1.FormActivate aufgerufen, und dort steht
'laden(zliste)' drin.
Dass Form1.FormActivate aufgerufen wird, liegt wohl an dem öffnen des
neuen fensters.
Ich hab laden(zliste) in die Funktion, die bei OnCreate - also dem Erzeugen
des Fenster-Objekts - aufgerufen wird, geschrieben.
Danke trotzdem nochmal an alle für die Hilfe. :thumb:
Der Beitrag kann dann gelöscht oder als abgeschlossen markiert werden


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