Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Komponenten während der Laufzeit verschieben (https://www.delphipraxis.net/165658-komponenten-waehrend-der-laufzeit-verschieben.html)

tofse 11. Jan 2012 12:20

AW: Komponenten während der Laufzeit verschieben
 
Zitat:

Zitat von SirThornberry (Beitrag 1145381)
@DeddyH: Das ganze würde im MouseDown aber bedeutend mehr Sinn machen oder übersehe ich irgendwas?

Hatte ich schon, aber mousemove wird danach leider nicht mehr aufgerufen :-(

DeddyH 11. Jan 2012 12:21

AW: Komponenten während der Laufzeit verschieben
 
Ich hatte das seinerzeit einmal ins MouseMove verschoben, nur fällt mir gerade der Grund nicht mehr ein.

tofse 11. Jan 2012 15:52

AW: Komponenten während der Laufzeit verschieben
 
Hallo,
erst mal Danke für die Anregungen.
Da ich unbedingt das mousemove benötige, um beim Verschieben des Panels die Koordinaten zu berechnen (wegen Scrollen in einer Scrollbox), bin ich wieder zum ursprünglichen Code zurück, auch wenn ich wegen der beschriebenen Probleme nicht glücklich bin.

Ich habe nun versucht, irgendwie zu tricksen, dass der Mauszeiger auch bei schnellen Bewegungen das Panel nicht verlassen kann. Hierzu wollte ich mouseleave einsetzen. Aber in der beschriebenen Situation wird die Prozedur nicht aufgerufen. Wieso ?

Als zweiten Versuch wollte ich im mousemove die übergebenen X,Y Koordinaten mit der Breite bzw. Höhe des Panels abgleichen, d.h. wenn die = sind, darauf reagieren. Das hat auch nicht funktioniert. Daraufhin habe ich mir während dem Ziehen X und Y im Panel ausgeben lassen (bei mousemove), da habe ich dann gesehen, dass diese sich nach dem ersten mousedown nicht mehr verändern.....:?:


Hat jemand noch einen Tipp, wie ich da vorgehen könnte ?

Vielen vielen Dank
Christof

einbeliebigername 11. Jan 2012 18:51

AW: Komponenten während der Laufzeit verschieben
 
Zitat:

Zitat von tofse (Beitrag 1145438)
Daraufhin habe ich mir während dem Ziehen X und Y im Panel ausgeben lassen (bei mousemove), da habe ich dann gesehen, dass diese sich nach dem ersten mousedown nicht mehr verändern.....:?:

Ich weiß jetzt nicht, wie du die Werte ausgegeben hast. Ein Label z.B. kommt, während das MouseCapture an ist, nicht zum Neuzeichnen, so das sich scheinbar nichts ändert.

Zitat:

Zitat von tofse (Beitrag 1145438)
Hat jemand noch einen Tipp, wie ich da vorgehen könnte ?


Du könntest dir mal mit
Delphi-Quellcode:
OutputDebugString(PChar(Format('ControlMouse...: Sender.MouseCapture= %s', [BoolToStr(TMoveCracker(Sender).MouseCapture, True)])));
den Wert vom MouseCapture ins Ereignisprotokoll schreiben lassen. Jeweils am Anfang und Ende von ...Down, ...Up und ...Move. Vielleicht wird das vom Panel weggenommen. Denn wenn MouseCapture an ist, bekommt nur noch dieses Control die Mausnachrichten, selbst wenn sich die Maus außerhalb der Controls befindet.

Einbeliebigername.

tofse 12. Jan 2012 06:57

AW: Komponenten während der Laufzeit verschieben
 
Hallo,

verstehe ich nicht. Habe den OutputDebugString eingebaut, und nur im mouseup wird true ausgegeben, sonst immer false.
Trotzdem funktioniert ja grundsätzlich das Verschieben :?

Christof

roga 12. Jan 2012 07:50

AW: Komponenten während der Laufzeit verschieben
 
Hallo Christof,

ich füge hier mal einige Codeschnipsel aus meiner Komponente ein, vielleicht kannst Du damit etwas anfangen.

Delphi-Quellcode:
// Benötigte Variable
  FDragging: Boolean;

procedure OnMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ...
  // Drag wird begonnen
  FDragging := True;
  ReleaseCapture;
  Perform(WM_SysCommand, $F012, 0);
  // Folgende Zeile ist sehr wichtig! Sonst keine Auslösung
  if Assigned(OnMouseUp) then MouseUp(Button, Shift, X, Y);
end;

procedure OnMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if FDragging then
  begin
    ...
  end;
end;

procedure OnMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if FDragging then
  begin
    // Drag wird beendet
    FDragging := False;
    ...
  end;
end;
DoubleBuffered sollte auch aktiviert werden.

Gruß roga

tofse 12. Jan 2012 08:04

AW: Komponenten während der Laufzeit verschieben
 
Wird das bei Dir aufgerufen ?
Zitat:

Zitat von roga (Beitrag 1145525)
Code:
procedure OnMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if FDragging then
  begin
    ...
  end;
end;


roga 12. Jan 2012 09:01

AW: Komponenten während der Laufzeit verschieben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Du hast Recht, in dieser Komponente brauchte ich nur das MouseUp-Ereignis für Korrekturen. Die einfachste Lösung wäre über einen Timer, hänge Dir mal eine Demo und die Source an.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 Uhr.
Seite 2 von 2     12   

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