![]() |
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. |
Re: Listenindex wird überschritten
Zitat:
|
Re: Listenindex wird überschritten
Zitat:
MfG Binärbaum |
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. |
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... |
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:
MfG
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 .... Muetze1 |
Re: Listenindex wird überschritten
Zitat:
|
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