![]() |
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ß |
AW: ShortCuts und nicht modale Fenster
Zitat:
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... |
AW: ShortCuts und nicht modale Fenster
Zitat:
Zitat:
|
AW: ShortCuts und nicht modale Fenster
Zitat:
Delphi-Quellcode:
Application.MainFormOnTaskbar := False;
Nur funktioniert das nicht immer richtig und es wird oft dennoch immer die MainForm verwendet. ![]() 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? |
AW: ShortCuts und nicht modale Fenster
Kannst du mal zeigen, wie die nicht-modalen Forms erzeugt werden?
|
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:
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.
constructor TForm2.Create;
begin inherited Create(Application.MainForm); // ... end; procedure TForm1.Foo; var Form2: TForm2; begin Form2 := TForm2.Create; // ... Form2.Show; end; 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. |
AW: ShortCuts und nicht modale Fenster
Zitat:
Zitat:
|
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.
|
AW: ShortCuts und nicht modale Fenster
Delphi-Quellcode:
Da haben wir schon den Übeltäter! Übergib mal statt Application.MainForm nur Application. Das sollte dann schon funktionieren.
constructor TForm2.Create;
begin inherited Create(Application.MainForm); // ... end; 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. |
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