AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

"Sichtbares" Versetzen eines Buttons mit der Maus

Ein Thema von Jazzman_Marburg · begonnen am 28. Nov 2010 · letzter Beitrag vom 29. Nov 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#1

"Sichtbares" Versetzen eines Buttons mit der Maus

  Alt 28. Nov 2010, 10:04
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
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

AW: "Sichtbares" Versetzen eines Buttons mit der Maus

  Alt 28. Nov 2010, 10:23
Suche mal nach [DP]ReleaseCapture WM_SYSCOMMAND $F012[/DP]

Edit: DP-Tags funktionieren irgendwie nicht...
Thomas

Geändert von toms (28. Nov 2010 um 10:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#3

AW: "Sichtbares" Versetzen eines Buttons mit der Maus

  Alt 28. Nov 2010, 10:55
Edit: DP-Tags funktionieren irgendwie nicht...
Ja, die Suchtags mögen verschiedene Zeichen nicht,
wie z.B. $ oder :

[GOOGLE]site:delphipraxis.net ReleaseCapture WM_SYSCOMMAND[/GOOGLE] geht och nicht
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: "Sichtbares" Versetzen eines Buttons mit der Maus

  Alt 28. Nov 2010, 11:12
Dieser Thread enthält ein paar interessante Ansätze.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#5

AW: "Sichtbares" Versetzen eines Buttons mit der Maus

  Alt 28. Nov 2010, 14:03
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
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: "Sichtbares" Versetzen eines Buttons mit der Maus

  Alt 28. Nov 2010, 14:23
Wovon ist denn Deine Klasse abgeleitet?

[edit] Und bist Du sicher, dass die Parameterliste im interface- und implementation-Abschnitt genau gleich ist? [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (28. Nov 2010 um 14:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: "Sichtbares" Versetzen eines Buttons mit der Maus

  Alt 28. Nov 2010, 15:50
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).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#8

AW: "Sichtbares" Versetzen eines Buttons mit der Maus

  Alt 28. Nov 2010, 16:11
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).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#9

AW: "Sichtbares" Versetzen eines Buttons mit der Maus

  Alt 28. Nov 2010, 16:19
(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!!)


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.

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
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#10

AW: "Sichtbares" Versetzen eines Buttons mit der Maus

  Alt 28. Nov 2010, 18:58
@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.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 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