Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Wie Hauptfenster in Vordergrund bringen? (https://www.delphipraxis.net/156134-wie-hauptfenster-vordergrund-bringen.html)

iphi 21. Nov 2010 10:34

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.

toms 21. Nov 2010 10:38

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;
...

iphi 21. Nov 2010 10:50

AW: Wie Hauptfenster in Vordergrund bringen?
 
Zitat:

Die MessageBox könntest du in der Projektdatei anzeigen.
Das möchte ich vermeiden. Im OnCreate lese ich Ini-Files und falls die inkonsistent sind, soll die Warnung erscheinen.

Gibt es da keine andere Möglichkeit?
Warum geht denn das Hauptfenster überhaupt in den Hintergrund?

Sir Rufo 21. Nov 2010 11:00

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;
...

Bummi 21. Nov 2010 11:04

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;

wolfgang_SV 21. Nov 2010 11:27

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;

iphi 21. Nov 2010 12:21

AW: Wie Hauptfenster in Vordergrund bringen?
 
Zitat:

Die MessageBox könntest du in der Projektdatei anzeigen.
Da habe ich dasselbe Problem wie im OnCreate-Event.

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:

formstyle:=fsstayontop;
Hilft auch nichts. Das Fenster ist dann zwar oben, besitzt aber nicht den Fokus.

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.

wolfgang_SV 21. Nov 2010 13:03

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;

DeddyH 21. Nov 2010 13:10

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;

wolfgang_SV 21. Nov 2010 13:17

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...

iphi 21. Nov 2010 14:36

AW: Wie Hauptfenster in Vordergrund bringen?
 
Zitat:

windows.SetForegroundWindow(handle);
Super, das ist der Trick! In meinem Testcode funktioniert es anstandslos.

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

Sir Rufo 21. Nov 2010 14:50

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 von Anwender 08/15
Weil der Anwender möchte, dass auf der nächsten Seite der folgende Text erscheint, drückt er einfach so lange auf die Enter-Taste, bis er auf der nächsten Seite ist und schreibt weiter.
Alles ist super und der Anwender freut sich ... bis ... ja bis er dann auf einem anderen Drucker drucken möchte, oder das Seitenformat angepasst wird.

Schon fängt man an dieses Dokument zu heilen. Ein paar mal Enter hier und da gedrückt, hier und da ein paar mal Delete und jetzt passt es irgendwie.

Zitat:

Zitat von Anwender Pro
Weil der Anwender möchte, dass auf der nächsten Seite der folgende Text erscheint, fügt er einen Seitenwechsel ein.

Wesentlich smarter und spart jede Menge Zeit und Ärger.

Man hat es selber in der Hand, ob man Heiler oder Programmierer sein möchte

wolfgang_SV 21. Nov 2010 15:10

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.

wolfgang_SV 21. Nov 2010 15:30

AW: Wie Hauptfenster in Vordergrund bringen?
 
Zitat:

weil es hierbei zu unerwünschten Nebeneffekten kommen kann, die gar nicht erwünscht sind.
So was nennt man z.B. eine tautologische Aussage..

Sir Rufo 21. Nov 2010 15:46

AW: Wie Hauptfenster in Vordergrund bringen?
 
Zitat:

Zitat von wolfgang_SV (Beitrag 1063070)
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.

Viele (nicht alle) unkonventionelle Wege haben ihren Ursprung aber auch vom Nicht-Wissen oder festhalten an "das haben wir immer so gemacht".

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:

Zitat von wolfgang_SV (Beitrag 1063075)
Zitat:

weil es hierbei zu unerwünschten Nebeneffekten kommen kann, die gar nicht erwünscht sind.
So was nennt man z.B. eine tautologische Aussage..

und es fällt auf :mrgreen:

DeddyH 21. Nov 2010 16:19

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]

iphi 11. Dez 2010 10:37

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.

s.h.a.r.k 11. Dez 2010 10:43

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.

iphi 11. Dez 2010 12:34

AW: Wie Hauptfenster in Vordergrund bringen?
 
Zitat:

Hm, an der Stelle bin ich dann eher der Meinung, dass man die zwei Message-Boxen nacheinander einblenden sollte.
Das tue ich ja auch. Erst geht die eine auf, und wenn die geschlossen wird, dann geht die andere auf, allerdings leider im Hintergrund. Und zu diesem Zeitpunkt gibts noch nicht mal eine Ikone auf der Taskbar, d.h. der Nutzer bekommt davon nichts mit.

Es muss doch irgendwie möglich sein, zwei MessageBoxes nacheinander so auf den Bildschirm zu bringen, dass man sie auch sieht!???

samso 11. Dez 2010 14:03

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;

iphi 11. Dez 2010 15:21

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