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 ;-)
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]); n := steps[0]; starte(n); end; for i := 1 to (count-1) do begin read(g,steps[i]); wait(loadspeed); 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; Setlength(Feld,n+1);
for i := 1 to n do begin if (Feld[i] = nil) then begin Feld[i] := TFeld.Create(self); Feld[i].Parent := Form1; Feld[i].Width := 20; Feld[i].Height := 20; Feld[i].Canvas.Brush.Style := bssolid; Feld[i].OnClick := Feld[i].klick; Feld[i].index := i; end; Feld[i].status := false; Feld[i].top := ((i-1) div round(sqrt(n)))*Feld[1].Height+10 ; Feld[i].Left := ((i-1) mod 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; stepcount := 0; bluestones := 0; setlength(steps,stepcount+1); 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] = nil) then begin Feld[i] := TFeld.Create(self); 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] = nil) then 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; bluestones := 0; setlength(steps,stepcount+1); |
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]; starte(n); setlength(steps,count+1); <<<<--- hier gehörts hin ;)
end; for i := 1 to (count-1) do begin read(g,steps[i]); <<<<--- 1) wait(loadspeed); 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? |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!