AGB  ·  Datenschutz  ·  Impressum  







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

TActionList - gleicher ShortCut für zwei Actions

Ein Thema von ThomasWB · begonnen am 30. Mär 2024 · letzter Beitrag vom 1. Apr 2024
Antwort Antwort
Delphi.Narium

Registriert seit: 27. Nov 2017
2.599 Beiträge
 
Delphi 7 Professional
 
#1

AW: TActionList - gleicher ShortCut für zwei Actions

  Alt 1. Apr 2024, 13:50
Bevor Du Form.OnKeyXxx nutzt, probiere bitte, ob OnEnter bzw. OnExit nicht ausreichend sind, um dort Enabled auf True bzw. False zu setzen.

Das Ereignis OnUpdate der ActionList dürfte hier kaum die "richtige" Stelle sein. Die zu einem Treeview gehörende TAction muss halt enabled werden, wenn der Focus zum Treeview wechselt. Die andere Action muss in dem Moment auf Enabled := false gesetzt werden.

Wüsste gerade nicht, wie Du im OnUpdate-Ereignis der TActionList feststellen kannst, welcher Treeview gerade den Focus hat, um dann die entsprechende TAction auf Enabled := true zu setzen.

Frei nach dem Motto:
Delphi-Quellcode:
procedure TForm1.aclUpdate(Action: TBasicAction; var Handled: Boolean);
begin
  Action1.Enabled := TreeView1.HasFocus;
  Action2.Enabled := TreeView2.HasFocus;
  Handled := true;
end;
Beim Nachfolgenden könnte ich mir aber schon vorstellen, dass es funktioniert:
Delphi-Quellcode:
procedure TForm1.TreeView1Enter(Sender: TObject);
begin
  Action1.Enabled := True;
  Action2.Enabled := False;
end;

procedure TForm1.TreeView2Enter(Sender: TObject);
begin
  Action2.Enabled := True;
  Action1.Enabled := False;
end;

procedure TForm1.TreeView1Exit(Sender: TObject);
begin
  Action1.Enabled := False;
  Action2.Enabled := False;
end;

procedure TForm1.TreeView2Exit(Sender: TObject);
begin
  Action1.Enabled := False;
  Action2.Enabled := False;
end;
Prinzipiell kannst Du jederzeit im Programmablauf bei 'ner Action Enabled auf true bzw. false setzen. Das muss nicht im OnUpdate der Actionlist passieren. Im OnUpdate wird aber ggfls. (abhängig davon bei welcher Action gerade Enabled = true ist) entschieden, welche Action zum Zuge kommt.
Zumindest schalte ich in meinen Programmen im Ablauf bestimmte Actions ein oder aus, so dass immer die "passende" aufgerufen wird, auch wenn mehrere über den gleichen ShortCut verfügen. Da ich aber nur Delphi 7 habe, kann ich nicht sagen, ob das Verhalten bei neueren Delphis noch genauso geblieben ist.

Das Ereignis OnUpdate der ActionList habe ich noch nie benötigt. Und ich nutze grundsätzlich 'ne Actionlist und mehr oder weniger viele Actions für die Programmsteuerung.

Was auch noch gehen könnte: Die Logik, die Du momentan in den beiden Actions hast, verlagerst Du in zwei Prozeduren.

Dann machst Du die eine Action, die auf F2 reagiert, dort fragst Du dann sinngemäss sowas ab:
Delphi-Quellcode:
procedure TForm1.ActionFuerF2Execute(Sender: TObject);
begin
  if ActiveControl = TreeView1 then ProcedurFuerTreeView1;
  if ActiveControl = TreeView2 then ProcedurFuerTreeView2;
end;
  Mit Zitat antworten Zitat
msohn

Registriert seit: 2. Mai 2013
Ort: Leipzig
7 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TActionList - gleicher ShortCut für zwei Actions

  Alt 1. Apr 2024, 14:03
Zitat:
Leider funktioniert F2 am anderen Treeview trotzdem nicht.
Das Problem ist, dass TCustomActionList.IsShortCut aufgibt, nach weiteren Actions zu suchen, sobald der Shortcut einer Action übereinstimmt - vollkommen unabhängig davon ob die Action enabled ist etc. also auch wenn Action.HandleShortcut False liefert.

Die einfachste Lösung dafür wären jetzt 2 getrennte ActionLists. Dann funktioniert der Ansatz mit dem disablen.

Leider ist TCustomActionList.IsShortCut nach all den Jahren immer noch nicht virtuell, so dass es keine wirklich elegante Lösung gibt.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
727 Beiträge
 
Delphi 12 Athens
 
#3

AW: TActionList - gleicher ShortCut für zwei Actions

  Alt 1. Apr 2024, 14:36
Zitat:
Leider funktioniert F2 am anderen Treeview trotzdem nicht.
Das Problem ist, dass TCustomActionList.IsShortCut aufgibt, nach weiteren Actions zu suchen, sobald der Shortcut einer Action übereinstimmt - vollkommen unabhängig davon ob die Action enabled ist etc. also auch wenn Action.HandleShortcut False liefert.

Die einfachste Lösung dafür wären jetzt 2 getrennte ActionLists. Dann funktioniert der Ansatz mit dem disablen.

Leider ist TCustomActionList.IsShortCut nach all den Jahren immer noch nicht virtuell, so dass es keine wirklich elegante Lösung gibt.
TForm hat auch eine IsShortcut-Methode, und die ist virtual. Für eine Übersicht des Keyhandlings in der VCL sieh hier. Bitte Geduld, braucht sehr lange zum laden. Alternativ auch in Github.
Peter Below
  Mit Zitat antworten Zitat
ThomasWB

Registriert seit: 21. Jun 2015
38 Beiträge
 
#4

AW: TActionList - gleicher ShortCut für zwei Actions

  Alt 1. Apr 2024, 16:56
Zitat:
Die einfachste Lösung dafür wären jetzt 2 getrennte ActionLists. Dann funktioniert der Ansatz mit dem disablen.
Ich habe jetzt alle Aktionen für den Treeview, für den die Shortcuts nicht funktioniert haben, in eine eigene TActionList gesteckt - und es funktioniert perfekt. Vielen Dank.

Zitat:
Wüsste gerade nicht, wie Du im OnUpdate-Ereignis der TActionList feststellen kannst, welcher Treeview gerade den Focus hat, um dann die entsprechende TAction auf Enabled := true zu setzen.
Ich habe hier mal ein Besipiel für OnUpdate - nicht nur mit Fokus auf Treeview sondern noch ein paar Optionen mehr:
Code:
     actAufgabeDown.Enabled := (ActiveControl = listAufgaben) and
                               (listAufgaben.Selected<>nil) and
                               (listAufgaben.Selected.AbsoluteIndex<>listAufgaben.Items.Count-1);
Da ich nur ganz wenige doppelte oder mehrfache Benutzungen (Buttons, Menüs etc.) meiner Funktionen habe, wäre TActionList nicht so extrem wichtig/sinnvoll. Aber mit der OnUpdate-Methode kann ich direkt bei der Funktion ein enable/disable hinterlegen und muss dies nicht irgendwo in einer eigenen Funktion etc. programmieren. Somit habe ich alles an einer Stelle.
  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 04:01 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