Autor Beitrag
ALEXTHEGIANT
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 20.06.05 18:10 
Hi, wir entwickeln gerade für den Informatikunterricht einen Quizmaker.
Dieser besteht aus zwei Programmen.
Der Developer kann ein Quiz anlegen. Hier kann er beliebig viele Fragen erstellen. Zu jeder Frage gibt er vier Antwortmöglichkeiten an, wovon die erste immer die richtige ist.

Wenn er fertig ist dann speichert der Developer das Quiz als typisierte Datei.

Der User kann dann die Datei einlesen und mit dem Quiz beginnen.

Der nun folgende Quelltext stammt aus dem Developer Programm. Beim Compilieren kommt keine Fehlermeldung. Sobald man aber die einzelnen Buttons drückt kommt es zu Access Violations. Wir haben keine Ahnung wo der Fehler liegt und brauchen dringend Hilfe.

Ich bin sicher ihr könnt mir weiter helfen.

also schonmal großes Dankeschön gruß Alex

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:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, ExtCtrls, StdCtrls;

type

  quiz=RECORD                      // Deklaration des Datensatzes
    Frage:string[255];
    A1:string[255];               // Antwortmöglichkeiten 1-4 (1 ist die richtige Antwort)
    A2:string[255];
    A3:string[255];
    A4:string[255];
  end;

  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Panel1: TPanel;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    SpeedButton5: TSpeedButton;
    SpeedButton6: TSpeedButton;
    SpeedButton7: TSpeedButton;
    SpeedButton8: TSpeedButton;
    SpeedButton9: TSpeedButton;
    SpeedButton10: TSpeedButton;
    SpeedButton11: TSpeedButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Edit6: TEdit;
    procedure SpeedButton6Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure SpeedButton7Click(Sender: TObject);
    procedure SpeedButton11Click(Sender: TObject);
    procedure SpeedButton8Click(Sender: TObject);
    procedure SpeedButton10Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure SpeedButton3Click(Sender: TObject);
    procedure SpeedButton5Click(Sender: TObject);
    procedure SpeedButton9Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

  quiz_array:array of quiz;        // Deklaration des Arrays
  aktuell:integer;                 // Zahl des aktuellen Arrays
  max_array:integer;               // Anzahl der Arrays

  f:file of quiz;                  // Deklaration der Filevariable

implementation

{$R *.dfm}

procedure TForm1.SpeedButton6Click(Sender: TObject);   // BEENDEN
 begin

  close;        // Schließen des Developer Programms

 end;

procedure TForm1.SpeedButton2Click(Sender: TObject);  // SPEICHERN
 VAR

  i:integer;

 begin

  IF saveDialog1.execute  THEN    // Hervorrufen des Speicherndialogs

  BEGIN

   assignfile (f, saveDialog1.FileName);

   rewrite (f);

   i:=1;

   WHILE i<=max_array DO

  BEGIN

   write (f, quiz_array[i]);

   i:=i+1;

  END;

  closefile (f);

 END;


end;

procedure TForm1.SpeedButton1Click(Sender: TObject);  // NEU
 var

  i:integer;
 begin
       
  quiz_array[aktuell].Frage:= edit1.Text;

  quiz_array[aktuell].A1:= edit2.Text;

  quiz_array[aktuell].A2:= edit3.Text;

  quiz_array[aktuell].A3:= edit4.Text;

  quiz_array[aktuell].A4:= edit5.Text; 

// Löschen der eingegebenen Angaben aus den Edit-Fenstern

  max_array := 0;  // max_array = Maximalwert, Größte Nummer des Arrays

  aktuell := 0;    // aktuell = Momentanwert, Nummer des Arrays

  edit1.Text:='';

  edit2.Text:='';

  edit3.Text:='';

  edit4.Text:='';

  edit5.Text:='';

  aktuell:=aktuell+1;


 end;

