Button.ONClick vs TActionList

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Button.ONClick vs TActionList

Beitrag von Lorca »

Hallo zusammen,

derzeit kann ich keinen echten Vorteil vom Gebrauch einer ActionList erkennen.
Hat jemand Erfahrung damit und kann Vor und Nachteile aufzählen bzw. beschreiben?

Zur zeit weise ich den einzelnen Buttons die ONClick EVENTs im Coding zu.
Ich kann hier keinen Vorteil einer Actionlist sehen.
Die Verwendung der Actionlist ist aus meiner Sicht genau so statisch wie das OnClick Ereignis.
Schlimmer noch, wenn ich durch falsches Bedienen der Form die Actionlist entfernt habe bzw. aus irgend welchen, nicht näher beschreibbaren Situationen, diese aus der Form entfernen muss ist das Coding ist dann "einfach Wech :)"

Kann mich jemand auf schlauen?

Gruß
Lorca

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1210
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Button.ONClick vs TActionList

Beitrag von fliegermichl »

Die Actionlist hat schon einige Vorteile.

Oft verknüpft man einen Menüeintrag, einen oder mehrere Buttons usw. mit dem selben Eventhandler. Soll jetzt ein Eventhandler aber diesabled werden, weil der im momentanen Programmzustand keinen Sinn hat, muss man alle zugehörigen Menüeinträge, Buttons usw. auf Enabled := false stellen.

Hat man eine Action und stellt die auf false, so werden automatisch alle beteiligten Komponenten ebenfalls automatisch auf disabled gesetzt.
Das gleich gilt für den Hint. Der Hint der Action wird automatisch an alle verknüpften Controls weitergeleitet.

Ausserdem hat man eine zentrale Sammlung aller Actions in einer Actionlist.

Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Re: Button.ONClick vs TActionList

Beitrag von Lorca »

Hallo zusammen, hallo fliegermichl,

danke für Deine Antwort. :)

So ganz verstehe ich Deine Argumente noch nicht.

Das Zusammenspiel mit einem Button in Verbindung mit eine Menü Komponente erschließt sich mit nicht ganz.
Mir geht es weder um die Hints, noch um ein mehrfaches disablen von Funktionen

Ich will hier die TActionList auch nicht schlecht reden :), ich will nur verstehen, welche Vorteile die mir bringt.
Und zwar ohne den Einsatz einer Menüleiste.

Ich baue mir einen Handler und diesen klemme ich dann überall da an wo er benötigt wird.


Gruß
Lorca

Benutzeravatar
Ally
Beiträge: 225
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Button.ONClick vs TActionList

Beitrag von Ally »

Hallo Lorca,

bei einem einfachen Hinweisfenster das nur einen Schließen-Button hat, macht eine ActionList wohl nicht ganz so viel Sinn.
Bei einer komplexen Anwendung die über eine Toolbaar, ein Menüleiste, Popupmenüs und die dazugehörige Imagelist verfügt, sieht das ganz anders aus.
Ich persönlich würde da nur ungern auf die ActionList verzichten.
fliegermichl hat ja schon mal einige Aspekte, die für die Imagelist sprechen, aufgezeigt. Und je komplexer das Projekt wird, um so mehr lernt man die Vorteile zu schätzen.

Gruß Roland

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 221
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint20.3, Win10, Lazarus 2.2.0, FPC3.2.2
CPU-Target: 64Bit
Wohnort: Illertissen
Kontaktdaten:

Re: Button.ONClick vs TActionList

Beitrag von h-elsner »

Ich habe die ActionList vor gar nicht allulanger Zeit für mich entdeckt. Mir war vorher nicht klar, wozu das gut sein soll, so wie es mir jetzt immer noch mit Frames geht. Ich habe das Gefühl, dass es bei Lazurus für mich noch viel zu entdecken gibt.

Zurück ur ActionList. Das Zauberwort heißt 'konsistente Bedienoberfläche'. Wie oben schon gesagt, kann eine Programmfunktion durch mehrere Bedienelemente aufgerufen werden: Buttons, Menüeinträge, aber auch durch Wechsel von TabSheets, Resize und was einem sonst noch einfällt. Ich habe schon oft die OnClick Routine in eine eigene Funktion ausgelagert, weil ich gemerkt hatte, dass der Button nicht der einzige Ausöser ist. Das geht natürlich auch ohne ActionList, aber wenn es irgendwie an der Bedienoberfläche erscheint, dann wird es mühselig, überall die Icon, Hints, Beschriftungen usw. so zu verwalten, dass es konsistent und für den Benutzer wiedererkennbar bleibt. Benutzt man die Actionlist wird das zum Kinderspiel. Man weist der Action das Look & Feel zu und alle Bedienelemente, die damit verbunden sind, bekommen es. Will ich zum Beispiel das Icon für meinen Save-Button ändern, muss ich nicht das ganze Programm durchsuchen, wo Save sonst noch genutzt wird. Oder mir fällt ein besserer Begriff für die Programmfunktion ein, dann ändere ich sie einmal in der Action und überall in meiner Bedienoberfläche wird es geändert.

