Autor Beitrag
NCortex
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 126

WIN 2000
D7 Enterprise
BeitragVerfasst: Do 18.03.04 16:33 
Ich sollt ja eigentlich an meiner Facharbeit schreiben, habe stattdessen mal sponntan mit nem Spiel angefangen ;-)

naja jedenfalls sieht das so aus: man muss versuchen alle Felder blau zu bekommen.. ist auch noch nicht fertig...

Lerne Delphi inner Schule. Bin aber nicht wirklich gut darin.. also kleinere Fehler nicht beachten ;-)

user defined image

ich lasse bei dem Spiel jeden Schritt in ein Array reinschreiben, der dann nachher in einer Textdatei gespeichert wird. Das funktioniert alles. Laden auch. man kann mein Spiel in verschiedenen Feldgrößen spielen. Wenn nun das geladene Feld ne andere größe hat als das aktuelle, soll das Feld komplett neu erzeugt werden. Manchmal macht der das, und manchmal nicht. Und beim schließen gibt der mir immer eine Zugriffsverletzung aus... obwohl ich eiglich alles mit .free freigebe.

weiß einer woran das liegen kann?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
if Fileexists(filename) then
      begin
        assignfile(g,filename);
        reset(g);
        count := filesize(g);
        setlength(steps,count+1);
        read(g,steps[0]);   //steps[0] enthält neue größe
       // if (n <> steps[0]) then for i := 1 to high(Feld) do Feld[i].Free;
        n := steps[0];   //neue größe Laden
        starte(n);  // neues Feld erzeugen
        end;
        for i := 1 to (count-1do
        begin
        read(g,steps[i]);
        wait(loadspeed);  //verzögerung
        Feld[steps[i]].loadklick(Feld[steps[i]]);
        end;
   closefile(g);

     end else

        showmessage('Datei '+ filename + ' exsistiert nich.');


meine starte(n) prozedur:
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:
procedure Tform1.starte(n:integer);
var i : integer;
begin
GBox1.Visible := false; //Buttons verstecken
Setlength(Feld,n+1);

for i := 1 to n do begin
 if (Feld[i] = nilthen begin   //gucken ob pointer existiert
   Feld[i] := TFeld.Create(self); //neues objekt erzeugen
   Feld[i].Parent := Form1;       //Form zuweisen
   Feld[i].Width := 20;
   Feld[i].Height := 20;
   Feld[i].Canvas.Brush.Style := bssolid;
   Feld[i].OnClick := Feld[i].klick; //Klickprozedur zuweisen;
   Feld[i].index := i;
 end;
  Feld[i].status := false;
  Feld[i].top := ((i-1div round(sqrt(n)))*Feld[1].Height+10 ; //position
  Feld[i].Left := ((i-1mod round(sqrt(n)))*Feld[1].Width+10;
  Feld[i].Visible := true;
  Feld[i].Canvas.Brush.Color := clred;
  Feld[i].Canvas.Rectangle(0,0,Feld[1].width,Feld[1].height);
end;

height := round(sqrt(n)*Feld[1].Height)+65;
width := round(sqrt(n)*Feld[1].Width)+30;   // Form anpassen

stepcount := 0;                 //Schritte zurücksetzen
bluestones := 0;                //Anzahl blauer Felder
setlength(steps,stepcount+1);   //Array initialisieren
Caption := 'Blueshift v.8 '+ inttostr(bluestones)+' steps '+inttostr(stepcount);

end;


Feld ist ein von Timage abgeleites TFeld mit .index und .status

[url] home.arcor.de/ncorte...hi/blueshiftv0.8.zip [/url] <-- für alle, die es sich antuen wollen ;-)

_________________
"...by all means, do not use a hammer." (aus einer IBM Technikerdokumentation ca. 1920)
--->außer es kam von Microsoft<---
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 18.03.04 17:45 
Hallo

bei mir kam keine AV, aber ein Ansatz wäre hier:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Setlength(Feld,n+1);

for i := 1 to n do begin   <<-----  hier beginnst du ab 1 die Felder zu erzeugen
 if (Feld[i] = nilthen begin   //gucken ob pointer existiert
   Feld[i] := TFeld.Create(self); //neues objekt erzeugen

procedure TForm1.FormDestroy(Sender: TObject);
var i : integer;
begin
for i := low(Feld) to high(Feld) do Feld[i].free;
end;

low(Feld) , dynamische array beginnen bei 0 an zu zählen, low(feld) ist damit 0 und du versuchst, ein nicht erzeugstes Objekt freizugeben.
Vielleicht hast du dich auch irgendwo anders mit der Länge vertan.

* den Index bei deinen Imagefeldern brauchst du nicht unbedingt, die Tag-Eigenschaft ist auch gut dafür.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 18.03.04 18:24 
ok, habs, AV kam, hatte was falsch gemacht ;)
Es sind 2 Fehler:

bei der loadliste-procedure solltest du
ausblenden Delphi-Quelltext
1:
if (n <> steps[0]) then for i := 1 to high(Feld) do FreeandNil(Feld[i]);					

schreiben, da du in deiner strarten-proceudure schreibst
ausblenden Delphi-Quelltext
1:
if (Feld[i] = nilthen begin					

Ein free setzt dein Objekt nicht auf Nil, FreeandNil schon, sagt ja auch der Name ;). Sonst werden keinen neuen Felder erzeugt.

Der eigentliche Fehler ist hier:
Deine Procedure Starten
ausblenden Delphi-Quelltext
1:
2:
3:
stepcount := 0;                 //Schritte zurücksetzen        <<<---  Stepcount = 0
bluestones := 0;                //Anzahl blauer Felder
setlength(steps,stepcount+1);   //Array initialisieren       <<---- Array enthält ein Element


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
        count := filesize(g);
        setlength(steps,count+1);       <<<<<- hier setzt du deine array länge
        read(g,steps[0]);
        if (n <> steps[0]) then for i := 1 to high(Feld) do (Feld[i].free);
        n := steps[0];   //neue größe Laden
        starte(n);  // neues Feld erzeugen     <<<<<----- hier wird dein Stpews-array wieder auf 1 element gesetzt 

        setlength(steps,count+1);      <<<<--- hier gehörts hin ;)

        end;
        for i := 1 to (count-1do
        begin
        read(g,steps[i]);     <<<<--- 1)
        wait(loadspeed);  //verzögerung
        Feld[steps[i]].loadklick(Feld[steps[i]]);
        end;


1) Da du dein array bei starte auf ein element verkleinert hast, und es von 0 anbeginnt zu zählen , bist du hier mit steps[1] außerhalb des arrays und es scheppert.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
NCortex Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 126

WIN 2000
D7 Enterprise
BeitragVerfasst: Do 18.03.04 19:40 
Hey, danke noma Frank... hast mir echt geholfen... ich mach dann mal weiter muss mir noch was schönes für die gewinn sequenz ausdenken ;-)

gibt es eigentlich in delphi ne möglichkeit wie in Java nen array direkt mit werten zu belegen? also so wie
ausblenden Quelltext
1:
Steps := (0, 5, 2, 3, 43, .... ); <-- geht das?					

_________________
"...by all means, do not use a hammer." (aus einer IBM Technikerdokumentation ca. 1920)
--->außer es kam von Microsoft<---