Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komponente zur Laufzeit verschieben ohne MouseDown (https://www.delphipraxis.net/97790-komponente-zur-laufzeit-verschieben-ohne-mousedown.html)

MasterEvil 16. Aug 2007 12:49


Komponente zur Laufzeit verschieben ohne MouseDown
 
Hallo,

ich habe ein Formular auf dem ich mehrere Widgets (als Basis sind es modifizierte Panels) platzieren kann. Die Widgets können fixiert oder "frei" sein. Sind sie frei, haben die Widgets einen Header und mit diesem kann man sie verschieben.

Nun ist es aber möglich ein Widget über den Rand zu verschieben und der Header ist dann nicht mehr sichtbar. Nun wollte ich es möglich machen, dass wenn ich einen Rechtsklick auf das Widget machen und im erscheinenden PopupMenu "Verschieben" auswählen, das Widget verschiebbar wird.

Mein Ansatz:
Delphi-Quellcode:
procedure CWidgetBase.WidgetMove(Sender: TObject);
begin
  ReleaseCapture;
  Self.Perform(WM_SYSCOMMAND,SC_MOVE,0);
end;
Hier erscheint dann auch der Verschieben-MouseCursor und mit den Pfeiltasten geht das verschieben auch.
Ich würde es aber gerne haben, dass man sofort mit der Maus verschieben kann (dies geht so erst, wenn man einmal eine Pfeiltaste gedrückt hat).

Hab mal gegoogelt und gefunden, dass man auf SC_MOVE zwei addieren soll, also so:
Delphi-Quellcode:
Self.Perform(WM_SYSCOMMAND,SC_MOVE+2,0);
Dann passiert bei mir aber gar nichts mehr. Alle Beispiele die ich finde lösen sich immer im MouseDown Ereignis aus. Bei mir ist es in einem OnClick event des Popups. Kann das das Problem sein?
Hat jemand eventuell eine Lösung?

Gruß,
Steffen

MasterEvil 20. Aug 2007 09:59

Re: Komponente zur Laufzeit verschieben ohne MouseDown
 
Keiner eine Idee? :(

oki 20. Aug 2007 10:58

Re: Komponente zur Laufzeit verschieben ohne MouseDown
 
Hi,
ich mache es im MouseDown und hab da keine negativen Erfahrungen damit. Warum willst du es denn nicht im MouseDown haben?

Gruß oki

MasterEvil 20. Aug 2007 11:40

Re: Komponente zur Laufzeit verschieben ohne MouseDown
 
Also normalerweise kann man mein Widget nur über seinen Kopfteil verschieben, also wie bei einem normalen Windows-Fenster auch. Verschiebt man es aber über den Rand, kann man den Kopfteil nicht mehr anklicken, bekommt es also nicht zurück.

Daher möchte ich es dann über das PopupMenu (welches man ja auch im Body öffnen kann) auslösen.
Im MouseDown geht es daher nicht. Will ja nicht überall hin klicken und dort verschieben können.
Ausserdem liegen da eh normalerweise anderen Komponenten noch drüber.

Gruß,
Steffen

Die Muhkuh 20. Aug 2007 11:51

Re: Komponente zur Laufzeit verschieben ohne MouseDown
 
Hi Steffen,

warum fängst Du es nicht ab, dass man das Widget über den Rand schieben kann? Falls es drüber ist, lässt Du es beim "Fallen", also beim MouseUp, wieder so positionieren, dass der Kopfteil sichtbar ist.

MasterEvil 20. Aug 2007 13:18

Re: Komponente zur Laufzeit verschieben ohne MouseDown
 
Weil man dann das Widget nicht mehr direkt an den Rand "docken" kann.
Die Kopfzeile wird oben dran gepappt, wenn man im "Verschiebe-Modus" ist und danach wieder ausgeblendet.
Kann sie auch nicht "integrieren" (also keine Zeile zusätzlich oben dran machen, sondern vom Body Platz wegnehmen), weil man dann das Widget nicht mehr gut gegen andere Widgets ausrichten kann.

Reinhard Kern 20. Aug 2007 13:41

Re: Komponente zur Laufzeit verschieben ohne MouseDown
 
Zitat:

Zitat von MasterEvil
Hallo,
...
Nun ist es aber möglich ein Widget über den Rand zu verschieben und der Header ist dann nicht mehr sichtbar. Nun wollte ich es möglich machen, dass wenn ich einen Rechtsklick auf das Widget machen und im erscheinenden PopupMenu "Verschieben" auswählen, das Widget verschiebbar wird.
...Gruß,
Steffen

Hallo Steffen,

der Entwurf ist nicht windowsgerecht: OnClick heisst, dass die linke Maustaste gedrückt und wieder losgelassen wird, im losgelassenen Zustand geht aber kein normales Drag and Drop. Es geht häufig schief, wenn man gegen Windows arbeitet, weil die Windows-Software von anderen Voraussetzungen ausgeht und man den ganauen Code der internen Funktionen ja nicht kennt.

Ein konsistentes Verschieben auf Click könnte ich mir nur so vorstellen, dass nach dem Click auf "Verschieben" im Menu die Komponente der Mausbewegung folgt und nach einem 2. Click abgelegt wird. Dazu muss man sich die Maus reservieren und das ganze Drag mittels MouseMove selbst programmieren.

Gruss Reinhard

oki 20. Aug 2007 14:40

Re: Komponente zur Laufzeit verschieben ohne MouseDown
 
Wenn du es nur über den Kopfteil verschieben möchtest, dann grenze den Aktionsbereich für dein Move doch uber die mitgelieferte X/Y-Koordinate ein.

Bsp.:
Delphi-Quellcode:
procedure CWidgetBase.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  IF Y < MyHeader.Height then Exit;
  Screen.cursor := crHandPoint;
  ReleaseCapture;
  Self.Perform(WM_SYSCOMMAND,SC_MOVE,0);
end;
Hierbei soll MyHeader dein Kopfteil sein. Den Cursor kannst du im MouseUp wieder zurücksetzen. Willst du die Position während des Movens überwachen, so nutze die Windows-Nachricht wm_moving. Ich habe ähnliches Thema hier wm_moving, wm_sizing am wickel gehabt.

Gruß oki

MasterEvil 21. Aug 2007 10:00

Re: Komponente zur Laufzeit verschieben ohne MouseDown
 
@ Reinhard:
So recht gefallen mag mir die Lösung leider nicht ;)
Muss ich mir nochmal überlegen.

@ oki:
Das ist ja bereits integriert, es geht ja jetzt darum, wie man das Fenster verschiebt, wenn die Kopfzeile nicht mehr sichtbar ist.

Gruß,
Steffen

oki 21. Aug 2007 15:03

Re: Komponente zur Laufzeit verschieben ohne MouseDown
 
Zitat:

Zitat von MasterEvil
@ oki:
Das ist ja bereits integriert, es geht ja jetzt darum, wie man das Fenster verschiebt, wenn die Kopfzeile nicht mehr sichtbar ist.

Ja, dann halt über den Rand wie oben mit X,Y eingrenzen. Das wird dann aber sicher etwas fummelig in der Bedienung. Oder du mußt es wirklich über ein Popupmenue mit moving per Code und Abbruchbedingung machen.

Gruß oki


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