![]() |
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:
Also der Button wird gelöscht und vorgemerkt (damit er bei spielende nicht nochmal gelöscht wird, was ja nicht ginge)
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; |
Re: "MineSweeper" - Probleme mit Rundtime-Buttons
Warum zerstörst du den Button überhaupt?
|
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 |
Re: "MineSweeper" - Probleme mit Rundtime-Buttons
Delphi-Quellcode:
sollte reichen
.Enabled := False
|
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:
allerdings auch nicht bewerkstelligen...
MineBtn[ACol, ARow].Down := TRUE
|
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 ![]() Der dort gezeigte Lösungsweg funktioniert - habs selbst schon eingesetzt. |
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! |
Re: "MineSweeper" - Probleme mit Rundtime-Buttons
Zitat:
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. |
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? |
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. |
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