Delphi-PRAXiS

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/)
-   -   ShortCuts und nicht modale Fenster (https://www.delphipraxis.net/210804-shortcuts-und-nicht-modale-fenster.html)

hotrs02 13. Jun 2022 14:40

ShortCuts und nicht modale Fenster
 
Hi *.*,

wir haben eine alte Delphi Anwendung, welche zuletzt mit Delphi 5 gepflegt wurde, auf Delphi 11 umgestellt. Diese arbeitet mit vielen nicht modalen Fenstern und ShortCuts. Jetzt zeigt sich folgendes Verhalten: drücke ich in einem Steuerelement in einem nicht modalen Fenster z.B. Entf oder F2, so wird eine Aktion in einem anderen nicht modalen Fenster ausgelöst, welche einen entsprechenden ShortCut zugwiesen hat.

Dieses Verhalten ist definitiv anders als noch in Delphi 5. Gibt es ggf. eine einfache Möglichkeit, das alte Verhalten wiederherzustellen?

Ich habe mir jetzt erstmal mittels TForm.OnActicate und TForm.OnDeactivate in Verbindung mit TActionList.State beholfen.


Gruß

peterbelow 13. Jun 2022 16:39

AW: ShortCuts und nicht modale Fenster
 
Zitat:

Zitat von hotrs02 (Beitrag 1507202)
Hi *.*,

wir haben eine alte Delphi Anwendung, welche zuletzt mit Delphi 5 gepflegt wurde, auf Delphi 11 umgestellt. Diese arbeitet mit vielen nicht modalen Fenstern und ShortCuts. Jetzt zeigt sich folgendes Verhalten: drücke ich in einem Steuerelement in einem modalen Fenster z.B. Entf oder F2, so wird eine Aktion in einem anderen modalen Fenster ausgelöst, welche einen entsprechenden ShortCut zugwiesen hat.

Dieses Verhalten ist definitiv anders als noch in Delphi 5. Gibt es ggf. eine einfache Möglichkeit, das alte Verhalten wiederherzustellen?

Ich habe mir jetzt erstmal mittels TForm.OnActicate und TForm.OnDeactivate in Verbindung mit TActionList.State beholfen.


Gruß

Das ist schon ein mächtiger Sprung, D5 nach 11.1. Die VCL in D5 nutzte für alle Forms das Application.Handle als API owner, spätere Versionen dagegen das Application.Mainform, da es sonst Probleme mit dem Taskbar-Button der Anwendung gab (wird durch den Wert von Application.MainformOnTaskbar kontrolliert). Das hat Auswirkungen auf die relative Z-Order; alle sekundären Forms sind nun im Z-Order über dem Mainform und ansonsten auf der gleichen Ebene. Für modale Forms kann man mit PopupMode = pmAuto dafür sorgen, dass dieses Form über dem voher aktiven aufpoppt.

Was Du beschreibst (falls Du dich nich verformuliert hast) sollte eigentlich unmöglich sein; wenn ein modales Form aktiv ist sind alle anderen Forms disabled und verarbeiten keine Tastatureingaben. Es gibt zwar in der VCL einen Mechanismus, der dem Mainform immer zuerst einen Shortcut präsentiert, aber der sollte nicht dazu führen, dass ein anderes modales Form den Shortcut sieht, das sollte ja disabled sein...

Uwe Raabe 13. Jun 2022 16:42

AW: ShortCuts und nicht modale Fenster
 
Zitat:

Zitat von peterbelow (Beitrag 1507210)
wenn ein modales Form aktiv ist sind alle anderen Forms disabled und verarbeiten keine Tastatureingaben.

Aber es geht offenbar um nicht-modale Forms:
Zitat:

Zitat von hotrs02 (Beitrag 1507202)
Diese arbeitet mit vielen nicht modalen Fenstern und ShortCuts.


himitsu 13. Jun 2022 16:44

AW: ShortCuts und nicht modale Fenster
 
Zitat:

Zitat von peterbelow (Beitrag 1507210)
Die VCL in D5 nutzte für alle Forms das Application.Handle als API owner, spätere Versionen dagegen das Application.Mainform,

Das könnte man zwar zurückstellen, um wieder das alte Verhalten zu bekommen (auch wenn es oft keine gute Idee wäre).
Delphi-Quellcode:
Application.MainFormOnTaskbar := False;

Nur funktioniert das nicht immer richtig und es wird oft dennoch immer die MainForm verwendet.


https://www.delphipraxis.net/205177-...rt-10-4-a.html



Man könnte mal in das ShortCut-Event einen Haltepunkt setzen
und dann schauen von wo der Aufruf her kommt.

Vielleicht sieht man da, wer da warum wie die Tastaturereignisse (falsch) abfängt.




Es sind aber keine globalen ShortCuts, welche sich da gegenseitig bekämpfen?

Uwe Raabe 13. Jun 2022 17:02

AW: ShortCuts und nicht modale Fenster
 
Kannst du mal zeigen, wie die nicht-modalen Forms erzeugt werden?

hotrs02 14. Jun 2022 10:30

AW: ShortCuts und nicht modale Fenster
 
Zunächst danke für die Antworten.

Zur Erklärung: wir hatten damals (die Applikation ist initial mit Delphi 1 oder 2 erstellt worden) versucht, eine Art MDI zu erstellen: es gibt ein relativ schmales Hauptfenster, welches sich am oberen Bildschirmrand positioniert. Mittels Behandlung von WM_GETMINMAXINFO wird eine beliebige Anzahl von nicht modalen Bearbeitungsfenstern unterhalb des Hauptfensters platziert. Ein schnelles Anwählen der nicht modalen Fenster ist durch Knöpfe bzw. eine Fensterliste gewährleistet.

Die nicht modalen Fenster werden eigentlich alle nach dem gleichen Prinzip erzeugt:

Delphi-Quellcode:
constructor TForm2.Create;
begin
  inherited Create(Application.MainForm);

  // ...
end;

procedure TForm1.Foo;
var
  Form2: TForm2;

begin
  Form2 := TForm2.Create;
  // ...
  Form2.Show;
end;
Application.MainFormOnTaskbar wird im Projektquelltext auf TRUE gesetzt. Die Eigenschaft PopupMode wird von uns nicht gesetzt. Es handelt sich um ShortCuts, die TAction-Instanzen über die Eigenschaft ShortCut zugewiesen wurden.

Bislang konnte das Verhalten in Zusammenhang mit einer TOvcNumericField-Instanz (TurboPack Orpheus, Version 4.06) und einer Ableitung von TCustomVirtualStringTree (Version 7.6) beobachtet werden.

peterbelow 14. Jun 2022 11:02

AW: ShortCuts und nicht modale Fenster
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1507212)
Zitat:

