Autor Beitrag
MasterBasti
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Windows XP
D6 Prof.
BeitragVerfasst: Sa 24.01.04 16:55 
Hallo alle zusammen!

Ich hoffe, dass das Posting hier im richtigen Forum dinne ist, wenn nicht entschuldige ich mich jetzt schon mal, aber da ich ein Problem bzgl. meines Spieles mit DXDRAw habe, denke ich mal das es hier rein kommt.

Aber jetzt mal zu meinem Problem:

Also... einen schönen Tages beschloss ich mich, wiedereinmal an der weiterentwicklung meines Spieles zu arbeiten... vorher lief alles ganz gut.. ohne Probleme. Doch dann... ganz plötzlich bekam ich einen Fehler.

Der wie folgt lautet:

Zitat:
Die Anweisung "0x0f44234" verweist auf Speicher in "0x04r53485". Der Vorgang read konnte nicht auf dem Speicher durchgeführt werden.


Da sich nach dieser Fehlermdlung in Delpi immer die DxDraw Unit öffnete, bin ich davon ausgegangen, dass der Fehler da liegen muss.

Nach ein bisschen ausklammern und rum experimentieren, habe ich rausgefunden, das folgender Code dafür verantwortlich ist:

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:
23:
24:
25:
// Buttons erstellen
  for i := 1 to 11 do begin
  Buttons[i] := TBAckgroundSprite.Create(Form1.DXSpriteEngine1.Engine);

    with Buttons[i] do begin
    Image := DXImageList1.Items[i-1];
    SetMapSize(1,1);
    z := 10;
    x := Form1.DXDraw1.Display.Width - 60;
    if i = 1 then Buttons[i].Y := 100;
    if (i > 1) and NOT (i = 7) and NOT (i = 9) and NOT (i = 10) then y := Buttons[i-1].Y + 50;
    if (i = 7) then y := Buttons[i-1].Y + 100;
      if (i = 9) then begin y := Buttons[i-1].Y + 100;
      Buttons[i].X := 0;
      Buttons[i].Y := 100;
      end;
      if (i = 10) then begin
      Buttons[i].Y := Buttons[i-1].Y + 50;
      Buttons[i].X := 0;
      end;

    Tile := False;
    end;
  end;
  // Ende


Das erstellen dieser Buttons, ist und war noch NIE ein Problem, wenn ich allerdings mein Spiel beende, dann kommt diese Meldung...

Nicht das er jetzt denkt, ich gebe diese Buttons nicht wieder frei, doch das mache ich :wink:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Procedure EndGame;
var i : Integer;
begin
  if Not (Form1 = Nil) then begin
    for i := 1 to 11 do begin
    if NOT (Form1.Buttons[i] = Nil) then Form1.Buttons[i].Free;
    end;

  //Form1.DxDraw1.Finalize;
  end;
end;


Kann mir da jemand helfen ?
Werden noch informationen gebraucht ?

MfG

MasterBasti

Moderiert von user profile iconMotzi: Quote- durch Delphi-Tags ersetzt
KidPaddle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: So 25.01.04 12:37 
Welcher Typ hat Buttons? Vom Typ Array? Wenn ja, dann sieht es mich so aus, das Du die Schalter 2 x mal löscht. Da Du nach Form1.Buttons[i].Free kein Form1.Buttons[i] := nil zuweist, wird Buttons nochmals von dem Destructor Destroy freigebenen und damit zum zweiten Mal.

Entweder läßt Du dein manuelle Freigabe weg oder setzt den Pointer in Form1.Buttons[i] auf nil.

Gruß
KidPaddle
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 25.01.04 12:41 
ausblenden Delphi-Quelltext
1:
Buttons[i] := TBAckgroundSprite.Create(Form1.DXSpriteEngine1.Engine);					

