Delphi-PRAXiS

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 Formstyle, Neuerstellen des Fensters verhindern (https://www.delphipraxis.net/146014-formstyle-neuerstellen-des-fensters-verhindern.html)

Alaitoc 12. Jan 2010 10:13


Formstyle, Neuerstellen des Fensters verhindern
 
Hallo DP-Community!

Ich habe ein Problem mit FormStyle, da beim ändern jedes Mal das Fenster neu erstellt wird und die Objekte auf dem Formular neuerstellt werden.

Also ich habe ein MDI-Child, das wenn man auf einen Button drückt aus dem Hauptformular springen soll und sich dann wie ein normales Formular verhalten soll.

Also ich bräuchte den Wechseln von

Delphi-Quellcode:
FormStyle := fsMDIChild;
zu
Delphi-Quellcode:
FormStyle := fsNormal;
und natürlich wieder zurück , ohne dass das Fenster neuerstellt wird !

Da hat doch sicherlich einer eine Idee oder? :D

MfG Alaitoc

Alaitoc 12. Jan 2010 12:47

Re: Formstyle, Neuerstellen des Fensters verhindern
 
So ich schaffe es nun mit Hilfe von:

Delphi-Quellcode:
         
SetWindowLong( Handle, GWL_HWNDPARENT, GetDesktopWindow );
SetWindowLong( Handle, GWL_STYLE, ( GetWindowLong( Handle, GWL_STYLE ) and not WS_CHILD and not WS_CLIPCHILDREN ) );
das Fenster aus dem MDI-Form zu kriegen...jedoch will es nicht wieder hinein mit:
Delphi-Quellcode:
SetWindowLong( Handle, GWL_HWNDPARENT, Application.MainForm.Handle );
SetWindowLong( Self.Handle, GWL_STYLE, ( GetWindowLong( Self.Handle, GWL_STYLE ) or WS_CHILD or WS_CLIPCHILDREN ) );
Hat jemand eine Idee?

MfG Alaitoc

Alaitoc 13. Jan 2010 06:51

Re: Formstyle, Neuerstellen des Fensters verhindern
 
Morgen und...

http://fnse.de/S02/15S.gif

Alaitoc 14. Jan 2010 10:01

Re: Formstyle, Neuerstellen des Fensters verhindern
 
Phew...ich bin etwas weitergekommen

Formstyle muss fsMDIChild sein.

Variablen:
Delphi-Quellcode:
FGenericFormStyle: TGenericFormStyle;
FOldGWL_STYLE: Integer;
FOldGWL_EXSTYLE: Integer;
FOldParent: HWND;
Zum rausschmeißen:
Delphi-Quellcode:
FOldGWL_STYLE := GetWindowLong(Handle,GWL_STYLE);
FOldGWL_EXSTYLE := GetWindowLong(Handle,GWL_EXSTYLE);
FOldParent := Windows.GetParent(Handle);

Windows.SetParent(Self.Handle, GetDesktopWindow);
SetWindowLong(Handle, GWL_STYLE, ( GetWindowLong( Handle, GWL_STYLE )
                                 and not WS_CHILD
                                 and not WS_CLIPSIBLINGS
                                 and not WS_CLIPCHILDREN ));
SetWindowLong(Handle, GWL_STYLE, ( GetWindowLong( Handle, GWL_STYLE )
                                 and not WS_GROUP
                                 or WS_TABSTOP ));
SetWindowLong(Handle, GWL_EXSTYLE, ( GetWindowLong( Handle, GWL_EXSTYLE )
                                   and not WS_EX_MDICHILD
                                   and not WS_EX_TOPMOST
                                   or WS_EX_NOPARENTNOTIFY ));
FGenericFormStyle := gfsNormal;
Zum reinpacken:

Delphi-Quellcode:
SetWindowLong(Handle, GWL_STYLE, FOldGWL_STYLE );
SetWindowLong(Handle, GWL_EXSTYLE, FOldGWL_EXSTYLE );
Windows.SetParent(Handle, FOldParent);
FGenericFormStyle := gfsMDIChild;
Jetzt hab ich das Problem das das Hauptformular dann nicht mehr den Fokus erhalten kann, jemand eine Idee?

Alaitoc 18. Jan 2010 10:20

Re: Formstyle, Neuerstellen des Fensters verhindern
 
Hm bin immernoch nicht weitergekommen...hat irgendjemand vll. einen Geistesblitz oder
einen anderen Ansatz wie man das lösen könnte?

MfG Alaitoc

Sherlock 18. Jan 2010 10:25

Re: Formstyle, Neuerstellen des Fensters verhindern
 
She ich das richtig, daß Du eigentlich nur nicht nochmal durch die OnCreates bzw. OnShows durch gehen möchtest, wenn Du den Style änderst? Wenn ja, dann leg halt die entsprechenden Ereignisse vorübergehend lahm.

Sherlock

Alaitoc 18. Jan 2010 10:33

Re: Formstyle, Neuerstellen des Fensters verhindern
 
Was ich lahm legen will ist in gewisser Weise das das Fenster neuerstellt wird,
da dabei Komponenten auf den Anfangszustand zurückgesetzt werden.

Sozusagen die Methode RecreateWnd die durch SetPosition aufgeruft wird und SetPosition
wird während des FormStyle änderns geändert.

Delphi-Quellcode:
procedure TWinControl.RecreateWnd;
begin
  if FHandle <> 0 then Perform(CM_RECREATEWND, 0, 0);
end;
MfG Alaitoc

Sherlock 18. Jan 2010 10:38

Re: Formstyle, Neuerstellen des Fensters verhindern
 
Und wenn Du Dir den Zustand/Inhalt der Controls merkst und nach der "Umwandlung" setzt? Geht eventuell schneller als noch länger zu forschen...

Sherlock

Alaitoc 18. Jan 2010 10:44

Re: Formstyle, Neuerstellen des Fensters verhindern
 
Normalerweise schon, jedoch soll die Komponente eigentlich noch öfters verwendet werden
und da müsste man ja je nachdem was für spezielle Controls man dort drauflegt einen riesigen Aufwand
betreiben um alles zu sichern und wiederherzustellen :/

Theorethisch habe ich es ja zu 90% hingekriegt mit den API-Funktionen, jedoch will das Hauptformular unter keinen Umstand mehr den Fokus erhalten...aber man kann es halt noch verschieben und sobald man loslässt wird wieder das MDI-Child auf dem Desktop ausgewählt :/

MfG Alaitoc


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 Uhr.

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