![]() |
Komponenten während der Laufzeit verschieben
Hallo zusammen,
ich verwende dieses schöne Skript, um TPanel Komponenten innerhalb einer ScrollBox zu verschieben: ![]() Es gibt bei mir nur einen Schönheitsfehler: wenn man den Mauszeiger bei gedrückter Maustaste sehr schnell bewegt, kann es sein, dass (wie soll ich sagen..) das TPanel nicht mehr "nach kommt". Es bleibt stehen, aber
Code:
aus dem Skript ist noch immer true. Bewege ich dann den Mauszeiger wieder über das TPanel, kann ich dieses weiter bewegen (auch wenn ich die Maustaste vorher sogar loslasse).
TMoveCracker(Sender).MouseCapture
Hat jemand einen Tipp, wie ich das TPanel dazubekomme, auch die schnellen Mausbewegungen mitzumachen ? Danke Christof |
AW: Komponenten während der Laufzeit verschieben
Geht es um alle Panels auf dem Formular?
[edit] Falls ja, versuch es mal hiermit:
Delphi-Quellcode:
Das geht auch mit anderen Komponenten, solange sie von TWinControl abstammen. [/edit]
type
TPanel = class(ExtCtrls.TPanel) protected procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; end; TDeinForm = class(TForm) ... end; ... procedure TPanel.MouseMove(Shift: TShiftState; X, Y: Integer); begin inherited; if ssLeft in Shift then begin ReleaseCapture; Perform(WM_SYSCOMMAND, $F012, 0); end; end; |
AW: Komponenten während der Laufzeit verschieben
Danke, das funktioniert super :-D
Nur...wie kann ich jetzt feststellen, wann das Ziehen der Komponente beendet ist? Vermutlich wegen dem ReleaseCapture wird die Procedure MouseUp nicht mehr aufgerufen. Edit: Noch eine 2. Frage: wie kann ich während dem Ziehen des TPanel's auf irgendwas reagieren? Z.B. will ich prüfen, ob das TPanel über einen Punkt bewegt wird. In dem anderen Beispiel hatte ich das alles in der Procedure mousemove. Der Code nach dem Perform wird erst ausgeführt, wenn ich das Element nicht mehr bewege....was irgendwie meine erste Frage beantwortet ;-) Grüße Christof |
AW: Komponenten während der Laufzeit verschieben
Zitat:
|
AW: Komponenten während der Laufzeit verschieben
Hallo,
also ich habe folgenden gekürzten Code: In einer Unit:
Code:
Dann im Formular:
....
type TTermin = Class(TPanel) ....
Code:
Und diese Prozedur:
...
T:=TTermin.Create(Form1); T.OnMouseMove:=Form1.ControlMouseMove; ...
Code:
Die letzte Zeile mit der Farbzuweisung ist nur zum Testen und soll mein Verständnisproblem zeigen. Erst wenn ich mit dem Ziehen des Elements fertig bin, wird die Farbe grün zugewiesen. Ich verstehe das so, als ob der Code nach Perform auch erst nach dem Ziehen ausgeführt wird.
procedure TForm1.ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin if ssLeft in Shift then begin (Sender as TTermin).Dragging:=true; ReleaseCapture; (Sender as TControl).Perform(WM_SYSCOMMAND, $F012, 0); (Sender as TTermin).color:=clGreen; end; end; Du hast geschrieben: Zitat:
Danke und Grüße Christof |
AW: Komponenten während der Laufzeit verschieben
Meine Anmerkung bezog sich auf den Original-Code aus dem Link:
Delphi-Quellcode:
procedure TForm1.ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin if FDragging then with Sender as TControl do begin Left := X - FDownX + Left; Top := Y - FDownY + Top; //in etwa: if (Left=20 and Top>20) then..... end; end; |
AW: Komponenten während der Laufzeit verschieben
Achso...da hat das auch funktioniert, aber wie beschrieben ist die "Performance" da nicht gerade optimal.
Von daher würde ich gerne schon das hier verwenden...
Code:
...muss aber halt unbedingt während dem mousemove ein paar Berechnungen vornehmen. Bis jetzt habe ich es nicht hinbekommen.
ReleaseCapture;
Perform(WM_SYSCOMMAND, $F012, 0); Habe inzwischen den Code in onmousedown gesteckt, aber während dem Ziehen wird mousemove leider noch immer nicht aufgerufen. Christof |
AW: Komponenten während der Laufzeit verschieben
Ja, weil dieses
Delphi-Quellcode:
die Wirkungsweise dieser Proceduren unterbricht.
ReleaseCapture;
Perform(WM_SYSCOMMAND, $F012, 0); Ich arbeite auch grad an einem Programm, dass diese Routinen nutzt. Allerdings verschiebe ich TImages. Und ich habe kein Hängenbleiben oder irgendwelche Verzögerungen beim Schieben. Vielleicht ist dein System einfach nur zu träge für sowas? |
AW: Komponenten während der Laufzeit verschieben
Hm, und da gibt es keine Möglichkeit?
Wie gesagt, mit der 2. Variante habe ich beim Ziehen keinerlei Probleme, von daher hat es wohl nichts mit Trägheit zu tun. Und "hängenbleiben" ist auch vielleicht das falsche Wort, da ruckelt nichts etc. Es ist nur so, dass das Panel manchmal an der Stelle bleibt, wenn ich den Mauszeiger bei gedrückter Taste sehr schnell bewege. Dann ist der Zeiger plötzlich außerhalb vom Panel und sobald ich den Zeiger wieder über das Panel ziehe, kann ich das Panel weiter bewegen. Das ist einfach nicht schön :-( Du kannst das bei deinem Programm nicht nachvollziehen? Christof |
AW: Komponenten während der Laufzeit verschieben
@DeddyH: Das ganze würde im MouseDown aber bedeutend mehr Sinn machen oder übersehe ich irgendwas?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 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