AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls In Form1 auf eine in DataModul definierte TAction zugreifen
Thema durchsuchen
Ansicht
Themen-Optionen

In Form1 auf eine in DataModul definierte TAction zugreifen

Ein Thema von Glühwürmchen · begonnen am 28. Aug 2014 · letzter Beitrag vom 2. Sep 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Glühwürmchen
Glühwürmchen

Registriert seit: 31. Okt 2003
Ort: Pfinztal
156 Beiträge
 
Delphi 2010 Professional
 
#1

In Form1 auf eine in DataModul definierte TAction zugreifen

  Alt 28. Aug 2014, 11:32
Hallo,

ich habe im "DataModuleActionsUndMenus" eine ActionList angelegt. Darin befinden sich beispielsweise folgende drei Actions:
- Action_HM_Datei_Kategorisieren
- Action_HM_Datei_Beenden
- Action_HM_Film_Suchen
...

In "FormTsKatalog" liegt eine "TMainMenue"-Komponente, mit den Menüeinträgen
- Datei
- Kategorisieren
- Beenden
- Film
...

Die ActionList lag zuvor im "FormTsKatalog". Ihre Actions sind so geschrieben, dass sie vom "OnClick"-Event des Hauptmenüs direkt aufgerufen werden können.
Ich also im OI von "Datei-Beenden" unter "OnClick" "Action_HM_Datei_BeendenExecute" eintragen bzw. auswählen(!) konnte.

Nun lege ich aber meine Actions deshalb an, weil ich deren Code nicht an mehreren Stellen im Programm stehen haben will, sondern nur deren Aufruf.
(Ist halt so beim OO Programmieren)

Also tat ich mir die Arbeit an und "verschob" die TActionList in ein DataModule.

Jetzt, wo alles fertig ist, stelle ich zum wiederholten Male fest, dass es mir nicht gelingen will, im OI von "Datei-Beenden" unter "OnClick" des Menüeintrages "HM_Datei_Beenden" im "FormTsKatalog"
die Aktion "Action_HM_Datei_BeendenExecute" zuzuweisen.
Dies gelingt nur über den Umweg, einen Doppelklick im OI zu machen und der Methode "HM_Datei_BeendenOnClick" den Aufruf "Action_HM_Datei_BeendenExecute(Sender);" einzufügen.

Frage:
Ist das wirklich so? also Muss das so sein?
Oder gibt es da irgendwie eine Abkürzung?
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: In Form1 auf eine in DataModul definierte TAction zugreifen

  Alt 28. Aug 2014, 11:46
Du hast den Code er Actions mit umgezogen und das Datenmodul per "uses" in Deinem Hauptformular aufgenommen?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: In Form1 auf eine in DataModul definierte TAction zugreifen

  Alt 28. Aug 2014, 13:46
Und wieso willst du dem OnClick-Event etwas zuweisen?

Bei Actions weist man z.B. dem Menü-Item einfach die passende Action zu und gut ist.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Glühwürmchen
Glühwürmchen

Registriert seit: 31. Okt 2003
Ort: Pfinztal
156 Beiträge
 
Delphi 2010 Professional
 
#4

AW: In Form1 auf eine in DataModul definierte TAction zugreifen

  Alt 28. Aug 2014, 14:34
Ja, ich habe den Code mit umgezogen.
Gehören denn die Action und das ActionExecute nicht zusammen?


Wenn ich nur die passende Action zuweise, dann tut diese nachher nichts, wenn sie etwas tun soll.
Woher sollte sie auch wissen, bei welchem der Events (das sind beim Menü immerhin vier Stück) sie sich angesprochen fühlen soll?
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: In Form1 auf eine in DataModul definierte TAction zugreifen

  Alt 28. Aug 2014, 14:39
Ja eine Action hat eine ActionExecute-Methode, da steht drin, was beim Auslösen der Action passieren soll.

