Einzelnen Beitrag anzeigen

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