Ich kenne viele Bedienoberflächen, auch bei kommerziellen Programmen, die einfach zum Gruseln sind (z.B. der Button "Afslut" beim HP-Drucker - was zum Geier soll das sein? Abschluss? Und warum gibt es daneben den Button Beenden der wohl das gleiche macht? - ich rege mich gerade wieder auf...). Hätten die Knaben eine Programmieroberfläche mit Actionlist gehabt, würden viele GUI einfach besser verständlich sein.
Außerdem zwingt mich eine Actionlist, vorher mal darüber nachzudenken, welche Programmfunktionen ich habe und wie ich die dem Benutzer präsentieren will. Und wenn ich das Programm mal später erweitern will, dann bin ich dankbar, wenn ich gleich eine Actionlist eingeführt hatte. Es macht Erweiterung in der GUI sehr viel einfacher.

Gruß HE

wp_xyz
Beiträge: 4495
Registriert: Fr 8. Apr 2011, 09:01

Re: Button.ONClick vs TActionList

Beitrag von wp_xyz »

Ein weiterer Vorteil von Actions sind "Standard-Actions", das sind auf eine spezielle Aufgabe spezialisierte Actions. Wird z.B. eine TFontEdit-Action einem Menü-Punkt/Toolbutton/Contextmenü-Eintrag zugeordnet, dann öffnet sie den Fontauswahl-Dialog, ohne einen Font-Dialog aufs Formular klicken und ihn explizit öffnen zu müssen. Oder TFileExit beendet das Programm, ohne eine Zeile Code.

Die Standard-Actions sind im Action-Editor etwas versteckt im Dropdown-Menü des "+"-Buttons.

In der Anlage ein kleiner Editor, zusammengeklickt aus mehreren Standard-Actions, mit nur ein paar Zeilen Code für das Öffnen und Speichern der Dateien, ansonsten steckt die Funktionalität für Cut, Copy, Paste, Undo, SelectAll in den Actions.
Dateianhänge
standardactions_demo.zip
(11.13 KiB) 29-mal heruntergeladen
standardaction.png
standardaction.png (10.87 KiB) 442 mal betrachtet
standardactionclasses.png
standardactionclasses.png (17.48 KiB) 442 mal betrachtet

Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Re: Button.ONClick vs TActionList

Beitrag von Lorca »

Hallo euch allen, :)

ganz lieben Dank für eure Antworten.

Gut, die Verwendung eine TActionlist zur Konsistenten Bedieneroberfläche, leuchtet mir nun ein.
Besonders die Beispiele von wp_xyz und h-elsner regen mich zu einer Überlegung an, die Actionlist einmal näher zu betrachten.
Also all eure Antworten haben schon etwas für sich. Da ich fast nur mit Buttons arbeite und mich mit der ActionList nicht auskenne,
habe ich mich, (wenn ich ehrlich bin :) ), nur halbherzig befasst. Mein Vorgehen war ein anderes. Ich habe eine Toolbar mir drei enthaltenen Frames aufgebaut. Ein Frame als Audio Komponente (Abspielen, Pause und Stop), ein Frame für die Datennavigation ( First, last, next und Prior) und ein Frame für die Datenbearbeitung ( Insert, Edit ...).
Alle drei Frames habe ich dann in einer Toolbar Komponente zusammen gefasst. Somit habe ich bezüglich meiner Buttons auch immer das gleiche look and feel. Ich schalte dann einfach die benötigten Buttons ein oder aus (Visible) oder aktiviere dieses (Enable) an zentraler Stelle.

Vllt. versuche ich es mal mit der ActionList. :)

Auf jeden fall waren eure netten Kommentare sehr sinnvoll und Aussagefähig. :) Danke dafür.

Viele Grüße
Lorca

charlytango
Beiträge: 668
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.2.4
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: Button.ONClick vs TActionList

Beitrag von charlytango »

@Lorca
Wenn ich eine Anwendung habe in der wie bei dir scheinbar gerade mal 10 bis 20 "Funktionen" (jetzt nicht als function gemeint sondern als Programmfunktionen) dann würde ich persönlich zwar auch eine Actionlist verwenden (wegen der Erweiterbarkeit und Übersicht) aber richtig spannend wird es erst wenn man viele Programmfunktionen unterbringen muß.

In GUI-Anwendungen gibt es zudem meistens mehrere Wege um Programmfunktionen situationsorientiert aufzurufen. Sagen wir mal ein Menüpunkt im Applikationsmenü, ein Speedbutton auf einer Buttonleiste und ein Menüpunkt in einem Kontextmenü weisen alle auf die selbe Programmfunktion.
Die Actionlist bzw die einzelne Action sorgt für die Verbindung der Programmfunktion mit einzelnen GUI-Elementen und trennt somit Oberfläche vom Code.

Weise ich diesen genannten Aufrufpunkten nun eine Action zu werden alle in dieser Action eingestellten GUI-relevanten Eigenschaften an das jeweilige Control weitergereicht. Ein Menüpunkt erhält automatisch die Caption, das Icon, den Hint, Sichtbarkeit, Enabled etc etc. und man muss es nur an einer Stelle ändern.
Umrangieren eines Menüpunktes ist dann nur mehr ein Klacks - da wird nur zugeordnet und nichts mehr programmiert. Alleine bei der Icon-Verwaltung unter unterschiedlicher Auflösung ist man glücklich die nur einmal pro Action zu machen.

Jetzt multipliziere diese Funktionalität zB mit dem Umfang der Menüstruktur von Lazarus, Word, Excel oder anderen umfangreichen Applikationen. Da ist man wirklich froh wenn man die GUI von der Funktionalität trennen kann und dazu noch ein sauberes Ordnungselement hat um die sagen wir 200 und mehr Funktionen , Icons irgendwie wartbar zu machen.

Antworten