AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Listenindex wird überschritten

Ein Thema von Daniel67 · begonnen am 28. Feb 2005 · letzter Beitrag vom 28. Feb 2005
Antwort Antwort
Daniel67

Registriert seit: 28. Feb 2005
3 Beiträge
 
Delphi 7 Enterprise
 
#1

Listenindex wird überschritten

  Alt 28. Feb 2005, 13:28
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??
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Listenindex wird überschritten

  Alt 28. Feb 2005, 13:49
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Listenindex wird überschritten

  Alt 28. Feb 2005, 14:28
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
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#4

Re: Listenindex wird überschritten

  Alt 28. Feb 2005, 14:58
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.
  Mit Zitat antworten Zitat
Daniel67

Registriert seit: 28. Feb 2005
3 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Listenindex wird überschritten

  Alt 28. Feb 2005, 15:00
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...
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Listenindex wird überschritten

  Alt 28. Feb 2005, 16:16
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
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#7

Re: Listenindex wird überschritten

  Alt 28. Feb 2005, 16:23
Zitat von Daniel67:
dann geht er raus aus dem Programm...
und an welcher stelle?
  Mit Zitat antworten Zitat
Daniel67

Registriert seit: 28. Feb 2005
3 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Listenindex wird überschritten

  Alt 28. Feb 2005, 17:48
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.
Der Beitrag kann dann gelöscht oder als abgeschlossen markiert werden
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:31 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