Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   "Sichtbares" Versetzen eines Buttons mit der Maus (https://www.delphipraxis.net/156324-sichtbares-versetzen-eines-buttons-mit-der-maus.html)

Jazzman_Marburg 28. Nov 2010 10:04

"Sichtbares" Versetzen eines Buttons mit der Maus
 
Hallo Gemeinde,
ich habe gerade garkeine rechte Idee wie ich folgendes realsiere -- und hoffe auf eure Kommentare:
Ich erzuege in meiner Klasse ein SpeedButton und stelle ihn auf einem Panel dar. Wenn ich nun mit der Maus auf diesen Button klicke und die Maus versetze wird der Button an die neuen Maus Position versetzt. Soweit prima.
Ich möchte aber nun, dass der Button während des Versetzens auch dargestellt wird -- wie gehe ich das an?

Wenn die Maus-Taste losgelassen wird (BtnMouseUp) stelle ich den Button so an der neuen Position dar:
Delphi-Quellcode:
PROCEDURE TMyClass.BtnMouseUp(Sender: TObject; Button: TMouseButton;
                                 Shift: TShiftState; X, Y: Integer);

BEGIN

 ( SENDER AS TSpeedButton ).Left := ( SENDER AS TSpeedButton ).Left + X; // nur horizontal Verstzen erlaubt
...
Ich vermute ich müßte jetzt in dem MouseMove-Event den Button darstellen -- bis die Taste losgelassen wird. Habe keine rechte Idee, wie ich dies tun kann:

Delphi-Quellcode:
PROCEDURE TMyClass.MouseMove(ShIFt: TShIFtState; X, Y: INTEGER);

BEGIN
  // ???
END;
Jemand eine Idee?

Danke & Gruß
Jazzman

toms 28. Nov 2010 10:23

AW: "Sichtbares" Versetzen eines Buttons mit der Maus
 
Suche mal nach [DP]ReleaseCapture WM_SYSCOMMAND $F012[/DP]

Edit: DP-Tags funktionieren irgendwie nicht...

himitsu 28. Nov 2010 10:55

AW: "Sichtbares" Versetzen eines Buttons mit der Maus
 
Zitat:

Zitat von toms (Beitrag 1064579)
Edit: DP-Tags funktionieren irgendwie nicht...

Ja, die Suchtags mögen verschiedene Zeichen nicht, :wall:
wie z.B. $ oder :

[GOOGLE]site:delphipraxis.net ReleaseCapture WM_SYSCOMMAND[/GOOGLE] geht och nicht

DeddyH 28. Nov 2010 11:12

AW: "Sichtbares" Versetzen eines Buttons mit der Maus
 
Dieser Thread enthält ein paar interessante Ansätze.

Jazzman_Marburg 28. Nov 2010 14:03

AW: "Sichtbares" Versetzen eines Buttons mit der Maus
 
Vielen Dank -- den Ansatz habe ich wohl verstanden. Ber bei der Umsetzung hagelt es noch Probleme...

Delphi-Quellcode:
    PROCEDURE MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); OVERRIDE; // Wieso geht das nicht?
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); OVERRIDE;
In meiner Klasse hatte ich das Event "MouseUp" wie oben deklariert -- was auch prima klappte. Aber als ich versuchte "MouseDown" zu deklarieren kommt ein Compiler-Fehler:

"Deklaration von MouseDown unterscheidet sich von vorheriger Deklaration.

Aber den Parameter "Sender: TObject;" benötige ich doch, dachte ich...
Was mache ich denn wohl falsch?

Vielen Dank
Jazzman

DeddyH 28. Nov 2010 14:23

AW: "Sichtbares" Versetzen eines Buttons mit der Maus
 
Wovon ist denn Deine Klasse abgeleitet?

[edit] Und bist Du sicher, dass die Parameterliste im interface- und implementation-Abschnitt genau gleich ist? [/edit]

sx2008 28. Nov 2010 15:50

AW: "Sichtbares" Versetzen eines Buttons mit der Maus
 
Jetzt muss ich doch mal fragen:
Warum verwendest du keine ActionList + eine Toolbar?
Auf der Toolbar richten sich die Buttons von ganz alleine aus und der Benutzer braucht nur die Reihenfolge festlegen.
Buttons, die man frei positionieren kann, machen die Benutzeroberfläche nicht unbedingt besser sondern eher schlechter (so zumindest ist meine Erfahrung).

