Form kommt nicht immer nach vorne
-
Hallo.
Habe mein eigentlich abgeschlossenes Prog auf einem XP-Laptop getestet.
In ca 10% der Fälle funktioniert es dort nicht, ein Form auszublenden und ein anderes Form im Vordergrund anzuzeigen, welches vorher nicht sichtbar ist. Abgesehen davon werden alle Programmoperationen korrekt ausgeführt.
Auf Win2000 und Win98SE geht alles wunderbar.Ich verwende folgenden Code:
Form1->Hide(); Form2->Visible = true;
Wenn der Fehler Auftritt bleibt Form1 im Vordergrund stehen und Form2 wird hinter Form1 und dem StartForm der Anwendung angezeigt.
Geschrieben habe ich das Programm mit BCB 6 Prof auf Win2000.
Was mich irritiert ist, das es in 90% der Versuche funktioniert und nur manchmal nicht.
Hat jemand ne Idee woran das liegen könnte und was ich dagegen tun kann?
Danke im voraus.
Gruss
chris_f
-
Vielleicht solltest du das Form einfach über die vorgesehene Funktion Show() aufrufen?
-junix
-
Macht show() denn was anderes als Visible auf true setzen?
-
Frag das den VCL Entwickler... die Frage müsste allerdings wohl umgekehrt lauten: Macht Visible was anderes als Hide() oder Show() aufzurufen?
-junix
-
Zitat Borland Hilfe
Beschreibung
Show setzt die Eigenschaft Visible des Formulars auf true und zeigt es im Vordergrund an.
Dürfte also keinen Unterschied machen.
Mich irritiert vor allem, das es nur manchmal auftritt und nur auf XP. Ich mag dieses System sowieso nícht...
-
chris_f schrieb:
Zitat Borland Hilfe
Beschreibung
Show setzt die Eigenschaft Visible des Formulars auf true und zeigt es im Vordergrund an.
[...]
Ich hab den Interessanten Teil deines Quotes mal fett markiert.... für mich impliziert dies ein BringToFront-Aufruf von Show().
-junix
-
Ausserdem:
BCB Hilfe zum Thema schrieb:
The Show and ShowModal methods set Visible to true and bring the form to the front of all open windows.
-junix
-
Dann werde ich das mal ändern und hoffen das es wirkt. Der XP-Laptop hat mich wieder verlassen, daher kann ichs nicht mehr testen.
Solange das Problem nicht mehr auftritt...
Danke!
PS: "wieso" in Deiner Signatur... oder ist das Absicht?
-
-
Trotzdem ist es komisch, dass Form1 nicht verschwindet, oder? Mach doch mal ein Application->ProcessMessages(); direkt nach Form1->Hide();.
-
@ junix
Und ich dachte der wäre original von dir...
War nicht böse gemeint.
-
Es steht doch da, dass M+A+T+T das geschrieben hat!
-
Ich hab das jetzt mal entsprechend geändert. Nur leider kann ich das jetzt halt nicht testen.
ProcessMessages() kannte ich noch gar nicht.
Danke.Achso M+A+T+T. Richtig, Sorry.
-
Application->ProcessMessages() bewirkt, dass alle anstehenden Fenster-Nachrichten für alle Forms abgearbeitet werden. Damit stellst du sicher, dass WM_SHOWWINDOW auch wirklich von Form1 abgearbeitet wird.
-
WebFritzi schrieb:
Application->ProcessMessages() bewirkt, dass alle anstehenden Fenster-Nachrichten für alle Forms abgearbeitet werden.
Nicht zuletzt deshalb sollte diese Funktion mit Vorsicht genossen werden...
-junix
-
..., denn man könnte einen Stack-Überlauf produzieren.
-
Wie kann das passieren?
Soll heißen: Was läuft in diesem Fall falsch?
-
... Naja, das sieht so aus: Deine Anwendung bzw. dein Fenster hat einen Haupt Thread... also quasi einen MainLoop... In diesem werden die Windows Messages verarbeitet. ProcessMessages() ruft nun diesen Mainloop wieder aus und es werden weiter Nachrichten verarbeitet. Nun kann es passieren, dass eine der Nachrichten (z.B: ein Button KLick) wiederum etwas auslöst, das ProcessMessages aufruft. usw. Zum Schluss hast du auf dem Stack hunderte von nicht beendeten ProcessMessage aufrufen, weil immer wieder was dazwischen kam. Irgendwann ist der Stack voll -> Überlauf.
-junix
-
Wieso sollte die Funktion mit Vorsicht genosen werden?
Starke CPU auslastung?Achja, wie wäre es denn mit ShowModal();?
Damit wäre das Fenster auf jeden Fall vorne, allerdings der Zugriff auf andere Fenster gesperrt.
Kann sein, dass es deshalb net in Frage kommt.J0
-
@ junix:
Aha, kapiert. Danke, jetzt versteh ich das.@ JO:
Ja, genau. ShowModal() geht nicht.