![]() |
ChildForm zusammen mit MainForm verschieben
Hallo,
in meinem Programm wird von der MainForm ein ChildForm angezeigt, welches per
Delphi-Quellcode:
immer überhalb des Hauptfensters liegt.
FormStyle := fsStayOnTop
Wie kann ich es anstellen, dass (falls es gerade angezeigt wird) das ChildWindow gleichzeitig mit dem Hauptfenster verschoben werden kann? Es sollte aber nur eine "einseitige Kopplung" vorhanden sein, d.h. das ChildWindow muss sich unabhängig vom Hauptfenster verschieben lassen. .sundance. |
AW: ChildForm zusammen mit MainForm verschieben
Z.B. als MDI oder beim Verschieben des Hauptfensters entsprechend Unterfenster verschieben
|
AW: ChildForm zusammen mit MainForm verschieben
Zitat:
Aber wie macht man das am besten (ohne viel Geflacker...)? Vielleicht über das Versenden einer Message an das ChildWindow, wenn sich die Position des Hauptfensters geändert hat? Ein kleiner Code-Ausschnitt wäre super... |
AW: ChildForm zusammen mit MainForm verschieben
Nicht ausprobiert: wenn man WM_MOVING auswertet, müsste sich doch das übergebene Rechteck auf das Childform umrechnen und dann an dieses schicken lassen.
|
AW: ChildForm zusammen mit MainForm verschieben
Zitat:
(mit Messages habe ich bisher noch nichts gemacht...) |
AW: ChildForm zusammen mit MainForm verschieben
Delphi-Quellcode:
type
TFormTest = class(TForm) procedure FormShow(Sender: TObject); private { Private-Deklarationen } procedure WMMoving(var Msg: TMessage); message WM_MOVING; public { Public-Deklarationen } end; ... procedure TFormTest.WMMoving(var Msg: TMessage); begin inherited; OtherForm.Left := Left + Width; end; |
AW: ChildForm zusammen mit MainForm verschieben
So geht das mit dem frei beweglichen Child :)
Delphi-Quellcode:
type
TFormTest = class(TForm) procedure FormActivate( Sender : TObject ); // OnActivate-Event zuweisen private FChildView : TForm; FChildDelta : TPoint; protected procedure WMMove( var Message : TWMMove ); message WM_MOVE; procedure SetChildView( AChildForm : TForm ); procedure StoreChildDelta; public end; ... procedure TFormTest.SetChildView( AChildForm : TForm ); begin FChildView := AChildForm; StoreChildDelta; end; procedure TFormTest.StoreChildDelta; begin if Assigned( FChildView ) then begin FChildDelta.X := FChildView.Left - Self.Left; FChildDelta.Y := FChildView.Top - Self.Top; end; end; procedure TFormTest.FormActivate( Sender : TObject ); begin StoreChildDelta; end; procedure TFormTest.WMMove(var Msg: TWMMove); begin inherited; if Assigned( FChildForm ) then begin FChildForm.Left := Self.Left + FChildDelta.X; FChildForm.Top := Self.Top + FChildDelta.Y; end; end; |
AW: ChildForm zusammen mit MainForm verschieben
Perfekt Detlef, vielen Dank!
So einfach kann das gehen... (im Hinblick auf deine Signatur kann ich mein Programm jetzt "Version 1.1" nennen... :wink: ) @Sir Rufo: Herzlichen Dank auch für deine Ergänzung (hab's erst nach meiner Antwort gesehen...) Sowas in der Art habe ich auch gerade daraus gebastelt, ist aber noch nicht ganz fertig... .sundance. |
AW: ChildForm zusammen mit MainForm verschieben
Nachdem ich jetzt eine Weile mit Messages gespielt habe (
Delphi-Quellcode:
) hätte ich noch eine Frage an die Spezialisten:
WM_ENTERSIZEMOVE, WM_EXITSIZEMOVE, WM_MOVE
Wenn man das ChildWindow durch Setzen der Eigenschaften Top/Left "auf Kurs hält" ist mir aufgefallen, dass es (besonders bei schnellen Bewegungen) etwas dem MainForm hinterherhinkt. Kann es sein, dass es noch effizientere Möglichkeiten gibt, die Position des ChildWindow zu setzen als über die VCL? Evtl. auch durch das Absetzen einer "SendMessage"? .sundance. |
AW: ChildForm zusammen mit MainForm verschieben
Versuche es mal SetBounds(); das ist zwar immer noch auf Ebene der VCL, dürfte aber etwas Zeit sparen.
Delphi-Quellcode:
procedure TFormTest.WMMove(var Msg: TWMMove);
begin inherited; if Assigned( FChildForm ) then begin FChildForm.SetBounds(Self.Left + FChildDelta.X, Self.Top + FChildDelta.Y, FChildForm.Width, FChildForm.Height); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 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