Umstellung auf TActions
Samstag, Dezember 4th, 2010Die letzte Nacht habe ich damit verbracht, die Buttons der Funktionsleiste unter dem Vorschaubild umzustellen. Als ich vor einem Jahr begonnen habe, das neue BVASystem zu entwickeln, war die Funktionsleiste so ziemlich das erste was ich implementierte. Ich entschied mich dafür, die Toolbar in einer eigenen Komponente, der TImgViewToolbar, zu kapseln. Für die einzelnen Funktionen der Knöpfe erstellte ich Ereignisse, die ich in der Hauptanwendung implementierte. Die Steuerung über den Status der Buttons übernahm die Komponente, war nach außen hin also nicht sichtbar.
Anfang der Woche stolperte ich, dann aber beim Neugestalten des Hauptmenüs auf ein Problem. Auch im Hauptmenü müssen die einzelnen Funktionen wie in der Funktionsleiste aktiviert bzw. deaktiviert werden. Einfachste Lösung wäre sicher gewesen, die Funktion aus der TImgViewToolbar zu kopieren und ebenfalls für das Hauptmenü zu verwenden. Da ich aber Wert darauf lege, sauberen Programmcode zu schreiben, war diese Lösung für mich sofort unten durch.
Meine Wahl fiel schlussendlich dann darauf, die Funktionen über den TActions-Konstrukt zu implementieren. In der Hauptanwendung habe ich einen TActionsmanager hinzugefügt. Dort kann man recht einfach, über einen kleinen Dialog, Aktionen definieren. Diese Aktionen können dann mit einer Reihe von Standardkomponenten verknüpft werden. Zum Beispiel können ganz leicht Menüs oder Toolbars mit den Aktionen verbunden werden. Die Funktion, die ausgeführt werden soll, wenn die Aktion aufgerufen wird, packt man einfach in das OnExecute()-Event:
procedure TfrmMain.AcImgVollbildExecute(Sender: TObject); begin if g_AktQuery <> nil then begin if g_AktQuery.DataList <> nil then begin if g_AktQuery.DataList.Count > 0 then begin frmVollBild.Show; end; end; end; end;
Der Vorteil des ganzen ist nun, wenn man eine Funktion deaktieren will, weil sie gerade nicht sinnvoll ausgeführt werden kann, so braucht man diese nur auf inaktiv zu schalten. Alle Dialogelemente, die mit der Aktion verknüpft wurden, sind dann ebenfalls deaktiviert. Weitere Vorteile sind, das auch Hints, Bilder und Beschriftungen nur einmal zentral bei den Aktionen definiert werden müssen. Nachteil ist für mich jetzt nur, das ich die gute alte TImgViewToolbar auf TActions umstellen musste, was natürlich Arbeit bedeutete.
Diese habe ich gestern abend aber doch recht schnell erledigen können. Aus den alten Events der Komponente sind nun Eigenschaften vom Typ TAction geworden. Intern, in der Komponente, werden die Aktionen nur noch den einzelnen Knöpfen zugeordnet. Und das schöne ist, die Komponente kann sich weiterhin darum kümmern, das die Buttons aktiviert bzw. deaktiviert werden. Sie bekommt aber gar nicht mit, das dabei das Hauptmenü gleich mit aktiviert bzw. deaktiviert wird.