Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi "MineSweeper" - Probleme mit Rundtime-Buttons (https://www.delphipraxis.net/121697-minesweeper-probleme-mit-rundtime-buttons.html)

64Jabor 2. Okt 2008 20:13

Re: "MineSweeper" - Probleme mit Rundtime-Buttons
 
Wenn ein Button gedrückt wird - ein Button der keine Mine sein soll/ist.
Dabei passiert folgendes:

Delphi-Quellcode:
procedure TFrmMS.SmileForUser(ACol, ARow: integer);
var TopLeft, BtmRight: TPoint;
begin
 MineBtn[ACol, ARow].Destroy;
 BtnDestroyed[ACol, ARow] := TRUE;

 TopLeft.X := MineBtn[0, 0].Left + ACol*MineBtn[0, 0].Width;
 TopLeft.Y := MineBtn[0, 0].Top + ARow*MineBtn[0, 0].Height;
 BtmRight.X := TopLeft.X + MineBtn[0, 0].Width;
 BtmRight.Y := TopLeft.Y + MineBtn[0, 0].Height;
 Canvas.TextRect(rect(TopLeft, BtmRight), TopLeft.X, TopLeft.Y, MinesArround(ACol, ARow));
 BtnFace.Caption := ':-)';
end;
Also der Button wird gelöscht und vorgemerkt (damit er bei spielende nicht nochmal gelöscht wird, was ja nicht ginge)

mkinzler 2. Okt 2008 20:16

Re: "MineSweeper" - Probleme mit Rundtime-Buttons
 
Warum zerstörst du den Button überhaupt?

64Jabor 2. Okt 2008 20:19

Re: "MineSweeper" - Probleme mit Rundtime-Buttons
 
Das sollte egtl nur zur Anschauung dienen!
Egtl wollte ich die Caption des Btns ändern und ihn Down machen, sodass jeder sieht wieviele Minen um den Button herum sind.
Testweise habe ich ihn der Einfachheit halber erstmal zerstört, geht aber in die Hose deshalb steige ich jetzt mal auf diese Version um...

Es sähe meienr Meinung nach nur einfach besser aus wenn das Feld frei wäre abgesehen von der Zahl, wenn man einen Button anklickt der keine Mine war

mkinzler 2. Okt 2008 20:20

Re: "MineSweeper" - Probleme mit Rundtime-Buttons
 
Delphi-Quellcode:
.Enabled := False
sollte reichen

64Jabor 2. Okt 2008 20:24

Re: "MineSweeper" - Probleme mit Rundtime-Buttons
 
Hm Moment, dann klappt ja nur der Button nicht mehr, ich möchte ja das der Button
1. als caption die Anzahl der Minen um sich herum hat (bereits erledigt)
und 2. GUT SICHTBAR ist, dass er bereits gedrückt worden ist

Das lässt sich mit
Delphi-Quellcode:
 MineBtn[ACol, ARow].Down := TRUE
allerdings auch nicht bewerkstelligen...

Helmi 2. Okt 2008 20:30

Re: "MineSweeper" - Probleme mit Rundtime-Buttons
 
Hallo,

ich glaube die Fehlermeldung kommt daher, dass du im Eventhandler
des gedrückten Buttons Diesen selbst löscht.

Das heisst du löscht den Button in seinem Eventhandler.
Das geht nicht - das muss krachen - du ziehst ja dem Button
den Boden unter ihm weg.

Um dieses Problem zu umgehen, gibt es hier im Forum schon eine Lösung
Im Großen und Ganzen wird anstatt den Button im Eventhandler
zu zerstören, eine Windows-Message an die eigene Application
geschickt in der dann dieser Button zerstört wird.

[edit]
Das Zerstören eines Buttons in seinem eigenen Eventhandler
wurde hier schon mal diskutiert.
Der dort gezeigte Lösungsweg funktioniert - habs selbst
schon eingesetzt.

64Jabor 2. Okt 2008 20:33

Re: "MineSweeper" - Probleme mit Rundtime-Buttons
 
Vielen Dank Helmi,

das macht Sinn, man sägt ja auch nicht an seinem eigenen Ast *zweideutig xD*
Aber wieso krachen dann nur die letzten paar und die ersten 50 klappen ohne Probleme?
Wie auch immer habe ich nun damit aufgehört die Buttons zu zerstören und stattdessen mache ich sie jetzt nun nur kenntlich - was mir aber noch nicht so recht geligen will!

Helmi 2. Okt 2008 20:37

Re: "MineSweeper" - Probleme mit Rundtime-Buttons
 
Zitat:

Zitat von 64Jabor
Aber wieso krachen dann nur die letzten paar und die ersten 50 klappen ohne Probleme?

ich denke du löscht die Buttons um den gedrückten button herum und dann den gedrückten Selbst.
Dann kommt es erst zu einem Crash wenn du zu dem Gedrückten kommst.
Der Eventhandler der Anderen wird ja zu diesem Zeitpunkt nicht aufgerufen.

64Jabor 2. Okt 2008 20:56

Re: "MineSweeper" - Probleme mit Rundtime-Buttons
 
Nein, ich lösche immer nur den Button auf den geklickt wird, oder besser wurde, denn wie gesagt habe ich mich davon distanziert - mit dem freundigen Nachricht dass keine Zugriffsverletzungen mehr erscheinen - dafür ein Stack-Überlauf der sich gewaschen hat xD

Ich mussj a bei jedem Button-Druck prüfen, on benachbarte Felder ebenfalls an kein Minenfeld stoßen, dazu prüfe ich mittels einer Funktion ob ein benachbartes Feld eine Mine hat und lasse mir dann einen String geben der der umgewandelte Integer-Wert ist.
Da ich das wiederrum aber auch für jede weiterhin frei gewordene Feld tun muss - bis iwann ALLE entweder am Rand des Spielfeldes sind oder an eine Mine angrenzen, habe ich das getan (unter Beachtung der Ränder!).
Das scheint aber zu viel zu sein, denn der Stack ist ja der Ort, an dem die Programm-Einstiegs-/Haltepunkte gespeichert werden, nicht wahr?

Helmi 2. Okt 2008 21:00

Re: "MineSweeper" - Probleme mit Rundtime-Buttons
 
irgendwie reden wir aneinander vorbei...
ich schau dass ich ne Lösung finde für deine Zugriffsverletzung
dann machst du in der Zwischenzeit etwas ganz anderes und
hast jetzt mit dem ganz Anderen ein Problem...

Bleib doch mal auf eine Schiene und bring das zu Laufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:44 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz