Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ChildForm zusammen mit MainForm verschieben (https://www.delphipraxis.net/171045-childform-zusammen-mit-mainform-verschieben.html)

sundance 17. Okt 2012 10:08

ChildForm zusammen mit MainForm verschieben
 
Hallo,

in meinem Programm wird von der MainForm ein ChildForm angezeigt, welches per
Delphi-Quellcode:
FormStyle := fsStayOnTop
immer überhalb des Hauptfensters liegt.
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.

mkinzler 17. Okt 2012 10:10

AW: ChildForm zusammen mit MainForm verschieben
 
Z.B. als MDI oder beim Verschieben des Hauptfensters entsprechend Unterfenster verschieben

sundance 17. Okt 2012 10:18

AW: ChildForm zusammen mit MainForm verschieben
 
Zitat:

Zitat von mkinzler (Beitrag 1187353)
Z.B. als MDI oder beim Verschieben des Hauptfensters entsprechend Unterfenster verschieben

So war der Plan...
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...

DeddyH 17. Okt 2012 10:40

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.

sundance 17. Okt 2012 11:58

AW: ChildForm zusammen mit MainForm verschieben
 
Zitat:

Zitat von DeddyH (Beitrag 1187360)
...wenn man WM_MOVING auswertet...

Du hast nicht zufällig ein Codebeispiel zur Hand?
(mit Messages habe ich bisher noch nichts gemacht...)

DeddyH 17. Okt 2012 12:08

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;

Sir Rufo 17. Okt 2012 13:16

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;

sundance 17. Okt 2012 13:27

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.

sundance 23. Okt 2012 17:40

AW: ChildForm zusammen mit MainForm verschieben
 
Nachdem ich jetzt eine Weile mit Messages gespielt habe (
Delphi-Quellcode:
WM_ENTERSIZEMOVE, WM_EXITSIZEMOVE, WM_MOVE
) hätte ich noch eine Frage an die Spezialisten:
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.

shmia 23. Okt 2012 18:11

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.
Seite 1 von 2  1 2      

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