Autor Beitrag
Kurdt67
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30

WIN XP
D7 Pers
BeitragVerfasst: Sa 26.02.05 21:16 
Hi! Ich hab nen Problem in meinem Programm! :cry:

Ich starte mein Programm. Dieses hat mehrere Buttons. Ich drücke einen Button dann passiert etwas: z.B. ne Textanzeige. Jetzt kommts aber: Wenn ich noch einen weiteren Button drücke, kommt eine Fehlermeldung und das Programm bricht ab!!
HIER DIE FEHLERMELDUNG:
Zitat:
Debugger-Exception:
Im Projekt1.exe ist eine Exception der Klasse EListErrror aufgetreten.
Meldung : 'Listenindex überschreitet das Maximum(2)'. Prozess wurde
angehalten.

Tsja, ich hab kein Plan wie ich sowas beheben kann! :?: Könnt ihr mir helfen!? Oder muss ich euch den ganzen Quelltext vom Programm geben???

Danke schon mal...

Moderiert von user profile iconTino: Überflüssige Absätze entfernt und Quote-Tags hinzugefügt.
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Sa 26.02.05 21:24 
Was machst du denn mit dem Buttons??
Ich nehme an du erhöhst ne zahl und versucht dann, zb. nen array damit anzusprehcne oder sowas??
ohne code wird es sehrs chewr!
Kurdt67 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30

WIN XP
D7 Pers
BeitragVerfasst: Sa 26.02.05 21:38 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, zeigermodul, CheckLst, ExtCtrls, ImgList;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Button1: TButton;
    Button2: TButton;
    CheckListBox2: TCheckListBox;
    Button6: TButton;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    StaticText3: TStaticText;
    StaticText4: TStaticText;
    GroupBox3: TGroupBox;
    StaticText5: TStaticText;
    StaticText6: TStaticText;
    StaticText7: TStaticText;
    StaticText8: TStaticText;
    StaticText9: TStaticText;
    StaticText10: TStaticText;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

var zliste : tzeiger;

implementation

uses Unit2, Unit3, Unit4;

{$R *.dfm}

function uhrzeit : shortstring;
var datetime : tdatetime;
begin
  datetime := time; {Uhrzeit speichern}
  uhrzeit  := timetostr (datetime); {Zeit in String konvertieren}
end;

function count (anzahl : integer) : integer;
begin
  inc (anzahl);
  count := anzahl;
end;

function dat : shortstring;
begin
  dat := datetostr (date);
end;

procedure laden (var zladen : tzeiger);
var datensatz : tinhalt;
begin
  assignfile (datei, 'C:\Dokumente und Einstellungen\Robert\Desktop\Projekt\anmeldung.txt');
{$I-}
  reset (datei);
{$I+}
  if ioresult <> 0 then begin
    form1.checklistbox2.items.add ('Die Datei ist leer');
    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;
  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;

procedure TForm1.Button2Click(Sender: TObject);
begin
  close;
end;

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

procedure TForm1.Button6Click(Sender: TObject);
var anz, i, index, f, hilf     : integer;
    zaktuell, zaktueller : tzeiger;
    daten                : tinhalt;
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] = true then
      index := i;
  {if checklistbox2 nicht checked then form3.visible := true else begin}
  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;

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

procedure TForm1.Button4Click(Sender: TObject);
begin
  Edit1.Clear;
  Edit2.Clear;
  Edit3.Clear;
  Edit4.Clear;
end;

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);
procedure speichern (var zspeichern : tzeiger);
procedure loeschen (zknoten : tzeiger; var zloeschen : tzeiger);

implementation

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:\Dokumente und Einstellungen\Robert\Desktop\Projekt\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.


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 27.02.05 11:54 
Ohne den Code komplett gelesen zu haben, würde ich einfach mal vermuten, dass du auf eine Element zugreifen willst, dass nicht vorhanden ist. Bedenke dabei, dass bei 2 Elementen in einer Liste der maximale Index 1 ist. (Die beiden Elemnte haben den Index 0 bzw. 1)

_________________
We are, we were and will not be.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: So 27.02.05 12:18 
Vermutlich liegt der Fehler in der Button6Click-Routine:
ausblenden Delphi-Quelltext
1:
2:
  for i := 0 to anz do
    if checklistbox2.checked[i] = true then

Du gehtst von 0 bis Anz. Ich gehe mal davon aus, dass du Anz CheckBoxen hast. Damit gehst du definitiv einen zu weit. Es ist richtig, dass du bei "0" anfängst, du darfst ab er nur bis Anz-1 gehen.
Kurdt67 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30

