![]() |
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:
Hier erscheint dann auch der Verschieben-MouseCursor und mit den Pfeiltasten geht das verschieben auch.
procedure CWidgetBase.WidgetMove(Sender: TObject);
begin ReleaseCapture; Self.Perform(WM_SYSCOMMAND,SC_MOVE,0); end; 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:
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?
Self.Perform(WM_SYSCOMMAND,SC_MOVE+2,0);
Hat jemand eventuell eine Lösung? Gruß, Steffen |
Re: Komponente zur Laufzeit verschieben ohne MouseDown
Keiner eine Idee? :(
|
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 |
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 |
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. |
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. |
Re: Komponente zur Laufzeit verschieben ohne MouseDown
Zitat:
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 |
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:
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
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; ![]() Gruß oki |
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 |
Re: Komponente zur Laufzeit verschieben ohne MouseDown
Zitat:
Gruß oki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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-2025 by Thomas Breitkreuz