Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TActionlist -> 2 Buttons -> Welcher wurde gedrückt ? (https://www.delphipraxis.net/110053-tactionlist-2-buttons-welcher-wurde-gedrueckt.html)

HolgerCW 12. Mär 2008 10:42


TActionlist -> 2 Buttons -> Welcher wurde gedrückt ?
 
Hallo zusammen,

ich habe eine TActionlist, mit der ich zwei Buttons verbunden habe.

Wie kann ich nun in dem Execute-Ereignis herrausfinden, welcher Button gedrückt wurde ?

Gruss

Holger

Muetze1 12. Mär 2008 10:44

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Warum musst du dies überhaupt? Action(List) sind dafür da um definierte Handlungen (Actions) zentral zu definieren und verwalten und dies unabhängig der Position der Anzeige. Wenn du dies unterscheiden musst, dann ist die Action nicht gleich. Von daher zwei getrennte Actions anlegen und deren Handlung entsprechend behandeln.

Ansonsten: Delphi-Referenz durchsuchenTBasicAction.ActionComponent - aber wie gesagt, das klingt eher nach einem Designproblem...

RavenIV 12. Mär 2008 10:53

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Beim OnExecute wird der Sender mitgegeben.
Den kannst Du zu einem Button casten.
Dann kannst Du anhand dem Namen oder Caption oder sonst was herausfinden, welcher Button die Action ausgelöst hat.

Aber prinzipiell hat Muetze recht.
Eine Action sollte nur dann von mehreren Komponenten benutzt werden, wenn wirklich alles 100% gleich ist.
Sonst eben mehrere Actions verwenden

Muetze1 12. Mär 2008 10:55

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Zitat:

Zitat von RavenIV
Beim OnExecute wird der Sender mitgegeben.
Den kannst Du zu einem Button casten.
Dann kannst Du anhand dem Namen oder Caption oder sonst was herausfinden, welcher Button die Action ausgelöst hat.

Nein, der Sender ist immer die TAction.

HolgerCW 12. Mär 2008 11:16

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Vielen dank schon mal.

Es geht darum, das ich zwei unterschiedliche PDF - Dateien mit den beiden Button öffnen möchte. Ich möchte mit der Actionliste die Berechtigung steuern. Das heisst enabled = FALSE/TRUE. Möchte dann halt in der Actionliste Enabled = FALSE für alle PDF-Buttons setzen. Möchte halt nicht jeden Button einzeln steuern müssen, da sie ja von der Funktion das selbe tuen, nur halt die PDF-Datein sind unterschiedlich, die geöffnet werden. Oder ist das ganz falsch gedacht ?

Gruss

Holger

P.S.: Kannst Du mir hier mal kurz Code posten, wie ich aus dem Object Sender einen Button caste ?

RavenIV 12. Mär 2008 11:17

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
OK.
Dann halt per ActionComponent.

Zitat:

Zitat von Delphi-Hilfe
Mit ActionComponent kann die Client-Komponente bestimmt werden, die diese Aktion verursacht hat. In einer Ereignisbehandlungsroutine für OnExecute können Sie beispielsweise durch einen Lesezugriff auf ActionComponent feststellen, welche Benutzeraktion der Auslöser für die Aktion war.

Wenn der Benutzer auf ein Client-Steuerelement klickt, weist der betreffende Client der Eigenschaft ActionComponent einen Wert zu und ruft dann die Methode Execute der Aktion auf. Nach der Ausführung der Aktion wird die Eigenschaft wieder auf nil (Delphi) bzw. auf NULL (C++) gesetzt.


HolgerCW 12. Mär 2008 11:19

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
... hast Du dafür mal ein kleines Code-Beispiel ?

mkinzler 12. Mär 2008 11:24

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Im onExecute-Events wird dir der Parameter Action übergeben, Action.ActionComponent referenziert dann den Auslöser

HolgerCW 12. Mär 2008 11:27

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Vielleicht habe ich jetzt ein Brett vor dem Kopf, aber in dem OnExecute-Event wird doch nur der Sender übergeben ?

Gruss

Holger

RavenIV 12. Mär 2008 11:29

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Zitat:

Zitat von HolgerCW
... hast Du dafür mal ein kleines Code-Beispiel ?

Aber nur, weil Du so nett gefragt hast.
Sollte so funktionieren:
Delphi-Quellcode:
procedure TFoActionForm.AcButtonPressExecute(Sender: TObject);
begin
  if TBasicAction(AcButtonPress).ActionComponent = BuPDFNummerEins then
  begin
    MachWas;
  end
  else if TBasicAction(AcButtonPress).ActionComponent = BuPDFNummerZwei then
  begin
    MachWasAnderes;
  end;
end;

mkinzler 12. Mär 2008 11:29

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Wir Reden hier vom Event der ActionList.

RavenIV 12. Mär 2008 11:42

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Zitat:

Zitat von mkinzler
Im onExecute-Events wird dir der Parameter Action übergeben, Action.ActionComponent referenziert dann den Auslöser

Kleiner Denkfehler:
Delphi-Quellcode:
procedure TMainForm.ApplicationEventsActionExecute(Action: TBasicAction;
  var Handled: Boolean);

procedure TMainForm.MyActionExecute(Sender: TObject);
Es wird also auch noch ein TApplicationEvents benötigt.

Sharky 12. Mär 2008 11:43

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Delphi-Quellcode:
procedure TDemo_Form.ac_blubbExecute(Sender: TObject); // Action : ac_blubb
begin
  ShowMessage((Sender as TAction).ActionComponent.Name); // Zeigt den Namen des Controls über den die Action gestartet wurde
end;

HolgerCW 12. Mär 2008 11:47

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Vielen vielen dank.

Also ich bin nun wie in dem Code-Beispiel über das Event der Action gegangen und nicht über das Event der Actionlist.

Das klappt super.

Danke an euch alle.

Gruss

Holger

RavenIV 12. Mär 2008 11:57

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Trotzdem mein Beispiel:

Du brauchst auf dem Formular eine TActionList und TApplicationEvents

Dann:
Delphi-Quellcode:
procedure TFoStatus.AcButtonPressExecute(Sender: TObject);
begin
  if TBasicAction(AcButtonPress).ActionComponent = BuAbbrechen then
  begin
//    MachWas;
  end
  else if TBasicAction(AcButtonPress).ActionComponent = BuAbbrechen then
  begin
//    MachWasAnderes;
  end;
end;

procedure TFoStatus.ApplicationEvents1ActionExecute(Action: TBasicAction;
  var Handled: Boolean);
begin
  if Action.ActionComponent = BuAbbrechen then
  begin
//    MachWas;
  end
  else if Action.ActionComponent = BuAbbrechen then
  begin
//    MachWasAnderes;
  end;
end;
Nun wird erst ApplicationEvents1ActionExecute und dann AcButtonPressExecute ausgeführt.

Muetze1 12. Mär 2008 12:39

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
@RavenIV: Was ich bei deinen beiden Beispielen vermisse: wo bzw. was ist AcButtonPress?

Wenn, dann typecaste den Sender:

Delphi-Quellcode:
procedure TFoStatus.AcButtonPressExecute(Sender: TObject);
begin
  Assert(Sender is TBasicAction, 'Ups, doch keine TBasicAction...');

  if TBasicAction(Sender).ActionComponent = PDF1Laden then
  begin
//    MachWas;
  end
  else if TBasicAction(Sender).ActionComponent = PDF2Laden then
  begin
//    MachWasAnderes;
  end;
end;

RavenIV 12. Mär 2008 12:42

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Zitat:

Zitat von Muetze1
@RavenIV: Was ich bei deinen beiden Beispielen vermisse: wo bzw. was ist AcButtonPress?

Wenn, dann typecaste den Sender:

Was könnte AcButtonPress wohl sein, wenn wir die ganze zeit von Actions reden? :wall:

Sorry, hab das schnell runtergetippt und das casten vergessen :oops:

Muetze1 12. Mär 2008 12:45

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Zitat:

Zitat von RavenIV
Was könnte AcButtonPress wohl sein, wenn wir die ganze zeit von Actions reden? :wall:

Das habe ich mir auch gedacht, aber damit wäre der Code hinfällig, weil:

1. Du typecastest eine Action Komponente auf ihre Basisklasse zurück - wozu?
2. Du gehst fest davon aus, dass es nur diese eine Action sein kann, die diese Methode aufruft.
3. Du hast ActionComponent immer mit dem gleichen Element verglichen (sprich: in beiden Fällen).

Was das sein könnte habe ich mir gedacht, aber die drei Punkte machten den Code unverständlich bzw. man/der Fragestelelr erkennt den Sinn bzw. intern Ablauf/Aufbau schwerer bzw. nicht.

RavenIV 12. Mär 2008 12:49

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von RavenIV
Was könnte AcButtonPress wohl sein, wenn wir die ganze zeit von Actions reden? :wall:

Das habe ich mir auch gedacht, aber damit wäre der Code hinfällig, weil:

1. Du typecastest eine Action Komponente auf ihre Basisklasse zurück - wozu?
2. Du gehst fest davon aus, dass es nur diese eine Action sein kann, die diese Methode aufruft.
3. Du hast ActionComponent immer mit dem gleichen Element verglichen.

Was das sein könnte habe ich mir gedacht, aber die drei Punkte machten den Code unverständlich bzw. man/der Fragestelelr erkennt den Sinn bzw. intern Ablauf/Aufbau schwerer bzw. nicht.

Man, Mann, Mann.
Wird hier alles auf die Goldwaage gelegt, was man von sich gibt.
Ein klein Wenig mitdenken dürfte wohl nicht zuviel sein. :x

Muetze1 12. Mär 2008 12:51

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Zitat:

Zitat von RavenIV
Man, Mann, Mann.
Wird hier alles auf die Goldwaage gelegt, was man von sich gibt.
Ein klein Wenig mitdenken dürfte wohl nicht zuviel sein. :x

Darum geht es mir hier nicht. Mir war und ist das alles klar gewesen, aber eher weil ich (wie du) genug Erfahrung haben damit, aber ob der Fragesteller dies auch mitbringt, bezweifle ich (will hier keinem zu Nahe treten), da es sonst nicht zu einer Frage gekommen wäre.

RavenIV 12. Mär 2008 12:54

Re: TActionlist -> 2 Buttons -> Welcher wurde gedrückt
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von RavenIV
Man, Mann, Mann.
Wird hier alles auf die Goldwaage gelegt, was man von sich gibt.
Ein klein Wenig mitdenken dürfte wohl nicht zuviel sein. :x

Darum geht es mir hier nicht. Mir war und ist das alles klar gewesen, aber eher weil ich (wie du) genug Erfahrung haben damit, aber ob der Fragesteller dies auch mitbringt, bezweifle ich (will hier keinem zu Nahe treten), da es sonst nicht zu einer Frage gekommen wäre.

Danke für die Blumen. :kiss:
Dein Tip ist angekommen. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 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 by Thomas Breitkreuz