WIN XP
D7 Pers
BeitragVerfasst: So 27.02.05 13:35 
Ist ja merkwürdig! Normalerweise hatte ich ja vorher anz:=-1 gemacht
und bin dann von i:=1 TO anz gelaufen. jetzt habe ich die entsprechenden
zeilen mal so geändert :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
 anz := 0;
  zaktuell := zliste;
  while zaktuell <> nil do begin
    inc (anz);
    zaktuell := zaktuell^.znaechster;
  end;
  index := 0;
  for i := 0 to anz-1 do
    if checklistbox2.checked[i] = true then
      index := i;
  {if checklistbox2 nicht checked then form3.visible := true else begin}
  zaktueller := zliste;
  for f := 0 to anz-1 do
    if f = index then begin


Merkwürdig ist ja folgendes. Wenn ich das Programm ganz normal starte und
den Button6 drücke funktioniert alles wunderbar!
Aber sobald ich einen anderen Button vorher gedrückt habe (Bei diesem Button öffnet
sich lediglich ein neues Form-Fenster und da steht dann was / hat also nichts
mit der liste zu tun!) und dann den Button6 klicke dann kommt das die Liste
das Maximum überschreitet! je nachdem mal (1) mal (3), je nachdem ich was gelickt
habe!!!
Ich werd verrückt!!! :cry:
Hat jemand noch ne idee???

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt.
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: So 27.02.05 13:53 
anz := -1 geht nicht, weil der wert dann -1 ist. :wink:
Wenn du ihn um eins veringern willst muss es anz := anz - 1 heisen.
Das kannst du aber auch vereinfachen in dem du dec(anz) machst, damit wird der Wert um eins dekrementiert bzw. veringert.
Kurdt67 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30

WIN XP
D7 Pers
BeitragVerfasst: So 27.02.05 14:26 
Ich hab das jetzt mit DEC(anz) gemacht!!! Aber daran kann es nicht liegen!!
Er meckert wenn ich zuerst z.B. auf Button3 drücke oder Button1.
Wenn ich sofort Button6 ausführe funktioniert es!
Dabei öffnet der mit Button3 doch nur nen Info-Fenster.
Ich kapiers net!!! das mit dem anz müsste so hinhauen.
der dürfte nicht übers ende gehen...aber irgendwas hat er...
@ CODER : Der komplette Quelltext steht weiter oben! ich hab
nur 2 Units die wichtig sind.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
begin
  anz := 0;
  zaktuell := zliste;
  while zaktuell <> nil do begin
    inc (anz);
    zaktuell := zaktuell^.znaechster;
  end;
  index := 0;
  dec(anz);
  for i := 0 to anz do
    if checklistbox2.checked[i] = true then
      index := i;
  {if checklistbox2 nicht checked then form3.visible := true else begin}
  zaktueller := zliste;
  for f := 0 to anz do
    if f = index then begin


Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt.
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: So 27.02.05 14:31 
Was zeigt er denn für eine Fehlermeldung an? Die gleiche?

Edit:// Achso


Zuletzt bearbeitet von Coder am So 27.02.05 14:32, insgesamt 1-mal bearbeitet
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: So 27.02.05 14:32 
es wird grundsätzlich so geamcht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
begin   
  anz := 0;   
  zaktuell := zliste;   
  while zaktuell <> nil do begin   
    inc (anz);   
    zaktuell := zaktuell^.znaechster;   
  end;   
  index := 0;   
   
  for i := 0 to anz-1 do   
    if checklistbox2.checked[i] then   
      index := i;   

  zaktueller := zliste;   
  for f := 0 to anz-1 do   
    if f = index then begin


ausserdem wrde ich mal für die 2 schleife ne radiogroup nehmen, da bekommste den direkten inhalt
Kurdt67 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30

WIN XP
D7 Pers
BeitragVerfasst: So 27.02.05 15:06 
mmmmh muss ich die RadioGroup nehmen? Geht doch auch so oder??
Naja oder besser geht wohl nicht... :evil:

Oder kann ich das Programm mal jemand per Mail schicken!??
Vielleicht gehts besser wenn man es ordentlich sehen kann
was ich meine...?

Moderiert von user profile iconAXMD: Beiträge zusammengefasst
Kurdt67 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30

WIN XP
D7 Pers
BeitragVerfasst: Mo 28.02.05 18:54 
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