Entwickler-Ecke

Sonstiges (Delphi) - Komponenten zur Laufzeit per Drag and Drop bewegen


Xardas008 - Mo 14.05.07 08:36
Titel: Komponenten zur Laufzeit per Drag and Drop bewegen
Hi ihr,

jeder kennt sicher das Spiel 4 Gewinnt. Dieses versuche ich im Moment in Delphi umzusetzen. Habe Links und Rechts vom Spielfeld je 21 Spielsteine positioniert. Diese würde ich am liebsten per Drag & Drop über die jeweilige Spalte zu ziehen. Das Fallenlassen des Steins bekomm ich dann sicher hin.

Andere Möglichkeit an die ich Dachte wäre, man klickt über die jeweilige Spalte. Doch ein Button mit der Eigenschaft visible = false lässt zur Laufzeit leider keinen Klick zu.

Das mit dem Drag & Drop wär schon das beste was ginge.

Wie kann ich das umsetzen?


hui1991 - Mo 14.05.07 11:01

Hi,

Im Forum gibt es schon eine Lösung von mir.
Der Letzte Beitrag war ca. 1:30 Stunden später als von dem Thema.
Falls es doch unter geht, dann hier der Link.
http://www.delphi-forum.de/viewtopic.php?t=71763
So kann man das umsetzen.
Denke das hilf dir ein Stück weiter.
An meinem Beispiel kannst du die Idee mit dem Raster sehen.
Und die Verbesserung ist ohne Raster.

MfG
hui1991


Lannes - Mo 14.05.07 13:29

Hallo,

zu diesem Thema dürfte der Tipp interessant sein:
dsdt: TWinControl zur Laufzeit mit der Maus skalieren/verschieben [http://www.dsdt.info/tipps/?id=449]


Xardas008 - Di 15.05.07 15:51

Ok das verschieben funktioniert.

Wie kann ich aber abfragen, über welcher Spalte ich stehe wenn ich die Maustaste wieder loslasse? Kann man da eine unsichtbare Komponente hinsetzen mit welcher ich das dann feststelle?

Das die Komponente anschließend unsichtbar wird ist ja kein Problem.


Lannes - Di 15.05.07 16:03

Hallo,

wie oder durch was sind denn Deine Spalten definiert?

Das Ereignis OnMousUp liefert in den Variablen X und Y die Koordinaten der Maus die man dann für die entsprechenden Berechnungen verwenden kann.


Xardas008 - Di 15.05.07 17:41

Hi,

die Spalten sind wiefolgt aufgebaut: 7 Spalten à 6 Zeilen, dargestellt durch Gruppenboxen.

Diese sind wiefolgt benannt: Grp_Spalte1-7_Zeile1-6 und darüber dachte ich könnte man vielleicht Labels setzen, wo dann beim MouseUper-Ereignis die Koordinate an das jeweilige Label übergeben wird, sodass klar ist in welcher Spalte der Stein runterfällt. Muss mich da mal wenn ich etwas Zeit finde näher mit beschäftigen.


_frank_ - Di 15.05.07 20:07

Moin,
ich hab da mal fix was zusammengeschrieben...so in etwa könnte man es realisieren
hab sogar schon bisschen das Ownerdraw vorbereitet ;)

HTH Frank


Xardas008 - Mi 16.05.07 07:33

So anbei habe ich ein Bild der GUI angefügt, damit sichtbar ist wie ich das bisher habe. Welche Komponenten könnte ich über den Spalten positionieren und wie stelle ich dann fest, ob die Figur über eben dieser Komponente losgelassen wurde?

Das ist der knackpunkt im Moment. Naja werde ma schaun ob ich am Wochenende genug Zeit in das Projekt investieren kann.


_frank_ - Mi 16.05.07 19:46

hast du dir mal mein beispiel-programm angeschaut?
hab das beispiel mal bisschen deiner GUI angepasst...
(normal bin ich gegen das Vorkauen von Lösungen, aber ich wollte mich mal wieder mit Ownerdraw beschäftigen)

dürfte eigentlich alles soweit hinhauen, nur das focusrect hab ich auf die Schnelle nicht wegbekommen...es fehlt lediglich die logik des spiels (abwechselde züge, Prüfung auf Reihe)

Gruß Frank


Blackheart666 - Mi 16.05.07 19:50

user profile icon_frank_ hat folgendes geschrieben:
hast du dir mal mein beispiel-programm angeschaut?
hab das beispiel mal bisschen deiner GUI angepasst...
(normal bin ich gegen das Vorkauen von Lösungen, aber ich wollte mich mal wieder mit Ownerdraw beschäftigen)

dürfte eigentlich alles soweit hinhauen, nur das focusrect hab ich auf die Schnelle nicht wegbekommen...es fehlt lediglich die logik des spiels (abwechselde züge, Prüfung auf Reihe)

Gruß Frank

Hättest Du dich etwas angestrengt, wäre der Rest doch auch kein Problem - oder ? :wink:


_frank_ - Mi 16.05.07 20:11

hehe,
glaube nicht, dass das ein Problem wäre, aber ich will ihm ja kein ganz fertiges Programm liefern ;)
aber um ehrlich zu sein, schreibe ich grade noch dran rum und versuche Drag-Images zu implementieren (auch noch nicht so richtig gemacht), rein aus Interesse :)

Gruß Frank


Xardas008 - Mi 16.05.07 20:48

Hi,

erstmal danke für deine Mühen, werde mir das ganze morgen nochmal genauer anschauen.

Aber ne Frage, du benutzt da ne Komponente, ist die unter Delphi 6 verfügbar? Wenn nein hat sich das nämlich eh erledigt da mein Lehrer keine andere Delphi Version hat. Naja werde mal schauen ob ich das auch so schaffe.

Man müsste theoretisch abfragen, bei welcher Koordinate man die Maus losgelassen hat (ist ja schon gegeben, einfach die X und Y Koordinaten nehmen) und über welcher Spalte diese ist, also die Spalte 1 fängt z.B. bei 30 an und hört bei 50 auf, wo dann die Spalte 2 beginnt, nur die Höhe muss man schauen, die sollte dann auch definiert sein, wenn man diese Koordinaten kennt (Könnten durch Labels festgelegt werden) lässt sich damit ein Ereignis aufrufen welches die jeweilige Spalte dann füllt. Naja werd das schon irgendwie hinbekommen.


_frank_ - Mi 16.05.07 21:17

ich benutze standard-komponenten von Delphi 3 ;), unter D7 funktioniert es auch ohne Probleme...
somit sollte das unter D6 auch laufen...

wozu willst du die Höhe ermitteln? ich kenn 4gewinnt nur so, dass du die scheiben einfach reinschmeist und die fallen so tief, bis sie auf ner anderen zu liegen kommen. und soweit funktioniert das Programm schon.

//edit
wenn du absolut kein grid nehmen willst, hilft vielleicht die grid.zip von hier:
http://www.fw-web.de/units.htm

//nochmal edit
da mein Dragimage immer vom Ownerdraw des Stringgrids übermalt wurde und ich immer den Cursor-pfeil gesehen habe (showcursor(false) hat nicht geholfen...), hab ich mich entschlossen mir einen dynamischen Cursor zu erstellen ;)

Gruß Frank


Lannes - Mi 16.05.07 22:44

user profile iconXardas008 hat folgendes geschrieben:
...Naja werde mal schauen ob ich das auch so schaffe.

Man müsste theoretisch abfragen, bei welcher Koordinate man die Maus losgelassen hat (ist ja schon gegeben, einfach die X und Y Koordinaten nehmen) und über welcher Spalte diese ist, also die Spalte 1 fängt z.B. bei 30 an und hört bei 50 auf, wo dann die Spalte 2 beginnt....
mal ein Ansatz zum Nachdenken:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
case X of
  30..50 : begin
           //...
           end;
  51..70 : begin
           //...
           end;
//...


Ps.: aber ich würde auch ein StringGrid als Spielfeld verwenden :wink: