Entwickler-Ecke

Multimedia / Grafik - Problem beim initialisieren von Timage Feldern


NCortex - Do 18.03.04 16:33
Titel: Problem beim initialisieren von Timage Feldern
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?


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:

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] http://home.arcor.de/ncortex/delphi/blueshiftv0.8.zip [/url] <-- für alle, die es sich antuen wollen ;-)


Keldorn - Do 18.03.04 17:45

Hallo

bei mir kam keine AV, aber ein Ansatz wäre hier:

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


Keldorn - Do 18.03.04 18:24

ok, habs, AV kam, hatte was falsch gemacht ;)
Es sind 2 Fehler:

bei der loadliste-procedure solltest du

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

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

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



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


NCortex - 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

Quelltext
1:
Steps := (0, 5, 2, 3, 43, .... ); <-- geht das?