![]() |
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; |
AW: ChildForm zusammen mit MainForm verschieben
@Andreas
Vielen Dank für den Tipp; das scheint wohl der "direkteste" Weg über die VCL zu sein. Und noch eine Frage ist aufgetaucht: Worin liegt eigentlich der Unterschied zwischen
Delphi-Quellcode:
und
WM_MOVE
Delphi-Quellcode:
?
WM_MOVING
Die MSDN war mir da keine große Hilfe: Zitat:
Zitat:
|
AW: ChildForm zusammen mit MainForm verschieben
Bei WM_MOVE ist die bewegung schon abgeschlossen. Außerdem sendet (soweit ich mich erinnere) WM_MOVING einige Zusatzinfos, wie die aktuelle Position mit.
|
AW: ChildForm zusammen mit MainForm verschieben
Bei meinen Versuchen kommen während des Verschiebens, also solange die linke Maustaste gedrückt ist, bei jeder 1-Pixel-Bewegung beide Messages an. Allerdings habe ich keine Info darüber, was WM_MOVING an Daten mitschickt; bei WM_MOVE kommt über den TMessage-Parameter die X- und Y-Koordinaten der Client-Area mit.
Delphi-Quellcode:
type
TForm1 = class(TForm) . private procedure WMMoving(var Msg: TMessage); message WM_MOVING; procedure WMEnterSizeMove(var Msg: TMessage) ; message WM_ENTERSIZEMOVE; procedure WMMove(var Msg: TMessage) ; message WM_MOVE; procedure WMExitSizeMove(var Msg: TMessage) ; message WM_EXITSIZEMOVE; . end; procedure TForm1.WMMoving(var Msg: TMessage); begin inherited; lbInfo.Caption := Format('WM_MOVING: Client-Bereich X0 = %d, Y0 = %d', [Self.ClientOrigin.X, Self.ClientOrigin.Y]); if CheckBox1.Checked then ChildForm.SetBounds(Self.Left + FChildDelta.X, Self.Top + FChildDelta.Y, ChildForm.Width, ChildForm.Height); end; procedure TForm1.WMEnterSizeMove(var Msg: TMessage); begin StatusBar.SimpleText := 'Move/Resize gestartet...'; end; procedure TForm1.WMExitSizeMove(var Msg: TMessage); begin StatusBar.SimpleText := 'Move/Resize beendet!'; end; procedure TForm1.WMMove(var Msg: TMessage); begin StatusBar.SimpleText := Format('MainForm wird verschoben: Client-Bereich X0 = %d, Y0 = %d', [TWMMove(Msg).XPos,TWMMove(Msg).YPos]); end; |
AW: ChildForm zusammen mit MainForm verschieben
Ein rect-Zeiger in lparam
|
AW: ChildForm zusammen mit MainForm verschieben
Das steht aber auch im MSDN:
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 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