![]() |
"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:
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:
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 ...
Delphi-Quellcode:
Jemand eine Idee?
PROCEDURE TMyClass.MouseMove(ShIFt: TShIFtState; X, Y: INTEGER);
BEGIN // ??? END; Danke & Gruß Jazzman |
AW: "Sichtbares" Versetzen eines Buttons mit der Maus
Suche mal nach [DP]ReleaseCapture WM_SYSCOMMAND $F012[/DP]
Edit: DP-Tags funktionieren irgendwie nicht... |
AW: "Sichtbares" Versetzen eines Buttons mit der Maus
Zitat:
wie z.B. $ oder : [GOOGLE]site:delphipraxis.net ReleaseCapture WM_SYSCOMMAND[/GOOGLE] geht och nicht |
AW: "Sichtbares" Versetzen eines Buttons mit der Maus
![]() |
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:
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:
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; "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 |
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] |
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). |
AW: "Sichtbares" Versetzen eines Buttons mit der Maus
Zitat:
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 ![]() 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). |
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:
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:
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 |
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. |
AW: "Sichtbares" Versetzen eines Buttons mit der Maus
Hi Klaus,
ja -- vielen Dank! Es tut! Ein zwei Kleinigkeiten zu ändern -- aber es tut's! Lieben Dank für Deine Mühe :thumb: Gruß Jazzman |
AW: "Sichtbares" Versetzen eines Buttons mit der Maus
@Jazzman,
gern geschehen - und war auch keine große Mühe, weil das Standardroutinen aus meinen Projekten sind. Was ich nicht erwähnt habe: Mit dem Clip-Cursor Teil kannst du auch recht einfach festlegen, daß der Button nur in einer Richtung bewegt werden kann. Wenn z.B. nur eine horizontale Verschiebung möglich sein soll, dann ersetzt du in MouseDown die Zeilen
Delphi-Quellcode:
durch
inc(r.Top,y);
dec(r.Bottom,Height-y);
Delphi-Quellcode:
r.Top:=flastpos.y;
r.Bottom:=r.Top+1; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz