AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ShortCuts und nicht modale Fenster

Ein Thema von hotrs02 · begonnen am 13. Jun 2022 · letzter Beitrag vom 14. Jun 2022
Antwort Antwort
hotrs02

Registriert seit: 7. Apr 2022
40 Beiträge
 
#1

ShortCuts und nicht modale Fenster

  Alt 13. Jun 2022, 15:40
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ß

Geändert von hotrs02 (14. Jun 2022 um 12:12 Uhr)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#2

AW: ShortCuts und nicht modale Fenster

  Alt 13. Jun 2022, 17:39
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...
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#3

AW: ShortCuts und nicht modale Fenster

  Alt 13. Jun 2022, 17:42
wenn ein modales Form aktiv ist sind alle anderen Forms disabled und verarbeiten keine Tastatureingaben.
Aber es geht offenbar um nicht-modale Forms:
Diese arbeitet mit vielen nicht modalen Fenstern und ShortCuts.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#4

AW: ShortCuts und nicht modale Fenster

  Alt 13. Jun 2022, 17:44
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).
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?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (13. Jun 2022 um 17:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#5

AW: ShortCuts und nicht modale Fenster

  Alt 13. Jun 2022, 18:02
Kannst du mal zeigen, wie die nicht-modalen Forms erzeugt werden?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hotrs02

Registriert seit: 7. Apr 2022
40 Beiträge
 
#6

AW: ShortCuts und nicht modale Fenster

  Alt 14. Jun 2022, 11:30
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.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#7

AW: ShortCuts und nicht modale Fenster

  Alt 14. Jun 2022, 12:02
wenn ein modales Form aktiv ist sind alle anderen Forms disabled und verarbeiten keine Tastatureingaben.
Aber es geht offenbar um nicht-modale Forms:
Diese arbeitet mit vielen nicht modalen Fenstern und ShortCuts.
Aber er schrieb:
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.
Peter Below
  Mit Zitat antworten Zitat
hotrs02

Registriert seit: 7. Apr 2022
40 Beiträge
 
#8

AW: ShortCuts und nicht modale Fenster

  Alt 14. Jun 2022, 12:13
Da war mir ein Fehler unterlaufen. Ich meinte natürlich beides mal "nicht modal". Ich habe es im ursprünglichen Beitrag geändert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#9

AW: ShortCuts und nicht modale Fenster

  Alt 14. Jun 2022, 12:44
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hotrs02

Registriert seit: 7. Apr 2022
40 Beiträge
 
#10

AW: ShortCuts und nicht modale Fenster

  Alt 14. Jun 2022, 13:06
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.

Geändert von hotrs02 (14. Jun 2022 um 13:12 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 Uhr.
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