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:
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;
Hier kannst Du dann beiden Buttons die gleiche Action zuweisen
Alternative:
Delphi-Quellcode:
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;
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.
Zitat von
dummzeuch:
Ja, TAction macht schon komische Sachen.
Finde ich nicht, es macht nur das, was man programmiert und wenn das komisch ist, kommt auch was komisches raus
Man kann aber halt einen Shortcut nicht mehrfach (kontextabhängig) vergeben. Der gedachte Kontext ist ja nicht Teil der Implementierung. Woher soll das Programm wissen, dass beim ShortCut Alt+X, wenn die 1. Seite eines Pagecontrols aktiv ist, etwas anderes geschehen soll, als bei aktiver Seite 2? Das muss sich irgendwo in der Implementierung wiederspiegeln.
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:
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 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.
Das wäre dann damit erledigt:
Delphi-Quellcode:
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;
Oder alternativ Visbible von der Seite nutzen.
Delphi-Quellcode:
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;
Hoffe, das sind jetzt genug Ideen