procedure TForm1.FormCreate(Sender: TObject);
 begin
  max_array:=0;    // soll die Anzahl der Arrays zu Beginn auf 0 setzen, wird bei jedem Speichern erhöht

  AssignFile(f,'backup.dat');

  if FileExists('backup.dat'then ReSet(f)

  else ReWrite(f);


 end;

procedure TForm1.SpeedButton4Click(Sender: TObject);    // ÜBERSCHREIBEN = EDITIEREN
 begin

  quiz_array[aktuell].Frage:=edit1.Text;

  quiz_array[aktuell].A1:=edit2.Text;

  quiz_array[aktuell].A2:=edit3.Text;

  quiz_array[aktuell].A3:=edit4.Text;

  quiz_array[aktuell].A4:=edit5.Text;

 end;


procedure TForm1.SpeedButton7Click(Sender: TObject);   // ANFANG
 begin

  edit1.Text:=quiz_array[0].Frage;

  edit2.Text:=quiz_array[0].A1;

  edit3.Text:=quiz_array[0].A2;

  edit4.Text:=quiz_array[0].A3;

  edit5.Text:=quiz_array[0].A4;

  aktuell:=0;                                    // das aktuelle Array ist nun das erste


end;

procedure TForm1.SpeedButton11Click(Sender: TObject);  // ENDE
 begin

  edit1.Text:=quiz_array[max_array].Frage;     // ließt das letzte Array ein

  edit2.Text:=quiz_array[max_array].A1;

  edit3.Text:=quiz_array[max_array].A2;

  edit4.Text:=quiz_array[max_array].A3;

  edit5.Text:=quiz_array[max_array].A4;

  aktuell:=max_array;                           // das aktuelle Array ist nun das letzte

 end;

procedure TForm1.SpeedButton8Click(Sender: TObject);  // VORHERIGES
 begin

  aktuell:=aktuell-1;                          // das aktuelle Array wird das vorherige

  edit1.Text:=quiz_array[aktuell].Frage;

  edit2.Text:=quiz_array[aktuell].A1;

  edit3.Text:=quiz_array[aktuell].A2;

  edit4.Text:=quiz_array[aktuell].A3;

  edit5.Text:=quiz_array[aktuell].A4;

 end;

procedure TForm1.SpeedButton10Click(Sender: TObject);   // NÄCHSTES
 begin

  aktuell:=aktuell+1;                          // das aktuelle Array wird das nächste

  edit1.Text:=quiz_array[aktuell].Frage;

  edit2.Text:=quiz_array[aktuell].A1;

  edit3.Text:=quiz_array[aktuell].A2;

  edit4.Text:=quiz_array[aktuell].A3;

  edit5.Text:=quiz_array[aktuell].A4;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
  CloseFile(f);
 end;

procedure TForm1.SpeedButton3Click(Sender: TObject);         // QUIZ ÖFFNEN
 VAR
  f:File OF quiz;
  i:integer;
 begin
 
  IF openDialog1.execute  THEN  // Hervorrufen des Öffnendialogs
   BEGIN
    assignfile (f, openDialog1.FileName);  

    // Der Benutzer kann hier den Namen der zu  speichernden Datei selbst auswählen

    reset (f);

    i:=1;
   
    WHILE not EOF (f) DO

     BEGIN

      read (f, quiz_array[i]);

      i:=i+1;

     END;

    max_array := i-1;

    aktuell :=1;

    closefile (f);

   edit1.Text:= quiz_array [aktuell].Frage;

   edit2.Text:= quiz_array [aktuell].A1;

   edit3.Text:= quiz_array [aktuell].A2;

   edit4.Text:= quiz_array [aktuell].A3;

   edit5.Text:= quiz_array [aktuell].A4;
              
  END;

 end;

procedure TForm1.SpeedButton5Click(Sender: TObject);   // FRAGE LÖSCHEN
VAR
 i:integer;
begin
 
 FOR i:=aktuell To max_array DO

  quiz_array[i]:= quiz_array[i+1];

   IF aktuell = max_array THEN
 
   aktuell :=  aktuell -1;

   edit1.Text:= quiz_array [aktuell].Frage;

   edit2.Text:= quiz_array [aktuell].A1;

   edit3.Text:= quiz_array [aktuell].A2;

   edit4.Text:= quiz_array [aktuell].A3;

   edit5.Text:= quiz_array [aktuell].A4;
  
end;

procedure TForm1.SpeedButton9Click(Sender: TObject);   // REIHENFOLGE ÄNDERN
 Var 
 
    z:integer;  // Zielposition der Tauschfrage

    i:integer;  // Laufvariable

Begin
 IF saveDialog1.execute THEN

  BEGIN

  assignfile (f,'backup.dat');

  rewrite (f);

  i:=aktuell;

  write (f, quiz_array[aktuell]);

  closefile (f);

  END;

  Begin

  z:=strtoint(Edit6.text);

  quiz_array[aktuell]:=quiz_array[z];

  end;



  IF openDialog1.execute THEN

   BEGIN

    assignfile (f,'backup.dat');

   reset (f);

   read (f, quiz_array[i]);

   i:=aktuell;
 
   max_array := i-1;

   aktuell :=1;

   closefile (f);

  end;
 end;
end.


Moderiert von user profile iconraziel: Quote- durch Delphi-Tags ersetzt und Titel "verkleinert".
Moderiert von user profile iconraziel: Topic aus Projekte (Open Source) verschoben am Mo 20.06.2005 um 18:21


Zuletzt bearbeitet von ALEXTHEGIANT am Mo 20.06.05 18:47, insgesamt 1-mal bearbeitet
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mo 20.06.05 18:28 
Also, Alex, der Gigant...

1.) :welcome: im DF!

2.) Wenn du den Code nicht ordentlich formatierst, wird ihn niemand lesen... das ist ja grauenvoll ;)

AXMD
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Mi 22.06.05 09:19 
Hallo Alex,

ihr benutzt doch die Varialbe quiz_array. Bei dieser Variable handelt es sich doch um ein dynamisches Array. Und bei dynamischen Array´s muss man mit SetLength dem Array eine Größe zuweisen und somit Speicher für dieses Array reservieren.

Ihr müsst also beim Laden der Quiz-Datei und das Lesen der einzelnen Fragen in dieses Array dieses immer vergrößern.

Ungefähr so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
WHILE not EOF (f) DO  
BEGIN  
  SetLength (quiz_array, Length (quiz_array) +1);
  read (f, quiz_array[i]);  
  i:=i+1;  
END;

Versucht es mal.

lg Martin