himitsu 28. Nov 2010 16:11

AW: "Sichtbares" Versetzen eines Buttons mit der Maus
 
Zitat:

In meiner Klasse hatte ich das Event "MouseUp" wie oben deklariert -- was auch prima klappte. Aber als ich versuchte "MouseDown" zu deklarieren kommt ein Compiler-Fehler:
Wenn gemeckert wird, dann schau doch mal nach, wie die zu überschreibende Funktion aussieht ... genauso muß deine Funktion auch aussehn ... also vermutlich ohne das Sender.

MouseDown müßte doch die selbe Signatur besitzen, wie MouseUp ... also warum gedenkst du nun dieses Sender zu benötigen?

PS: Da du dich in deiner eigenen Komponente befindest, sollte och der "Sender" klar sein ... und zwar deine eigene Komponente. (also das Delphi-Referenz durchsuchenSelf)

Der Verlinkte Code steckt als Methode in einem Formular, wo die Ereignisse nicht von der Form ausgelöst werden, sondern von einer anderen Komponente und da muß man natürlich irgendwie rausbekommen, von wo das Ereignis kommt (darum werden den OnXYZ-Ereignissen ein Sender mitgelieft).

Jazzman_Marburg 28. Nov 2010 16:19

AW: "Sichtbares" Versetzen eines Buttons mit der Maus
 
(Sehe gerade die Antwort von himitsu -- ich glaube, das war der richtige Hinweis (Self). In der eigenen KLasse ist der Sender tatsächlich nicht nötig. Danke!!)


Zitat:

Zitat von DeddyH (Beitrag 1064634)
1. Wovon ist denn Deine Klasse abgeleitet?
2. Und bist Du sicher, dass die Parameterliste im interface- und implementation-Abschnitt genau gleich ist?

Hi!

1. TCustomControl2. Ja. Problem ist, das ich schon im Interface kein:
PROCEDURE MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); OVERRIDE;
anlegen kann: "Deklaration von MaouseDown unterscheidet sich von vorheiger Deklaration".
Hingegen ein:
PROCEDURE MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); OVERRIDE;
Kein Problem ist.

Zitat:

Zitat von sx2008 (Beitrag 1064642)
Jetzt muss ich doch mal fragen:
Warum verwendest du keine ActionList + eine Toolbar?
...

Naja, so einfach ist das nun mal nicht. Es handelt sich um eine graphische Anwendung, wo der User Objekt frei bewegen können soll. Da ist keine ActionList etc. verwendbar.

Das Bewegen des Button klappt ja such schon prima -- nur möchte ich, das der User den Button während des Versetzens sieht.

Vielen Dank!
Gruß
Jazzman

Amateurprofi 28. Nov 2010 18:58

AW: "Sichtbares" Versetzen eines Buttons mit der Maus
 
@Jazzman:

hab mal kurz was für dich zusammengetippert.
Versuch mal dein Problem entsprechend zu lösen.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    SpeedButton1: TSpeedButton;
    procedure SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpeedButton1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure SpeedButton1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    flastpos:TPoint;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SpeedButton1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var r:TRect;
begin
   if [ssLeft,ssRight]*Shift=[ssLeft,ssRight] then exit;
   with TControl(Sender) do begin
      flastpos:=ClientToScreen(Point(x,y));
      // Der Rest ist nur, um sicherzustellen, daß der Button auf dem Panel bleibt
      r:=Parent.ClientRect;
      r.TopLeft:=Parent.ClientToScreen(r.TopLeft);
      r.BottomRight:=Parent.ClientToScreen(r.BottomRight);
      inc(r.Left,x);
      dec(r.Right,Width-x);
      inc(r.Top,y);
      dec(r.Bottom,Height-y);
      ClipCursor(@r);
   end;
end;

procedure TForm1.SpeedButton1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var mpos:TPoint;
begin
   if [ssLeft,ssRight]*Shift=[] then exit;
   with TControl(Sender) do begin
      mpos:=ClientToScreen(Point(x,y));
      x:=mpos.x-flastpos.x;
      y:=mpos.y-flastpos.y;
      SetBounds(Left+x,Top+y,Width,Height);
      flastpos:=mpos;
   end;
end;

procedure TForm1.SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if [ssLeft,ssRight]*Shift<>[] then exit;
   ClipCursor(nil);
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:03 Uhr.
Seite 1 von 2  1 2      

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