Dein SpriteEngine ist der Owner und somit dafür verantwortlich die Buttons wieder freizugeben. Und jetzt crasht es, wenn du sie selber wieder freigibst - vermute ich mal.
MaxiTB
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: So 25.01.04 12:43 
Gebe KidPaddle recht ... das könnte das Problem sein.

    Tip am Rande: Du solltest immer die Funktion FreeAndNil in der SysUtils verwenden statt Free alleine. Dann können solche Fehler nicht auftreten (was besonders wichtig ist, wenn man mehr als nur einen thread in der App laufen hat).

_________________
Euer Mäxchen
Wer früher stirbt, ist länger tot.
MasterBasti Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Windows XP
D6 Prof.
BeitragVerfasst: Mo 26.01.04 21:28 
Ok, danke erstmal für die Antwort!

Ich probier des jetzt gerade mal aus.... *mom*

Also, ich habe das jetzt gerade mal so versucht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
if Not (Form1 = Nil) then begin
if NOT (Form1.Buttons[i] = Nil) then Form1.DXSpriteEngine1.FreeOnRelease;


Form1.Release;
end;


Allerdings ohne erfolg.

Als der Code noch lief, stand in dieser EndGame Procedure bloß dies drinne und das funktionierte:

ausblenden Delphi-Quelltext
1:
2:
if Not (Form1 = Nil) then Form1.Release;
  end;


Und dann auf einmal nicht mehr.
Ich versteh das nicht, kaum lasse ich die Buttons weg, geht des wieder!

Komisch! Aber es hat auf jeden Fall mit der freigabe zu tun oder ?
Ich hab auch mal bei Google gesucht, da schreiben die das auch alle.

Ein guter Tipp, den ich mal gehört habe:

Zitat:

Zu jedem create gehört auch ein Free


Naja, danke nochmal für eure Hilfe.
Vielleicht fällt euch ja nochwas ein.

MfG

MasterBasti

Moderiert von user profile iconPeter Lustig: Quote- durch Delphi-Tags ersetzt
MasterBasti Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Windows XP
D6 Prof.
BeitragVerfasst: Mo 26.01.04 21:36 
@ KidPaddle

Buttons ist vom Typ

ausblenden Delphi-Quelltext
1:
Buttons : Array[1..10] of TBackgroundSprite;					


und ist in einer anderen Unit ausgelagert.




Die Unit in der die Procedure EndGame liegt, heisst Engine (wird zu einer DLL Datei) und ist gleichzeitig die Unit, die das Form1 erzeugt und nachher auch wieder freigeben soll. Ich hoffe das war verständlich :wink:

Alle Units befinden sich jedoch im selben Projekt, nämlich der DLL.

MfG

MasterBasti


EDIT:

Jungs... fällt euch da was auf ?
Vergleicht das bitte mal.... und achtet auf die Grösse des Arrays. *gegen den Kopf hau*

ausblenden Delphi-Quelltext
1:
Buttons : Array[1..10] of TBackgroundSprite;					



ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if Not (Form1 = Nil) then begin
  Form1.DXSpriteEngine1.FreeOnRelease;
  
    for i := 1 to 11 do begin
    Form1.Buttons[i] := Nil;
    //if NOT (Form1.Buttons[i] = Nil) and (i = 11) then Form1.DXSpriteEngine1.FreeOnRelease;
    end;

  //Form1.Release;
  end;


Junge Junge, sowas darf nicht passieren.... naja, wenigstens ist das Prob. gelöst. Danke an euch, besondern an Paddle, sonst hätte ich wohl erstmal nicht dannach geguckt :oops:

MfG

MasterBasti

Moderiert von user profile iconPeter Lustig: Quote- durch Delphi-Tags ersetzt
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 26.01.04 21:54 
Vorweg.. bitte benutze in Zukunft die Delphi-Tags um deinen Code zu formatieren.. einfach [ delphi ] bzw [/ delphi ] (natürlich ohne Leerzeichen) am Anfang bzw am Ende des Codes schreiben. Danke!

Solche Fehler lassen sich ganz einfach aufspüren, wenn man bei den Projekt-Optionen das "Range checking" aktiviert hat.. das sollte man meiner Meinung nach in der Entwicklungsphase immer aktiviert haben..!

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!