![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:16 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