Ein MenuItem hat eine Action-Eigenschaft, wo festgelegt werden kann, welche Action ausgelöst werden soll, wenn der Menüpunkt angeklickt wird (geht auch bei einem Button und vielen anderen Controls).

Wenn du nur die Methoden zuweisen willst, wofür nimmst du denn dann überhaupt die Actions? Damit du per Doppelklick einen Methodenrumpf bekommst?

Der Vorteil von Actions ist doch, dass hier von den Actions einige Eigenschaften übernommen werden (Caption, Enabled, Selected) und dieses dann an mehrere Controls dranklatschen kann.

"Der Herr noch einen Button zum Drucken?" - Button hin, Action zum Drucken dran, fertig
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (28. Aug 2014 um 14:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Glühwürmchen
Glühwürmchen

Registriert seit: 31. Okt 2003
Ort: Pfinztal
156 Beiträge
 
Delphi 2010 Professional
 
#6

AW: In Form1 auf eine in DataModul definierte TAction zugreifen

  Alt 28. Aug 2014, 14:54
Ja eine Action hat eine ActionExecute-Methode, da steht drin, was beim Auslösen der Action passieren soll.
Soweit ist das klar.

Ein MenuItem hat eine Action-Eigenschaft, wo festgelegt werden kann, welche Action ausgelöst werden soll, wenn der Menüpunkt angeklickt wird (geht auch bei einem Button und vielen anderen Controls).
Da ist mir etwas unklar: Woher weiß das Kontrollelement (MenuItem, Button, ...) dass genau diese Action ausgeführt werden soll, wenn ich das Ding anklicke.
Und was mache ich, wenn ich eine Action für die zu erledigende Arbeit beim klicken und eine andere Action für die zu erledigende Arbeit beim "drüber hovern" habe?

"Der Herr noch einen Button zum Drucken?" - Button hin, Action zum Drucken dran, fertig
Das wiederum ist klar. Genau deshalb nehme ich die Actions.
Und natürlich auch deshalb, weil ich denen so ein schickes Bildchen zuweisen kann, einen Shurtcut, eine Caption, und sie so bequem En- und disablen kann mit allen dazugehörenden Konsequenzen.
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: In Form1 auf eine in DataModul definierte TAction zugreifen

  Alt 29. Aug 2014, 22:25
Nun lege ich aber meine Actions deshalb an, weil ich deren Code nicht an mehreren Stellen im Programm stehen haben will, sondern nur deren Aufruf.
(Ist halt so beim OO Programmieren)

Also tat ich mir die Arbeit an und "verschob" die TActionList in ein DataModule.
Actionlists sind der "Klebstoff" zwischen Buttons & Menuitems und Events.
Man kann zwar Actionlists auf ein Datenmodul legen aber das ist nicht der richtige Weg.
Eigentlich müsste man verhindern dass man Actionlists auf etwas anderes als Form und Frames legen kann...
fork me on Github

Geändert von sx2008 (29. Aug 2014 um 22:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.560 Beiträge
 
Delphi 12 Athens
 
#8

AW: In Form1 auf eine in DataModul definierte TAction zugreifen

  Alt 30. Aug 2014, 01:27
Actionlists sind der "Klebstoff" zwischen Buttons & Menuitems und Events.
Man kann zwar Actionlists auf ein Datenmodul legen aber das ist nicht der richtige Weg.
Eigentlich müsste man verhindern dass man Actionlists auf etwas anderes als Form und Frames legen kann...
Das sehe ich anders. Wenn man die Funktionen im Datamodule hat, kann man z.B. für das Programm unterschiedliche Oberflächen verwenden. Du kannst dann die Actions einfach an eine andere Oberfläche binden. Darüber hinaus kann ich den Source-Code aus dem Actionmodule auch für mobile Anwendungen verwenden (die ja i.d.R. andere Formen als die Desktop-Anwendungen haben). Und Nachteile für diesen Weg sind mir keine bekannt.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

AW: In Form1 auf eine in DataModul definierte TAction zugreifen

  Alt 30. Aug 2014, 16:28
Wenn man die Funktionen im Datamodule hat, kann man z.B. für das Programm unterschiedliche Oberflächen verwenden
Dann stell dir einfach mal vor du würdest das Datenmodul aus einer Konsolenanwendung heraus anwenden.
In diesem Fall merkt man nämlich dass eine Actionlist oder gar ein Actionmanager keine universelle API darstellt sondern in die Welt der Benutzeroberflächen gehört.

Oder anderst formuliert:
Angenommen man hat eine VCL-Anwendung und man möchte daraus zusätzlich eine Konsolenanwendung und einen Dienst der nur über TCP/IP kommuniziert ableiten.
Man würde also die Businesslogik extrahieren und in einen eigenen Namespace legen und getrennt von den 3 Anwendungarten aufbewahren.
Datenmodule gehören zur Businesslogik (bzw. zur Datenzugriffsschicht).
Aber die Actions, ActionLists und ActionManager müsste man entfernen denn schließlich sind diese Klassen in dem Namespace "Vcl.ActnList" bzw. "Vcl.ActnMan".

Man kann auch das Model-View-Controller Entwurfsmuster heranziehen.
Wohin gehören die ActionLists?
Ich würde sagen weder ins Modell noch in die View sondern ActionLists nehmen die Aufgaben von Controllern wahr.
Die ganze Architektur der VCL ist so aufgebaut, dass Delphi Steuerelemente gleichzeitig View- und Controller-Aufgaben wahrnehmen.
Ein Delphi Formular vereinigt sowohl View als auch Controller in sich, daher sind Actionlists auf dem Formular am Besten aufgehoben.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von Glühwürmchen
Glühwürmchen

Registriert seit: 31. Okt 2003
Ort: Pfinztal
156 Beiträge
 
Delphi 2010 Professional
 
#10

AW: In Form1 auf eine in DataModul definierte TAction zugreifen

  Alt 31. Aug 2014, 07:59
Hm, nachdem ich mir Euer beider Argumente durchgelesen habe, neige ich dazu, Euch beiden Recht zu geben:

Der Grund, warum ich überhaupt auf die Idee kam, die Actionlist in das Datenmodule zu legen, war, dass ich deren Actions dann auf allen Formularen in der Anwendung verwenden kann, ohne immer die jeweiligie Unit in die USES-Klausel aufnehmen zu müssen.
Also angenommen, ich habe 20 Formulare und auf jeder liegt eine ActionList. Und dann baue ich ein 21. Formular zusammen, das Elemente jeden anderen Formulars in sich vereinigt (die Sinnhaftigkeit dessen sei jetzt mal dahingestellt), dann müsste ich im einen Fall 20 Units in die USES-Klausel packen und im anderen Fall nur das Datamodule.

Andererseits habe ich jedoch weiter oben beschrieben, dass ich, liegt die Actionlist auf dem Formular, wo deren Actions gebraucht werden, für jedes Ereignis einer Komponente eine eigene Action zuweisen kann, während ich in Dem Fall, dass die Actionlist im Datamodule liegt, nur das jeweilige Standardevent mit einer Action belegen kann und für die anderen Events einen Umweg laufen muss.
Darüber hinaus muss der Delphianer noch wissen, welches denn nun das Standardevent einer Komponente ist.

Das Standardevent eines Buttons oder eines MenuItems mag ja noch eindeutig sein. Aber was ist das Standardevent eines Panels oder eines Formulars?


Darf ich noch einmal an die Frage erinneren, welchen Vorteil die Verwendung des wesentlich komplizierter ercheinenenden AchtionManagers, der ja seine eigene Actionlist mitbringt, gegennüber der Verwendung einer einfachen Actionlist hat?
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 16:43 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