![]() |
TAction, Shortcut Probleme
Hallo alle... 8-)
Zum ersten Mal wollte ich intensiv Actions benutzen. :roll: Jetzt weiß ich, warum ich immer die Finger davon gelassen habe. Mein größtes Problem sind Shortcuts welche auch (logischerweise) ausgeführt werden, obwohl das Control, welchem der Shortcut zugeordnet ist, nicht sichtbar ist. Beispiel: PageControl mit 2 Pages, auf jeder Page 1 Button, jeder Button hat seine eigene Action mit dem gleichen Shortcut... Es wird immer die erste Action ausgeführt die den Shortcut enthält. Kann man das beeinflussen, daß nur der Action.Execute ausgeführt wird wo das Control Visible und Enabled ist? Danke für Erleuchtung... :-D |
AW: TAction, Shortcut Probleme
Zitat:
|
AW: TAction, Shortcut Probleme
...genau davor hatte ich Angst :(
Das sind 20 Tabs, wovon nur immer einer Visible ist, mit jeweils 3 Buttons... Das tue ich mir nicht an. :thumb: Da schiebe ich noch einen nach. Ich habe verschiedene Frames mit Buttons und gleichen Shortcuts. Die Frames werden auf TabSheets platziert. Gilt dann das gleiche ? :gruebel: |
AW: TAction, Shortcut Probleme
Hallo,
eigentlich arbeite ich nur noch mit Actions, da das viel einfacher ist. Menüeintrag, Button... bekommen eine Action zugewiesen (bzw. ein Nachfahre von TActionlist baut das Menü selbst auf) und man muss nicht mehr bei jeder Komponente ein entsprechendes Ereignis einbauen und/oder dort weitere Routinen aufrufen. Macht es eigentlich viel einfacher. Aber: Ein Shortcut ist eine Abkürzung für ein Ereignis / eine Aufgabe und nicht jetzt mal für Dieses und dann mal für Jenes. Aber in Deinem Fall dürfte die Lösung recht einfach sein. Das Pagecontrol hat den ActivePageIndex und den kannst Du im Shortcut-/Actionereignis/Execute abfragen.
Delphi-Quellcode:
Hier kannst Du dann beiden Buttons die gleiche Action zuweisen
case PageControl.ActivePageIndex of
0 : ; // Das was bei dem einen Button gemacht werden soll. 1 : ; // Das was bei dem anderen Button gemacht werden soll. end; Alternative:
Delphi-Quellcode:
Teile, die bei beiden Buttons gemacht werden soll/müssen, können so also einmal implementiert werden, nur für die Unterschiede ist eine entsprechende, getrennte Implementierung notwendig. Du könntest hier also beiden Buttons die gleiche Action zuweisen.
begin
if Sender = Button1 then begin // Was bei Button1 gemacht werden soll. end else if Sender = Button2 then begin // Was bei Button2 gemacht werden soll. end; end; Zitat:
Nach weiteren Antworten versuche ich die jetzt auchnoch zu kommentieren ;-) @haentschman Baue für alle Aufgaben eine eigene Action, diese aber ohne Shortcut. Für jeden Shortcut gibt es ebenfalls eine Action. In der Executemethode dieser Actions kannst Du dann über case ActivePageIndex... die jeweils dann benötigte Action aufrufen. Ggfls. auch geschachtelt, wenn auf einer Seite des PageControls ein TabSheet mit mehreren Seiten ist. Das PageControl hat ein Ereignis onChange (oder so ähnlich) das beim Seitenwechsel aufgerufen wird. Actions haben eine Kategorie. Wenn Du allen Actions, die zu einer Seite gehören die gleiche Kategorie gibst, kannst Du diese zur Laufzeit abfragen. Im OnChange-Ereignis kannst Du dann abhängig von ActivePageIndex die Aktions in einer Schleife Enablen/Disablen. Der Versuch eines Beispiels.
Delphi-Quellcode:
Das dürfte jetzt eigentlich keine so große Programmierorgie werden. Wenn Dir die Kategorie dazu nicht gefällt, kannst Du auch Tag nutzen. Alle Actions, die als Tag den PageIndex haben werden dann in einer Schleife enabled oder disabled.
var
sKategorie : String; i : Integer; begin case ActivePageIndex of 0 : sKategorie := 'BueroInventar'; 1 : sKategorie := 'Fahrzeuge'; 2 : sKategorie := 'Grundstuecke'; ... end; for i := 0 to actionlist.ActionCount - 1 do begin actionlist.Action[i].Enabled := actionlist.Actions[i].Category = sKategorie; end; end; Das wäre dann damit erledigt:
Delphi-Quellcode:
Oder alternativ Visbible von der Seite nutzen.
procedure TfmMain.PageControlChange(Sender: TObject);
var i : Integer; begin for i := 0 to actionlist.ActionCount - 1 do begin actionlist.Action[i].Enabled := actionlist.Actions[i].Tag = PageControl.ActivePageIndex; end; end;
Delphi-Quellcode:
Hoffe, das sind jetzt genug Ideen ;-)
procedure TfmMain.PageControlChange(Sender: TObject);
var i : Integer; begin for i := 0 to actionlist.ActionCount - 1 do begin actionlist.Action[i].Enabled := PageControl.Pages[i].Visible; end; end; |
AW: TAction, Shortcut Probleme
Danke für die ausführlichen Ausführungen :thumb:
Zitat:
In der Zwischenzeit habe ich das mit den Frames ausprobiert. Jeder Frame hat seine eigene ActionList. Die Frames werden auf TabSheet positioniert. In diesem Falle werden gar keine Shortcuts ausgeführt. :gruebel: |
AW: TAction, Shortcut Probleme
Also das mit dem Disablen der unerwünschten Action funktioniert schon mal nicht. Grund ist, daß schon die erste Action (enabled oder nicht) mit dem ShortCut verwendet wird und danach innerhalb der ActionList nicht mehr weiter gesucht wird.
Man kann das aber umgehen, indem man die Actions in verschiedene ActionLists packt. Jetzt muss man zwar immer noch die eine Action disablen (was relativ einfach im OnUpdate geht), aber wenigstens kommt die andere Action noch zum Zuge. |
AW: TAction, Shortcut Probleme
Zitat:
Bei der Suche nach der geeigneten Action werden alle ActionLists durchsucht, die als Owner das Form haben oder sich irgendwie das Form als indirekten Owner haben. Wenn die Frames in der IDE gesetzt worden sind, sollte es funktionieren. |
AW: TAction, Shortcut Probleme
Danke... 8-)
Owner: TabSheet Parent: TabSheet Ich schlaf nochmal drüber...
Delphi-Quellcode:
function TfmMain.CreatePrintTab: TAdvOfficePage;
var aTab: TAdvOfficePage; aFrame: TfrPrint; begin aTab:= TAdvOfficePage.Create(nil); aTab.Name := 'tabPrint'; aTab.ImageIndex:= 131; aTab.Caption:= 'Druckauftrag'; aFrame:= TfrPrint.Create(aTab, FGUI.DBFramework, FGUI.Preferences.CurrentUser); FinishTab(aFrame, aTab); Result:= aTab; end;
Delphi-Quellcode:
procedure TfmMain.FinishTab(aFrame: TfrBase; aTab: TAdvOfficePage);
begin aFrame.OnClose:= DoOnCloseTab; aFrame.Parent:= aTab; aFrame.Align:= alClient; aFrame.Show; pgrMainDetails.ActivePageIndex:= pgrMainDetails.AddAdvPage(aTab); aTab.Show; end; |
AW: TAction, Shortcut Probleme
Zitat:
Die Actionlisten haben ein Attribut State. Die Delphi 7-Hilfe schreibt dazu: Zitat:
Das dürfte den Aufwand weiter reduzieren. Hab's gerade mal damit ausprobiert:
Delphi-Quellcode:
Beim Betätigen der Shortcuts bekomme ich dann die Antwort aus dem entsprechenden Frame und von der entsprechenden Aktion.
procedure TForm1.PageControl1Change(Sender: TObject);
begin Caption := 'Active Seite = ' + IntToStr(PageControl1.ActivePageIndex); frmTestmalwas1.ActionList1.State := asSuspended; frmTestmalwas2.ActionList1.State := asSuspended; frmTestmalwas3.ActionList1.State := asSuspended; case PageControl1.ActivePageIndex of 0 : frmTestmalwas1.ActionList1.State := asNormal; 1 : frmTestmalwas2.ActionList1.State := asNormal; 2 : frmTestmalwas3.ActionList1.State := asNormal; end; end; // Alle Actions haben im OnExecute-Ereignis diese Routine zugewiesen. procedure TfrmTestmalwas.Action1Execute(Sender: TObject); begin ShowMessage(Format('%s %s %s',[ShortCutToText(TAction(Sender).Shortcut), TAction(Sender).Name, Self.Name])); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 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