Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Verhindern, daß ein Fenster den Fokus bekommt (https://www.delphipraxis.net/193825-verhindern-dass-ein-fenster-den-fokus-bekommt.html)

Rainer Wolff 13. Sep 2017 11:17

Verhindern, daß ein Fenster den Fokus bekommt
 
Hallo,

ich habe eine Anwendung, die auf zwei Monitore verteilt ist. Der Primärmonitor hat die eigentliche Anwendung, auf dem zweiten Monitor werden Statusinfos angezeigt, bedient wird dort nicht.

Nun habe ich beim Drucken einen Vorschaudialog, der zuerst eine Progressbar und dann die Druckvorschau anzeigt.

In dem Moment, wo die Progressbar-Form wieder freigegeben wird, geht der Fokus an mein Statusformular auf dem ext. Monitor, die nachfolgende Druckvorschau erscheint dann auf dem Statusbildschirm, anstatt wie gewünscht auf dem Hauptmonitor.

Ich könnte zwar die Progressbar ausblenden (Fortesreport), dann erscheint der Dialog am richtigen Platz, aber lieber wäre mir eine Möglichkeit, diesen Fokuswechsel ganz zu blockieren, so daß mein Statusfenster den Fokus gar nicht bekommen kann.

BerndS 13. Sep 2017 11:22

AW: Verhindern, daß ein Fenster den Fokus bekommt
 
Wenn man statt Form.Show nur Form.Visible := True setzt, wird kein Fokus gesetzt.

hsg 13. Sep 2017 11:25

AW: Verhindern, daß ein Fenster den Fokus bekommt
 
reicht es nicht, dem Hauptfenster nach dem Progressbar den Fokus über SetFocus() zu setzen?

jaenicke 13. Sep 2017 11:53

AW: Verhindern, daß ein Fenster den Fokus bekommt
 
WS_EX_NOACTIVATE in den CreateParams setzen könnte reichen.

Rainer Wolff 13. Sep 2017 11:55

AW: Verhindern, daß ein Fenster den Fokus bekommt
 
Zitat:

Zitat von BerndS (Beitrag 1381017)
Wenn man statt Form.Show nur Form.Visible := True setzt, wird kein Fokus gesetzt.

Beim Aufruf des Statusfensters visible:=true anstatt show reicht offensichtlich nicht, das Statusfenster bekommt trotzdem wieder den Fokus bei der Druckvorschau.

Zitat:

Zitat von hsg (Beitrag 1381019)
reicht es nicht, dem Hauptfenster nach dem Progressbar den Fokus über SetFocus() zu setzen?

Progressbar und Vorschaudialog sind in einer externen Opensource-Bibliothek (in einem Aufruf), daran möchte ich nicht unnötig herumpfuschen, sonst hab ich bei jedem Update wieder Arbeit.

Ein Problem mit ähnlicher Ursache hatte ich auch schon hier beschrieben, das wäre wohl wahrscheinlich auch beseitigt, wenn mein Statusfenster keinen Fokus erhalten kann.

Rainer Wolff 13. Sep 2017 11:56

AW: Verhindern, daß ein Fenster den Fokus bekommt
 
Zitat:

Zitat von jaenicke (Beitrag 1381020)
WS_EX_NOACTIVATE in den CreateParams setzen könnte reichen.

Hab ich schon probiert, hilft noch nicht

Uwe Raabe 13. Sep 2017 12:17

AW: Verhindern, daß ein Fenster den Fokus bekommt
 
Nur mal so aus der Hüfte heraus: Kannst du nicht einfach im OnActivate-Event des Statusfensters den Focus direkt wieder auf das Hauptformular zu setzen?

zagota 13. Sep 2017 12:21

AW: Verhindern, daß ein Fenster den Fokus bekommt
 
Vielleicht lässt sich mit TScreen.OnActiveFormChange() was basteln...

nahpets 13. Sep 2017 12:42

AW: Verhindern, daß ein Fenster den Fokus bekommt
 
Wenn Du in Deinem Hauptformular eine Ereignisroutine für OnShow schreibst, die Du dem OnShow-Ereignis des Druckvorschauformulares nach dessen Erstellung zuweist, könntest Du es in der Ereignisroutine mal mit sowas probieren:
Delphi-Quellcode:
procedure THauptFormular.FormShowFuerDeinDruckvorschauFormular(Sender: TObject);
begin
  // Oder eine andere Positions- und/oder Größenberechnung zum Zentrieren ... auf dem Monitor.
  DeinDruckvorschauFormular.Left  := Screen.Monitors[Hauptformular.Monitor.MonitorNum].Left;
  DeinDruckvorschauFormular.Width := Screen.Monitors[Hauptformular.Monitor.MonitorNum].Width;
  DeinDruckvorschauFormular.Top   := Screen.Monitors[Hauptformular.Monitor.MonitorNum].Top;
  DeinDruckvorschauFormular.Height := Screen.Monitors[Hauptformular.Monitor.MonitorNum].Height;
  // Eventuell ginge auch sowas:
  DeinDruckvorschauFormular.Left  := Hauptformular.Left + 4;
  DeinDruckvorschauFormular.Width := Hauptformular.Width - 8;
  DeinDruckvorschauFormular.Top   := Hauptformular.Top + 8;
  DeinDruckvorschauFormular.Height := Hauptformular.Height - 16;
end;
Ist allerdings nur geraten, nie ausprobiert.

himitsu 13. Sep 2017 17:46

AW: Verhindern, daß ein Fenster den Fokus bekommt
 
Hier ist wohl nicht das Problem beim "Fokus bekommen", sondern beim "Fokus verlieren".

Wenn das erste Fenster zu geht, dann gibt die VCL den Fokus an ein anderes Fenster und hier kommt die "manchmal" VCL etwas durcheinander.
"Eigentlich" geht der Fokus an das Fenster, was vor Anzeige des ersten Fensters aktiv war. (also der nächste sichtbare Eintrag in Screen.Forms).


Konnte man nicht bei TForm auch angeben, auf welchem Screen sie aufgehen sollen?
Setzen kann man auch explitzit den PopupMode und PopupParent, um so zu regeln über welcher anderen Form sie aufgehen soll.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz