![]() |
Delphi-Version: XE3
Modales Fenster in der Taskleiste anzeigen
Guten Morgen,
ich habe da ein Problem. In der DPR habe ich
Code:
gesetzt. Alle Fenster die angezeigt werden habe ich durch das Überschreiben von CreateParams in der Taskleiste angezeigt.
Application.MainFormOnTaskBar := true;
Code:
Das Hauptform ist nicht das wirkliche Hauptfenster, sondern eine Login-Maske, welche immer ausgeblendet ist. Nun möchte ich ein weiteres Fenster (ich nenne es mal Modul) auf Knopfdruck öffnen, welches CreateParams auf die gleiche weise überschreibt. Es muss modal geöffnet sein und das andere Fenster wird ausgeblendet:
procedure TFormHauptfenster.CreateParams(var Params: TCreateParams);
begin inherited CreateParams(Params); Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; Params.WndParent := GetDesktopWindow; end;
Code:
jetzt habe ich 2 Probleme:
FormHauptfenster.Hide;
Application.CreateForm(TFormModul, FormModul); try FormModul.ShowModal; [...weiterer Code...] finally FreeAndNil(FormModul); FormHauptfenster.Show; end; 1. Das Modulfenster wird in der Taskleiste zunächst nicht angezeigt. wenn ich aber den Focus von diesem Fenster nehme (durch anklicken z.B. vom Desktophintergrund) und dann wieder in das Fenster klicke erscheint es plötzlich doch in der Taskleiste. Dort soll es aber von anfang an stehen. Ich habe schon versucht per Code den Focus von diesem Fenster zu nehmen und wieder drauf zu setzen, aber das bringt keinen Erfolg. 2. wenn ich das Hauptfenster wieder einblende, ist es hinter allen anderen fenstern (auch hinter meinem Browser und meiner Delphi-IDE. ein anschließendes BringToFront hat keine Wirkung. Dieses Problem besteht, seit ich im Modul-Form CreateParams überschrieben habe. Ich hoffe es hat jemand ein paar Lösungsvorschläge für mich :) Liebe Grüße |
AW: Modales Fenster in der Taskleiste anzeigen
Hi,
Delphi-Quellcode:
SetWindowPos(MainHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOSIZE Or SWP_NOMOVE)
EDIT: Unter umständen musst du die
Delphi-Quellcode:
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
abhängig vom gerade Sichtbaren Fenster umschalten. Modale Fenster können ja erst durch das setzen von WS_EX_APPWINDOW in der Taskleiste angezeigt werden. Es könnte auch helfen das Parent zu entfernen bzw.. auf 0 zu setzen. (Also nix mit GetDesktopWindow) ForceForegroundWindow.. Ach so.. Falls ich das richtig verstanden habe. Sollte dein Modales Fenster noch geöffnet sein wenn auch versteckt kannst du das andere nicht auf Top setzen das funktioniert nicht. gruss |
AW: Modales Fenster in der Taskleiste anzeigen
Zitat:
Ich versuche das alles etwas zu umschreiben, weil ich nicht weiß wie viel ich von der Software hier preisgeben darf :) Wenn man das Programm startet kommt eine Login-Maske. Diese ist im Programm das MainForm. Wenn man sich einloggt, wird diese Login-Maske ausgeblendet und das Hauptfenster des Programms erscheint (nicht modal). Von dort aus kann man dann das Form für das Modul modal aufrufen, während das Hauptfenster mit hide versteckt wird. Zitat:
Zitat:
Beide Möglichkeiten habe ich beim Hauptfenster ausprobiert und es kommt auch anschließend wieder wie gewünscht in den Vordergrund... aber da hält es sich dann auch hartnäckig - auch wenn ich danach auf ein anderes Programm oder Form klicke bleibt das Hauptfenster dann davor... in dem Falle sollte es sich aber wieder so verhalten wie "normale" Fenster, wo immer das angeklickte oben steht und das vorherige obenliegende dann eine Ebene nach unten schiebt. Ich hoffe ich konnte meine Probleme nun etwas besser darlegen... Dieses Problem verzweifelt mich langsam -.- |
AW: Modales Fenster in der Taskleiste anzeigen
Zitat:
Falls du meine Vorschläge meinst sollte es eigentlich klar sein das du das jeweilige Fenster das du dann öffnest als HWND_TOPMOST setzen must. Oder aber das zuletzt geöffnete mit dem Flag HWND_NOTOPMOST in den Hintergrund setzt. Zitat:
Das Problem aber hier ist das man wieder Raten muss. ;) gruss |
AW: Modales Fenster in der Taskleiste anzeigen
Zitat:
Das Hauptformular ist nicht die Loginform sondern das Fenster, in dem du dauerhaft arbeitest. Das Login Fenster wird vor dem Start der MainForm in der DPR Datei schon erzeugt und angezeigt. Schlägt der Login fehl, wird die Software, ohne Erzeugung des Hauptfensters, wieder beendet. Ist der Login erfolgreich, wird das Hauptformular erzeugt und geöffnet. Die Loginform wird beim Schließen wieder freigegeben weil diese nicht mehr benötigt wird. So mache ich das aktuell bei meiner Dokumentenverwaltung. Funktioniert tadellos und sowohl das Loginfenster als auch das Hauptformular (MainForm) werden auf der Taskleiste angezeigt. |
AW: Modales Fenster in der Taskleiste anzeigen
Zitat:
Auch wenn es für deine zwecke dienlich ist muss es bei ihm noch lange nicht sein. Wie gesagt wir können nur Raten. gruss |
AW: Modales Fenster in der Taskleiste anzeigen
Zitat:
|
AW: Modales Fenster in der Taskleiste anzeigen
Ich habe keine Ahnung ob es interessiert, aber ich habe die Lösung gefunden (nach insgesamt knapp 8 Stunden raten und probieren).
Ich habe eine Stelle gefunden (im onShow des Modulfensters) wo dieses mit dem WindowState des Hauptfensters geöffnet wird.
Code:
Nach endlosem testen habe ich folgendes festgestellt: Wenn das Modulfenster nun in wsMaximized geöffnet wurde, wurde es ganz normal in der Taskleiste angezeigt und auch das Zweite Problem mit dem Hauptfenster, welches nicht in den Hintergrund verschwinden sollte war nicht vorhanden. Aber ein manuelles umschalten des Modus (mit klick auf die Buttons oder ziehen des Forms an den Bildschirmrand) hat diesen Effekt nicht gehabt.
Self.WindowState := Hauptfenster.WindowState;
//Fensternamen abgeändert Die Lösung ist gewesen:
Code:
Ich weiß nicht woran es gelegen hat oder warum diese Lösung funktioniert... aber ich bin endlos glücklich, dass es nun klappt.
Self.WindowState := Hauptfenster.WindowState;
//Jetzt die Lösung: if self.WindowState = wsNormal then ShowWindow(self.handle, SW_RESTORE); |
AW: Modales Fenster in der Taskleiste anzeigen
Gut zu hören das es nun funktioniert.
Manchmal muss man einfach am Ball bleiben auch wenn es nervet und lange dauern kann. Ne Tasse Kaffee kann da schon helfen. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:21 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