AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

Ein Thema von Poolspieler · begonnen am 2. Jul 2012 · letzter Beitrag vom 3. Jul 2012
Antwort Antwort
Seite 1 von 2  1 2   
Poolspieler

Registriert seit: 9. Aug 2004
156 Beiträge
 
Delphi XE7 Professional
 
#1

Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 12:29
Hallo zusammen,
manchmal kommt es vor, dass ein simples showmessage('bla'), oder auch ein mein_Fenster.showmodal; HINTER dem Hauptformular verschwindet.
Man hat dann (fast) keine Möglichkeit mehr, das Fenster in den Vordergrund zu holen.
Das Thema wurde 2006 hier http://www.delphipraxis.net/65588-me...ntergrund.html schon mal angesprochen - allerdings ohne so eine richtige Lösung.

Wenn ich anstatt form1.showmodal folgendes schreibe, dann scheint es nicht aufzutreten:
Code:
hauptform.enabled := false;
form1.show;
form1.bringtofront;
Dann muss man aber aufpassen, dass beim Schliessen von form1 das hauptform wieder auf enabled=true gesetzt wird...
form1 muss dann natürlich auf stayontop gestellt sein...
--> bei Anwendungen mit ganz vielen Formularen (die auch noch gleichzeitig offen sein können) wird das aber schnell recht kompliziert...

Es sieht so aus, als ob das Problem vor allem auftritt, wenn zwischen dem Button-Click und dem showmessage viel gemacht wird (z.B. umfangreiche Datei-IO, etc.).

Pseudocode:
Code:
procedure TForm.button1Click(Sender: TObject);
begin
  // Viel Datei-IO
  ...
  showmessage('ich bin fertig! Hoffentlich siehst Du diese Nachricht auch! Oder bin ich wohl versteckt?');
end;
Weiß jemand, woran das liegt - und was man vor allem dagegen tun kann?
Oder muss ich mir wirklich einen eigenen showmessage-Dialog basteln?

Gruß,

Poolspieler
Andreas

Geändert von Poolspieler ( 2. Jul 2012 um 12:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.705 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 12:55
Hilft dieser Thread evtl. weiter? http://www.delphipraxis.net/166408-m...de-wartet.html
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Poolspieler

Registriert seit: 9. Aug 2004
156 Beiträge
 
Delphi XE7 Professional
 
#3

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 13:16
Hallo DeddyH,
vielen Dank für Deine Antwort!

Der Thread geht in die gleiche Richtung.
Aber eine wirkliche Lösung für das Problem habe ich nicht gefunden.

Wie sollte man messages (showmessage) ausgeben - muss man wirklich einen eigenen Dialog basteln?

Viele Grüße,

Poolspieler
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
503 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 13:31
Hallo Poolspieler,

ist Deine Angabe zu Deinem Nutzerkonto korrekt - also das du Delphi XE2 verwendest? Ich kenne das merkwürdige Verhalten von modalen Fenstern / Dialogen nämlich noch von Delphi 2007. Es scheint aber nicht mehr vorhanden zu sein bei Delphi XE2.

Dann aber noch etwas anderes, was mir gerade einfällt: Suche mal nach GhostingWindow bei google. Da gibt es ein ganz blödes verhalten von Windows, um nicht reagierende Anwendungen für den Benutzer zumindest minimal Bedienbar zu halten. Da du viel I/O erwähnt hast, könnte das der Fall sein bei Dir. Windows legt hier ein neues bedienbares Fenster für das vermeintlich "hängende" Fenster an und versteckt das echte hängende Fenster. Beim "zurück schalten" kann tatsächlich etwas schief gehen und der Dialog landet hinter dem Fenster. Das GhostingWindow-Problem beschränkt sich aber meines Wissens nach auf Windows XP. Kannst du ja mal suchen.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 13:32
In ShowMessage stecken weitere Funktionen, da kann man sich den Message-Dialog erzeugen lassen und bevor man ihn anzeigt, könnte man noch etwas am PopupMode und PopupParent rumspielen und notfalls auch noch mit dem FormStyle.
z.B. könnte man sich die oberste Form suchen und den Dialog damit verbinden, damit Delphi den Dialog noch vor dieser Form darstellt.


Du könntest aber natürlich auch dafür sorgen, daß deine Anwendung garnicht erst hängen bleibt.
(z.B. Threads und Co.)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 2. Jul 2012 um 13:34 Uhr)
  Mit Zitat antworten Zitat
Poolspieler

Registriert seit: 9. Aug 2004
156 Beiträge
 
Delphi XE7 Professional
 
