AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Modales Fenster in der Taskleiste anzeigen
Thema durchsuchen
Ansicht
Themen-Optionen

Modales Fenster in der Taskleiste anzeigen

Ein Thema von Getox · begonnen am 23. Feb 2017 · letzter Beitrag vom 24. Feb 2017
Antwort Antwort
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#1

Modales Fenster in der Taskleiste anzeigen

  Alt 23. Feb 2017, 09:45
Delphi-Version: XE3
Guten Morgen,

ich habe da ein Problem.

In der DPR habe ich
Code:
Application.MainFormOnTaskBar := true;
gesetzt. Alle Fenster die angezeigt werden habe ich durch das Überschreiben von CreateParams in der Taskleiste angezeigt.

Code:
procedure TFormHauptfenster.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle  := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := GetDesktopWindow;
end;
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:

Code:
FormHauptfenster.Hide;

Application.CreateForm(TFormModul, FormModul);
try
  FormModul.ShowModal;
  [...weiterer Code...]
finally
  FreeAndNil(FormModul);
  FormHauptfenster.Show;
end;
jetzt habe ich 2 Probleme:
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
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Modales Fenster in der Taskleiste anzeigen

  Alt 23. Feb 2017, 12:17
Hi,

SetWindowPos(MainHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOSIZE Or SWP_NOMOVE)

EDIT:
Unter umständen musst du die
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

Geändert von EWeiss (23. Feb 2017 um 12:59 Uhr)
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#3

AW: Modales Fenster in der Taskleiste anzeigen

  Alt 23. Feb 2017, 15:00
Zitat:
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.
Nochmal zur Erklärung:
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:
Unter umständen musst du die
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.
Dieses setze ich ja bei allen Fenstern (Modal oder nicht) in CreateParams damit diese in der Taskleiste erscheinen. Und bei allen Masken des Programms funktioniert das auch hervorragend, außer an dieser einen Stelle, wo die Modulmaske nicht in der Taskleiste erscheint, aber wenn ich nur auf ein anderes Fenster (oder den Desktophintergrund) klicke und anschließend wieder auf das besagte Form, steht es wie von Geisterhand korrekt in der Taskleiste. ich hab schon versucht diesem programmatisch den Fokus zu entziehen und wieder zu geben, aber das bringt irgendwie nichts.

Zitat:
SetWindowPos(MainHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOSIZE Or SWP_NOMOVE) Es könnte auch helfen das Parent zu entfernen bzw.. auf 0 zu setzen. (Also nix mit GetDesktopWindow)
Das war ja das zweite Problem. Nach dem schließen des Modulforms und dem einblenden des Hauptfensters ist dieses hinter allen anderen Anwendungen.
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 -.-
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Modales Fenster in der Taskleiste anzeigen

  Alt 23. Feb 2017, 15:18
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
Welche Möglichkeiten.

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:
ich hab schon versucht diesem programmatisch den Fokus zu entziehen und wieder zu geben, aber das bringt irgendwie nichts.
Wird nix bringen eventuell ein OnActivate.. ist letztendlich (fast) das gleiche.

Das Problem aber hier ist das man wieder Raten muss.

gruss

Geändert von EWeiss (23. Feb 2017 um 15:23 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Modales Fenster in der Taskleiste anzeigen

  Alt 23. Feb 2017, 15:22
Nochmal zur Erklärung:
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.
Ich würde die Sache ganz anders angehen.

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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Modales Fenster in der Taskleiste anzeigen

  Alt 23. Feb 2017, 15:26
Zitat:
So mache ich das aktuell bei meiner Dokumentenverwaltung. Funktioniert tadellos und sowohl das Loginfenster als auch das Hauptformular (MainForm) werden auf der Taskleiste angezeigt.
Du weist aber nicht was mit seiner Denkweise bezweckt wird..
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
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#7

AW: Modales Fenster in der Taskleiste anzeigen

  Alt 23. Feb 2017, 15:31
Nochmal zur Erklärung:
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.
Ich würde die Sache ganz anders angehen.

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.
Ich würde so gerne vieles an dem Programm ändern... Das Problem ist, dass ich da nicht viel dran ändern darf. Es handelt sich um eine "historisch gewachsene" recht alte Software, wo ich Probleme beheben muss und nebenbei wie Hölle aufpassen muss, dabei nicht an 10 anderen Stellen irgendwas kaputt zu machen -.-
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#8

AW: Modales Fenster in der Taskleiste anzeigen

  Alt 24. Feb 2017, 09:58
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:
Self.WindowState := Hauptfenster.WindowState;
//Fensternamen abgeändert
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.

Die Lösung ist gewesen:
Code:
Self.WindowState := Hauptfenster.WindowState;
//Jetzt die Lösung:
if self.WindowState = wsNormal then
  ShowWindow(self.handle, SW_RESTORE);
Ich weiß nicht woran es gelegen hat oder warum diese Lösung funktioniert... aber ich bin endlos glücklich, dass es nun klappt.
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Modales Fenster in der Taskleiste anzeigen

  Alt 24. Feb 2017, 11:32
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 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