Zitat von peterbelow (Beitrag 1507210)
wenn ein modales Form aktiv ist sind alle anderen Forms disabled und verarbeiten keine Tastatureingaben.

Aber es geht offenbar um nicht-modale Forms:
Zitat:

Zitat von hotrs02 (Beitrag 1507202)
Diese arbeitet mit vielen nicht modalen Fenstern und ShortCuts.


Aber er schrieb:
Zitat:

Zitat von hotrs02 (Beitrag 1507202)
Jetzt zeigt sich folgendes Verhalten: drücke ich in einem Steuerelement in einem modalen Fenster z.B. Entf oder F2, so wird eine Aktion in einem anderen modalen Fenster ausgelöst, welche einen entsprechenden ShortCut zugwiesen hat.

Das hat mich halt etwas verwirrt.

hotrs02 14. Jun 2022 11:13

AW: ShortCuts und nicht modale Fenster
 
Da war mir ein Fehler unterlaufen. Ich meinte natürlich beides mal "nicht modal". Ich habe es im ursprünglichen Beitrag geändert.

Uwe Raabe 14. Jun 2022 11:44

AW: ShortCuts und nicht modale Fenster
 
Delphi-Quellcode:
constructor TForm2.Create;
begin
  inherited Create(Application.MainForm);

  // ...
end;
Da haben wir schon den Übeltäter! Übergib mal statt Application.MainForm nur Application. Das sollte dann schon funktionieren.

Ursache: In Delphi 5 werden bei in IsShortCut nur die ActionLists des Forms abgefragt, während bei Delphi 11 (und zig Versionen davor) rekursiv alle Components und deren ActionLists abgeklappert werden (ergibt bei Frames auch Sinn). Da hier die TForm2 & Co. Instanzen eine dieser Components des MainForm ist, nehmen auch deren ActionLists an der ShortCut-Verlosung teil. Dabei gewinnt dann eben das als erstes erzeugte Form.

hotrs02 14. Jun 2022 12:06

AW: ShortCuts und nicht modale Fenster
 
Das funktioniert soweit, vielen Dank.

Allerdings bedarf es dadurch weiterer Anpassungen: bislang wurden im Destruktor des Hauptformulars verschiedene Eigenschaften der geöffneten nicht modalen Fenster ausgewertet und für den nächsten Programmstart gespeichert. Das funktioniert nun nicht mehr, da die Destruktoren der nicht modalen Fenster nun vor dem Destruktor des Hauptfensters aufgerufen werden.

Edit: ein Verschieben der entsprechenden Aktionen aus dem Destruktor in OnClose des Hauptformulars hat das Problem gelöst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 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