#6

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 13:54
Hallo Zusammen,
danke für Eure Antworten!

Ja, ich nutze Delphi XE2 Update4.
Unter Win7 habe ich das Problem (noch...) nicht gesehen.
Es tritt aber unter WinXP auf. Mit und ohne Delphi-IDE.

Meine Anwendung nutzt bereits Threads für die UDP-Kommunikation und allem was dazu gehört.
Jede kleine (oder auch größere...) Datei-IO und vor allem die Bedienung des UDP-Threads in einen Thread auszulagern fand ich nicht sinnvoll - oder liege ich da falsch?

Beispiel:
Code:
if OpenDialog.Execute then begin
  ...
  // Dateiinhalt auf konsistenz prüfen (CRC, etc.) --> dauert ca. 2 Sekunden
  if _fehler then begin
    showmessage('Es ist ein Fehler aufgetreten!'); // dieser Dialog bleibt manchmal im Hintergrund
  end;
end;
--> warum sollte man dies in einen Thread verpacken? Ist das nicht zu viel Aufwand?

Viele Grüße,

Poolspieler
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
503 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 14:00
Hallo Poolspieler,

ich glaube, dass es relativ wenig Aufwand ist bei XE2, eine vorhandene Methode in einem Thread ausführen zulassen. Man sollte nur irgendwie evtl. prüfen, ob hier VCL-Sachen gemacht werden. Und ein Versuch wäre es Wert.

Die Methode mit dem GhostingWindow heißt übrigens DisableProcessWindowsGhosting und das Problem existiert SEIT XP und nicht nur bei XP. In welchem Zusammenhang die Delphiversion steht, kann ich natürlich nicht sicher beantworten. Ich hatte damals große Probleme mit Delphi2007 und ein XE-Benutzer hatte die Probleme glaub ich nicht.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules

Geändert von ChrisE ( 2. Jul 2012 um 14:02 Uhr)
  Mit Zitat antworten Zitat
Poolspieler

Registriert seit: 9. Aug 2004
156 Beiträge
 
Delphi XE7 Professional
 
#8

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 14:13
Hallo ChrisE,
vielen Dank für den guten Hinweis - so tritt das Problem (offensichtlich...) nicht mehr auf.

Hier der Code von http://stackoverflow.com/questions/1...odal-is-called:
Code:
procedure DisableProcessWindowsGhosting;
var
  DisableProcessWindowsGhostingProc: procedure;
begin
  DisableProcessWindowsGhostingProc := GetProcAddress( 
    GetModuleHandle('user32.dll'),
    'DisableProcessWindowsGhosting');
  if Assigned(DisableProcessWindowsGhostingProc) then
    DisableProcessWindowsGhostingProc;
end;
"Dumme" Frage:
Welche tolle Möglichkeit hat man denn unter XE2 eine beliebige Routine in einem eigenen Thread laufen zu lassen?
Vor allem, wenn man trotzdem synchronisiert z.B. showmessage nutzen muss?

Gruß,

Poolspieler
Andreas
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
376 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 15:05
Welche tolle Möglichkeit hat man denn unter XE2 eine beliebige Routine in einem eigenen Thread laufen zu lassen?
Vor allem, wenn man trotzdem synchronisiert z.B. showmessage nutzen muss?
z.b. anonyme Prozeduren in anonymen Threads

Delphi-Quellcode:
procedure MySynchProcedure(Param1: String; Param2: TObject; Param3: TDictionary<Integer, TMyObject>);
begin
  TThread.Queue(Nil,
  procedure
  begin
    // do anything synchronized here
  end);
end;

procedure DoAnythingTimeConsuming;
var
  Thrd: TThread;
begin
  Thrd: TThread.CreateAnonymousThread(
  procedure
  begin
    // do anything time consuming stuff here
    sleep(100000);
    
    MySynchProcedure(Param1, Param2, Param3);
  end);
  Thrd.FreeOnTerminate:= True;
  Thrd.Start;
end;
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.

Geändert von taveuni ( 2. Jul 2012 um 15:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
503 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form

  Alt 2. Jul 2012, 15:43
Hallo,

genau sowas, wie das Beispiel von taveuni hab ich gemeint.

Und das jetzt das DisableProcessWindowsGhosting funktioniert, zeigt ja, dass hier etwas stattfindet im Mainthread, dass eigentlich ausgelagert werden sollte in einen Thread. Denn es blockt den Mainthread so sehr, dass Windows denkt, die Anwendung wäre abgestürzt bzw. würde fest hängen.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2018 by Daniel R. Wolf