Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Drag&Drop für Kartenspiel (https://www.delphipraxis.net/130173-drag-drop-fuer-kartenspiel.html)

Hybrid666 4. Mär 2009 14:43


Drag&Drop für Kartenspiel
 
Servus,

ich programmiere grade in Lazarus ein kleines Kartenspiel und ich will karten per Drag&Drop legen können.

Kann mir einer mal helfen und mir Tipps geben wie man das am besten macht? Es sind TImages die auf andere TImages gelegt werden sollen. Es gibt dafür ja ereignisse, aber ich hab keine Ahnung wie man das macht.

Danke für jede hilfe.

MfG

Cyf 4. Mär 2009 19:45

Re: Drag&Drop für Kartenspiel
 
Drag und Drop wird hier meiner Meinung nach ganz gut erklärt.

_frank_ 5. Mär 2009 16:28

Re: Drag&Drop für Kartenspiel
 
quick & dirty:

du hast panels, wo je ein TImage drauf liegt. den Images weist du diese Methode als OnMouseDown zu:
Delphi-Quellcode:
procedure TForm1.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var pnl:TPanel;
begin
  if Button=mbLeft then
  begin
    ReleaseCapture;
    pnl:=((sender as TImage).parent as TPanel);
    pnl.BringToFront;
    pnl.Perform(WM_NCLBUTTONDOWN,HTcaption,0);
  end;
end;
Gruß Frank

Hybrid666 6. Mär 2009 09:23

Re: Drag&Drop für Kartenspiel
 
danke erstmal für die antworten.

Also bei der Methode von Frank gibbet Folgendes Problem:

Ich entwickle unter Linux mit Lazarus, das erste problem: Lazarus kennt ReleaseCapture nicht und das zweite problem ist das die methode mit windows messages funktioniert, was ein bisschen problematisch ist unter linux ;)

Noch andere "quick 'n' dirty's"?

MfG

matashen 6. Mär 2009 10:13

Re: Drag&Drop für Kartenspiel
 
Dann verwende doch die Drag & Drop Events - gibts die unter Linux??

Also Dragmode bei den Eigenschaften auf dmautomatic
Bei OnDragover dann in etwa sowas
Delphi-Quellcode:
if source=image1 then accept:=true;
oder auch
Delphi-Quellcode:
if (source as TImage) then accept:=true;
um das akzeptieren des gezogenen Elements zu erlauben

Dann kannst du bei
OnDragDrop auswerten was mit dem gedroppten Elemnt gamcht wird

Das sollte dann auch funzn - zumindest unter WIN

Gruß Matthias

Hybrid666 7. Mär 2009 11:40

Re: Drag&Drop für Kartenspiel
 
Jo, die gibt es, die funzen aber ein wenig verbuggt, also das verbuggte sind die cursor, die verändern sich da teilweiße wahllos und wenn man mim draggen fertig ist, bleibt das oft ein "hier kannst du nicht hindraggen"-symbol ;).

Außerdem wollte ich das ganze einfach ein wenig schöner machen und die karte mit der maus mitgehen lassen, so wie in solitaire

MfG

Cyf 7. Mär 2009 13:42

Re: Drag&Drop für Kartenspiel
 
Zitat:

Zitat von Hybrid666
Außerdem wollte ich das ganze einfach ein wenig schöner machen und die karte mit der maus mitgehen lassen, so wie in solitaire

Ich behaupte jetzt einfach mal, hättest du dir die Mühe gemacht den Link zu lesen, wäre das gelöst. :mrgreen:

_frank_ 7. Mär 2009 14:50

Re: Drag&Drop für Kartenspiel
 
also nochmal manuell, sollte aso in der clx funktionieren:

Delphi-Quellcode:
    { Private-Deklarationen }
    fDragging:boolean;
    fRelPos:TPoint;
...
procedure TForm1.PanelMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  fDragging:=true;
  fRelPos:=Point(x,y);
  (sender as TPanel).Cursor:=crCross;
end;

procedure TForm1.PanelMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  fDragging:=false;
  (sender as TPanel).Cursor:=crDefault;
end;

procedure TForm1.PanelMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if fDragging then
  begin
    (sender as TPanel).left:=panel1.left+X-fRelPos.x;
    (sender as TPanel).top:=panel1.top+Y-fRelPos.y;
  end;
end;
HTH Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 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