![]() |
messagebox hinter modularen Fenstern
Guten Morgen zusammen.
Es kommt immer wieder einmal vor, das messagebox bei modularen Fenstern hinter diesem Fenster erscheinen. Das Problem daran ist, dass der normale Benutzer damit ziemlich überfordert ist und immer der Meinung ist das Programm würde "hängen", da im aktiven Fenster keinerlei Eingaben mehr Möglich sind. Da oft Fenster größer als die messagebox ist, sieht der Benutzer diesen Dialog auch nicht. Mit ein wenig ALT+TAB erscheint die messagebox zwar, aber wie oben erwähnt für den Normalen Benutzer oft nicht nachvollziehbar. Es kann sogar passieren, dass das vorherige Fenster Eingaben erlaubt, obwohl die messagebox modal sein sollte. Das Phänomen haben wir seit Jahrne und in der Häufigkeit auch nur bei Delphi Applikationen gesehen. Kennt ihr das Problem, oder habt sogar eine Lösung für das Problem? Wir hatten teilweise sogar das Problem das die Druckerfenster von Windows selber im Hintergrund geöffnet wurden. Es tritt auch auf jeder Windows Version auf. XP, 7, 2008 RC2 Server, 2013 Server ( Win 8 noch nicht intensiv getestet ). Ein Schema habe ich bisher nicht erkannt. LG Sven |
AW: messagebox hinter modularen Fenstern
Zitat:
|
AW: messagebox hinter modularen Fenstern
Vielleicht hilft es:
![]() |
AW: messagebox hinter modularen Fenstern
Dann verwende eben keine direkte WinAPI-
![]() ![]() Oder
Delphi-Quellcode:
Application.MessageBox('Hallo', 'Titel');
Oder du versucht es z.B. so
Delphi-Quellcode:
Oder man spielt mal mit
Application.NormalizeAllTopMosts;
try MessageBox(Application.ActiveFormHandle, PChar('Hallo'), PChar('Titel'), MB_OK); finally Application.RestoreTopMosts end; ![]() ![]() |
AW: messagebox hinter modularen Fenstern
Das ist egal. Das passiert bei messagedlg, messagebox.
Showmessage fällt wohl raus, da man keine Abfragen damit abbilden kann. Und ich will nicht spielen, wie haben eine produktives System. Ich will mir nicht immer einen Kopf machen müssen, wenn ich eine Frage dem Anwender stellen will. Ich schau mir einmal das oben genannte Beispiel an. |
AW: messagebox hinter modularen Fenstern
Zitat:
|
AW: messagebox hinter modularen Fenstern
Man könnte auch mal verraten um welche Delphi-Version es geht.
Denn irgendwo zwischen Delphi 7 und XE wurde die Behandlung der Fensterreihenvolge verändert. |
AW: messagebox hinter modularen Fenstern
Bei einem Delphi2007-Programm habe ich es definitiv. Bei meinen XE-Programmen fällt mir gerade kein Fall ein, evtl. wurde das da tatsächlich behoben.
|
AW: messagebox hinter modularen Fenstern
Bei den eigenen Kapselungen der VCL-Dialoge, ist bei uns ein NormalizeTopMost, bzw. NormalizeAllTopMosts drumrum. (ich weiß jetzt aber nicht ob das erst mit der Umstellunge auf XE rein kam, oder schon bei D7 so war)
Bei den Dialogen des Eurekalog, welche fast immer hinter anderen Fenstern fest hingen, wurde das über unter Anderem über OnModalBegin/OnModalEnd gelöst. Was aber später dann Folgendes durch ersetzt wurde.
Delphi-Quellcode:
procedure THauptForm.EurekaLog1ExceptionActionNotify(EurekaExceptionRecord: TEurekaExceptionRecord; EurekaAction: TEurekaActionType; var Execute: Boolean);
begin if not (edoShowInTopMostMode in CurrentEurekaLogOptions.ExceptionDialogOptions) then CurrentEurekaLogOptions.ExceptionDialogOptions := CurrentEurekaLogOptions.ExceptionDialogOptions + [edoShowInTopMostMode]; if EurekaAction = atShowingExceptionInfo then Application.NormalizeTopMosts; if EurekaAction = atShowedExceptionInfo then Application.RestoreTopMosts; end; |
AW: messagebox hinter modularen Fenstern
Ich habe dieses Problem bei Delphi 2007 bei eingeschaltetem Application.MainFormOnTaskbar nicht mehr beobachtet. Allerdings habe ich die Forms.pas modifiziert um diverse bekannte Bugs (aus der QC) zu beseitigen. Möglicherweise habe ich dabei auch dieses Problem beseitigt (ist jetzt auch schon etwas her). Wer diese modifizierte Version haben möchte, kann sich ja per pm bei mir melden.
|
AW: messagebox hinter modularen Fenstern
Wir werden das nun im Auge behalten. Wirklich reproduziert bekommen wir das allerdings nicht.
Der Hinweis von MainFormOnTaskbar ist interessant im Bezug auf Wine. Weil in Wine haben wir immer 2 Fenster pro Applikation. Beim suchen im Netz würde dies das Verhalten auch erklären. Wir nutzen (noch) Delphi 6. Wir sind unsere Software auf XE4 am umstellen, aber hier und da gibt es noch ein paar kleine Probleme die gelöst werden müssen. |
AW: messagebox hinter modularen Fenstern
Das ist bekannt als "ghosting", der mMn praktischste Workaround ist, am Anfang des Codes (dpr, oder initialization einer Unit)
![]()
Delphi-Quellcode:
procedure DisableProcessWindowsGhosting;
var DisableProcessWindowsGhostingImp: procedure; begin {$IFNDEF FPC} DisableProcessWindowsGhostingImp := GetProcAddress(GetModuleHandle('user32.dll'), 'DisableProcessWindowsGhosting'); if (@DisableProcessWindowsGhostingImp <> nil) then begin DisableProcessWindowsGhostingImp; end; {$ENDIF FPC} end; |
AW: messagebox hinter modularen Fenstern
Sich jemand schon einmal das
![]() angeschaut. Normalisierung der Delphi Anwendung? Das beschrieben Problem was durch ghosting Auftritt kenne ich. Fenster die eigentlich "zu" sein sollten, sind immer noch sichtbar und man bekommt sie auch nicht mehr geschlossen. Drückt der Anwender auf irgendwelche Buttons, funktioniert das Programm nicht einwandfrei. Passiert vor allem dann, wenn beim close vom Fenster irgendwas zu lange dauert. |
AW: messagebox hinter modularen Fenstern
DisableProcessWindowsGhosting hat bei mir definitiv gegen die Dialoge im Hintergrund geholfen, was Du als beschrieben beschreibst kenne ich nun wieder nicht :-D
Diese "Normalisierung" dürfte je nach OS- und Delphi-Version deutlich komplexer sein, als dort beschrieben. Einiges ähnliches habe ich auch schon ausprobiert, dann aber OS-spezifisch unterschiedlich behandeln müssen. |
AW: messagebox hinter modularen Fenstern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11: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