![]() |
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:
zu
FormStyle := fsMDIChild;
Delphi-Quellcode:
und natürlich wieder zurück , ohne dass das Fenster neuerstellt wird !
FormStyle := fsNormal;
Da hat doch sicherlich einer eine Idee oder? :D MfG Alaitoc |
Re: Formstyle, Neuerstellen des Fensters verhindern
So ich schaffe es nun mit Hilfe von:
Delphi-Quellcode:
das Fenster aus dem MDI-Form zu kriegen...jedoch will es nicht wieder hinein mit:SetWindowLong( Handle, GWL_HWNDPARENT, GetDesktopWindow ); SetWindowLong( Handle, GWL_STYLE, ( GetWindowLong( Handle, GWL_STYLE ) and not WS_CHILD and not WS_CLIPCHILDREN ) );
Delphi-Quellcode:
Hat jemand eine Idee?
SetWindowLong( Handle, GWL_HWNDPARENT, Application.MainForm.Handle );
SetWindowLong( Self.Handle, GWL_STYLE, ( GetWindowLong( Self.Handle, GWL_STYLE ) or WS_CHILD or WS_CLIPCHILDREN ) ); MfG Alaitoc |
Re: Formstyle, Neuerstellen des Fensters verhindern
|
Re: Formstyle, Neuerstellen des Fensters verhindern
Phew...ich bin etwas weitergekommen
Formstyle muss fsMDIChild sein. Variablen:
Delphi-Quellcode:
Zum rausschmeißen:
FGenericFormStyle: TGenericFormStyle;
FOldGWL_STYLE: Integer; FOldGWL_EXSTYLE: Integer; FOldParent: HWND;
Delphi-Quellcode:
Zum reinpacken:
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;
Delphi-Quellcode:
Jetzt hab ich das Problem das das Hauptformular dann nicht mehr den Fokus erhalten kann, jemand eine Idee?
SetWindowLong(Handle, GWL_STYLE, FOldGWL_STYLE );
SetWindowLong(Handle, GWL_EXSTYLE, FOldGWL_EXSTYLE ); Windows.SetParent(Handle, FOldParent); FGenericFormStyle := gfsMDIChild; |
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 |
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 |
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:
MfG Alaitoc
procedure TWinControl.RecreateWnd;
begin if FHandle <> 0 then Perform(CM_RECREATEWND, 0, 0); end; |
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 |
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 14:45 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