Autor |
Beitrag |
Kurdt67
      
Beiträge: 30
WIN XP
D7 Pers
|
Verfasst: Sa 26.02.05 21:16
Hi! Ich hab nen Problem in meinem Programm!
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 Tino: Überflüssige Absätze entfernt und Quote-Tags hinzugefügt.
|
|
Kroni
      
Beiträge: 720
Win 98, Win ME, Win2k, Win XP
D3 Pro
|
Verfasst: 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 
      
Beiträge: 30
WIN XP
D7 Pers
|
Verfasst: Sa 26.02.05 21:38
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 public end;
var Form1: TForm1;
var zliste : tzeiger;
implementation
uses Unit2, Unit3, Unit4;
{$R *.dfm}
function uhrzeit : shortstring; var datetime : tdatetime; begin datetime := time; uhrzeit := timetostr (datetime); 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; 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 Christian S.: Delphi-Tags hinzugefügt.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: So 27.02.05 12:18
Vermutlich liegt der Fehler in der Button6Click-Routine:
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 
      
Beiträge: 30
WIN XP
D7 Pers
|
Verfasst: 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 :
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; 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!!!
Hat jemand noch ne idee???
Moderiert von Gausi: Code- durch Delphi-Tags ersetzt.
|
|
Coder
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: So 27.02.05 13:53
anz := -1 geht nicht, weil der wert dann -1 ist.
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 
      
Beiträge: 30
WIN XP
D7 Pers
|
Verfasst: 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.
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; zaktueller := zliste; for f := 0 to anz do if f = index then begin |
Moderiert von UGrohne: Code- durch Delphi-Tags ersetzt.
|
|
Coder
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: 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
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: So 27.02.05 14:32
es wird grundsätzlich so geamcht:
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 
      
Beiträge: 30
WIN XP
D7 Pers
|
Verfasst: So 27.02.05 15:06
mmmmh muss ich die RadioGroup nehmen? Geht doch auch so oder??
Naja oder besser geht wohl nicht...
Oder kann ich das Programm mal jemand per Mail schicken!??
Vielleicht gehts besser wenn man es ordentlich sehen kann
was ich meine...?
Moderiert von AXMD: Beiträge zusammengefasst
|
|
Kurdt67 
      
Beiträge: 30
WIN XP
D7 Pers
|
Verfasst: 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
|
|