AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Komponente zur Laufzeit verschieben ohne MouseDown
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente zur Laufzeit verschieben ohne MouseDown

Offene Frage von "MasterEvil"
Ein Thema von MasterEvil · begonnen am 16. Aug 2007 · letzter Beitrag vom 22. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von MasterEvil
MasterEvil

Registriert seit: 12. Feb 2005
Ort: Hannover
234 Beiträge
 
Delphi 7 Enterprise
 
#1

Komponente zur Laufzeit verschieben ohne MouseDown

  Alt 16. Aug 2007, 13:49
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:
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
  Mit Zitat antworten Zitat
Benutzerbild von MasterEvil
MasterEvil

Registriert seit: 12. Feb 2005
Ort: Hannover
234 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Komponente zur Laufzeit verschieben ohne MouseDown

  Alt 20. Aug 2007, 10:59
Keiner eine Idee?
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Komponente zur Laufzeit verschieben ohne MouseDown

  Alt 20. Aug 2007, 11:58
Hi,
ich mache es im MouseDown und hab da keine negativen Erfahrungen damit. Warum willst du es denn nicht im MouseDown haben?

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von MasterEvil
MasterEvil

Registriert seit: 12. Feb 2005
Ort: Hannover
234 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Komponente zur Laufzeit verschieben ohne MouseDown

  Alt 20. Aug 2007, 12:40
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
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Komponente zur Laufzeit verschieben ohne MouseDown

  Alt 20. Aug 2007, 12:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von MasterEvil
MasterEvil

Registriert seit: 12. Feb 2005
Ort: Hannover
234 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Komponente zur Laufzeit verschieben ohne MouseDown

  Alt 20. Aug 2007, 14:18
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.
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#7

Re: Komponente zur Laufzeit verschieben ohne MouseDown

  Alt 20. Aug 2007, 14:41
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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Komponente zur Laufzeit verschieben ohne MouseDown

  Alt 20. Aug 2007, 15:40
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
42
  Mit Zitat antworten Zitat
Benutzerbild von MasterEvil
MasterEvil

Registriert seit: 12. Feb 2005
Ort: Hannover
234 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Komponente zur Laufzeit verschieben ohne MouseDown

  Alt 21. Aug 2007, 11:00
@ 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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Komponente zur Laufzeit verschieben ohne MouseDown

  Alt 21. Aug 2007, 16:03
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
42
  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 22:30 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