![]() |
Wie Hauptfenster in Vordergrund bringen?
Hallo,
bei mir wird bei Programmstart im OnCreate Event zuweilen ein Warnungsfenster erzeugt. Wird dieses weggeklickt, so landet das Hauptfenster im Hintergrund hinter anderen Anwendungen versteckt. Wie und wo bringe ich das Hauptfenster bei Programmstart in so einem Fall automatisch in den Vordergrund? Beispielcode zur Demonstration des Effektes:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin With Application do begin NormalizeTopMosts; MessageBox('Hello', 'IMPORTANT NOTICE!', MB_OKCANCEL); RestoreTopMosts; end; end; end. |
AW: Wie Hauptfenster in Vordergrund bringen?
Hallo,
Die MessageBox könntest du in der Projektdatei anzeigen.
Delphi-Quellcode:
...
Application.Initialize; Application.MessageBox('Hello', 'IMPORTANT NOTICE!', MB_OKCANCEL); Application.CreateForm(TForm1, Form1); Application.Run; ... |
AW: Wie Hauptfenster in Vordergrund bringen?
Zitat:
Gibt es da keine andere Möglichkeit? Warum geht denn das Hauptfenster überhaupt in den Hintergrund? |
AW: Wie Hauptfenster in Vordergrund bringen?
Was spricht denn dagegen?
Du kannst die Initialisierung doch auch von der MainForm trennen.
Delphi-Quellcode:
...
Application.Initialize; if not MeineInitialisierung then begin Application.MessageBox('Hello', 'IMPORTANT NOTICE!', MB_OKCANCEL); Halt; end; Application.CreateForm(TForm1, Form1); Application.Run; ... |
AW: Wie Hauptfenster in Vordergrund bringen?
Hilft Dir das?
Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin If not FAllreadyActivated then begin FAllreadyActivated := true; MessageBox(handle,'Hello', 'IMPORTANT NOTICE!', MB_OKCANCEL); end; end; |
AW: Wie Hauptfenster in Vordergrund bringen?
so geht es auch...
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin formstyle:=fsstayontop; With Application do begin NormalizeTopMosts; MessageBox('Hello', 'IMPORTANT NOTICE!', MB_OKCANCEL); RestoreTopMosts; end; end; |
AW: Wie Hauptfenster in Vordergrund bringen?
Zitat:
Wenn ich das Warnfenster VOR dem OnActivate oder OnShow Event erzeuge, dann kommt das Hauptfenster ohne Fokus hoch. Das lässt sich auch im OnShow nicht reparieren. Nach Wegklicken der Warnung geht der Fokus auf das ursprünglich aufrufende Programm über (IDE oder File Browser). Zitat:
Ich wollte zwar keinen größeren Programmumbau machen, weil mein Programm riesig ist, aber falls keiner eine einfache Lösung für dieses Problem hat, dann muss ich wohl. |
AW: Wie Hauptfenster in Vordergrund bringen?
versuch es mal so...
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin With Application do begin NormalizeTopMosts; MessageBox('Hello', 'IMPORTANT NOTICE!', MB_OKCANCEL); RestoreTopMosts; end; windows.SetForegroundWindow(handle); end; |
AW: Wie Hauptfenster in Vordergrund bringen?
Eine Idee hätte ich auch noch (ungetestet):
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin With Application do begin NormalizeTopMosts; MessageBox('Hello', 'IMPORTANT NOTICE!', MB_OKCANCEL); RestoreTopMosts; end; PostMessage(handle,WM_ACTIVATE,WA_CLICKACTIVE,0); end; |
AW: Wie Hauptfenster in Vordergrund bringen?
@DeddyH
deine Lösung geht auch nicht. setforegroundwindow sagt ja schon genau das, was gewünscht wird. manchmal sind die Lösungen recht trivial... |
AW: Wie Hauptfenster in Vordergrund bringen?
Zitat:
In meinem eigentlichen Programm musste ich SetForegroundWindow allerdings im OnActivate ausführen. Im OnCreate erzeugte er eine Access Violation. Kann es sein, dass der einen OnActivate Event ausser der Reihe erzeugt? Vielen Dank für Eure Hilfe :-D |
AW: Wie Hauptfenster in Vordergrund bringen?
Es kann sein, dass im OnCreate-Event noch kein Fenster-Handle verfügbar ist.
Schließlich befinden wir uns (gerade bei der MainForm) noch in der Initialisierungsphase der Anwendung. Dieser Trick ist allerdings auch mit Vorsicht zu genießen, weil es hierbei zu unerwünschten Nebeneffekten kommen kann, die gar nicht erwünscht sind. Es gibt halt mehrere Lösungsansätze, wobei nicht alle wirklich regelkonform sind und trotzdem augenscheinlich das richtige liefern. Dann muss man auf einmal mit Tricks diese Lösung heilen und schwupps besteht die Anwendung aus mehr Heilungs- als Arbeitscode. Kleines Beispiel in Word, weil das kommt mir immer wieder unter die Füße: Zitat:
Zitat:
Man hat es selber in der Hand, ob man Heiler oder Programmierer sein möchte |
AW: Wie Hauptfenster in Vordergrund bringen?
Was heißt eigentlich regelkonform programmieren ?
Ich kann dazu nur sagen, dass es im Windows-System und auch im Delphi-System so viele Unregelmäßigkeiten und auch regelrechte Fehler gibt, dass man gar nicht umhin kommt , unkonventionelle Wege zu beschreiten, die vielleicht nicht regelkonform erscheinen, aber letztendlich zu Ergebnissen führen. |
AW: Wie Hauptfenster in Vordergrund bringen?
Zitat:
|
AW: Wie Hauptfenster in Vordergrund bringen?
Zitat:
In diesem speziellen Fall wird aber ein Designfehler mit unkonventionellen Mitteln geheilt. Es soll jeder machen wie er möchte, mein Hinweis ist ja nur, dass man sich nicht wundert, wenn man irgendwann mehr Heiler als Programmierer ist. Wer sich doch wundert ist trotzdem kein Wunder-Heiler :mrgreen: Zitat:
|
AW: Wie Hauptfenster in Vordergrund bringen?
[OT] Ich wünsche mir mehr Wunschdenken, damit die unerwünschten Nebeneffekte nicht erwünscht sind, sondern verwünscht werden, verwünscht nochmal :mrgreen: [/OT]
|
AW: Wie Hauptfenster in Vordergrund bringen?
Jetzt habe ich noch ein gleichartiges Problem:
Ich habe jetzt ZWEI Message-Boxen hintereinander im OnCreate Event Handler. Die erste erscheint wie sie soll im Vordergrund. Die zweite verschwindet allerdings im Hintergrund. Das Hauptfenster erscheit dann Dank Eurer Hilfe wieder im Vordergrund. Wie kann ich bewerkstelligen, dass die zweite Messagebox auch im Vordergrund sichtbar wird? Hier mein Testcode:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin With Application do begin NormalizeTopMosts; MessageBox('Hello', 'IMPORTANT NOTICE!', MB_OKCANCEL); RestoreTopMosts; end; With Application do begin NormalizeTopMosts; MessageBox('2nd. try', '2nd. IMPORTANT NOTICE!', MB_OKCANCEL); RestoreTopMosts; end; end; procedure TForm1.FormShow(Sender: TObject); begin windows.SetForegroundWindow(handle); end; end. |
AW: Wie Hauptfenster in Vordergrund bringen?
Hm, an der Stelle bin ich dann eher der Meinung, dass man die zwei Message-Boxen nacheinander einblenden sollte. Oder man nutzt eine andere Möglichkeit, dem Benutzer etwas mitzuteilen. Stell dir mal vor, du öffnest ein Programm und da poppt eine Box nach der anderen auf, die eine blinkt mehr als die andere -- unästhetisch.
|
AW: Wie Hauptfenster in Vordergrund bringen?
Zitat:
Es muss doch irgendwie möglich sein, zwei MessageBoxes nacheinander so auf den Bildschirm zu bringen, dass man sie auch sieht!??? |
AW: Wie Hauptfenster in Vordergrund bringen?
Ich meine, dass es sich hier um ein spezielles Fehlerverhalten von Delphi 6 handelt. Bei Delphi 2007 ist das Verhalten wieder anders. Deshalb würde ich diesen workaround mit Vorsicht genießen.
Ich würde da mal folgenden Ansatz in die Diskussion werfen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin {$if RTLVersion<18} windows.SetForegroundWindow(Application.handle); {$ifend} Application.MessageBox('Hello', 'IMPORTANT NOTICE!', MB_OKCANCEL); Application.MessageBox('2nd. try', '2nd. IMPORTANT NOTICE!', MB_OKCANCEL); end; |
AW: Wie Hauptfenster in Vordergrund bringen?
Hallo Samso,
das funktioniert prima, danke für den Tipp!:-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 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