AGB  ·  Datenschutz  ·  Impressum  







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

TAction, Shortcut Probleme

Ein Thema von haentschman · begonnen am 30. Mai 2013 · letzter Beitrag vom 30. Mai 2013
Antwort Antwort
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#1

TAction, Shortcut Probleme

  Alt 30. Mai 2013, 18:42
Hallo alle...

Zum ersten Mal wollte ich intensiv Actions benutzen. 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...
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch
Online

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: TAction, Shortcut Probleme

  Alt 30. Mai 2013, 18:48
Hallo alle...

Zum ersten Mal wollte ich intensiv Actions benutzen. 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?
Ja, TAction macht schon komische Sachen. Die einzige Moeglichkeit, die ich gefunden habe, um Dein Problem zu loesen, ist die TActions der nicht sichtbaren Controls zu disablen.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: TAction, Shortcut Probleme

  Alt 30. Mai 2013, 19:08
...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.

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 ?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: TAction, Shortcut Probleme

  Alt 30. Mai 2013, 19:36
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#5

AW: TAction, Shortcut Probleme

  Alt 30. Mai 2013, 19:49
Danke für die ausführlichen Ausführungen
Zitat:
@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 riecht nach einem Verständnisproblem meinersets. Dieser Vorschlag gefällt mir.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TAction, Shortcut Probleme

  Alt 30. Mai 2013, 19:51
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TAction, Shortcut Probleme

  Alt 30. Mai 2013, 20:00
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.
Haben die Frames als Owner das Form?

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#8

AW: TAction, Shortcut Probleme

  Alt 30. Mai 2013, 20:05
Danke...

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;

Geändert von haentschman (30. Mai 2013 um 20:08 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

AW: TAction, Shortcut Probleme

  Alt 30. Mai 2013, 20:56
Zitat von haentschman:
Das riecht nach einem Verständnisproblem meinersets.
Inwieweit?

Die Actionlisten haben ein Attribut State.
Die Delphi 7-Hilfe schreibt dazu:
Zitat:
Die Eigenschaft State gibt an, ob die Aktionen in der Aktionsliste reagieren, wenn der Benutzer ein Client-Objekt auslöst.

Delphi-Syntax:

type TActionListState = (asNormal, asSuspended, asSuspendedEnabled);
property State: TActionListState;

C++ Syntax:

enum TActionListState {asNormal, asSuspended, asSuspendedEnabled};
__property bool State = {read=FState, write=SetState, default=asNormal};

Beschreibung

Mit State können Sie eine Aktionsliste aktivieren oder deaktivieren. Die folgenden Werte sind für State zulässig:

Wert Bedeutung

asNormal Aktionen führen ihre normalen Reaktionen aus, wenn sie von Client-Objekten oder Direktbefehlen ausgelöst werden.
asSuspended Die Aktionen in der Aktionsliste reagieren nicht, wenn sie von Client-Objekten ausgelöst werden. Die Eigenschaft Enabled aller Aktionen in der Liste bleibt unverändert.
asSuspendedEnabled Die Aktionen in der Aktionsliste reagieren nicht, wenn sie von Client-Objekten ausgelöst werden. Die Eigenschaft Enabled aller Aktionen in der Liste wird auf True gesetzt. Wird zum Entwurf von ActionBars verwendet.
Es muss also zur Laufzeit "nur" der Status für alle Aktionslisten auf asSuspended gesetzt werden und für die Aktionsliste(n) die aktive bleiben soll(en) auf asNormal.

Das dürfte den Aufwand weiter reduzieren.
Hab's gerade mal damit ausprobiert:
Delphi-Quellcode:
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;
Beim Betätigen der Shortcuts bekomme ich dann die Antwort aus dem entsprechenden Frame und von der entsprechenden Aktion.
  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 15:17 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