Hmm. Ich habe eine Action 'Kundeninfo als Popup anzeigen'. Die habe ich im Hauptmenü als stinknormalen Menüpunkt, aber auch als Button in diversen Formularen in der Adresspflege, Auftragsannahme, Dispo etc. Welches Basisformular wäre das?
Ich werde ja wohl kaum mein Hauptformular und meine Dispomaske von ein und demselben Formular ableiten und dort sämtliche Actionlisten, Imagelisten etc. platzieren, nur damit man die zentral verteilen kann. Igitt. Kann man in einer Desktopanwendung ruhig so machen, aber wenn die Projekte größer werden und oder sich auf verschieden Exen verteilen, wird das doch sehr häßlich.
Was spricht dagegen, diese Aktionen in einer eigenen Klasse zu verwalten? Wäre das nicht viel sauberer? Eine Action ist ja schließlich unsichtbar, hat also eigentlich nichts auf einem Formular zu suchen, denn im Formular sollten nur die sichtbare Komponenten liegen.
Also eine Actions-Klasse (TCustomerActions) wäre ziemlich fein. Diese Klasse verwaltet alle Aktionen, die ich mit einem Kunden so anstellen kann, sowie die Tooltips, Icons und sonstigen Schnickschnack. So, und wenn ich schon Komponenten hin und her schubse, dann packe ich sie mir eben in ein TDataModule, was eben mein visueller Container für meine CustomerActions ist. Vielleicht packe ich mir in die TCustomerDatamodule auch gleich meine Imagelist mit den Icons und meinen TsiLang-Übersetzer, der mir das alles multilingual macht. Klasse! Alles an einem Ort.
Das tolle ist ja, das so eine Action vielleicht auch etwas nichtvisuelles anstellt, z.B. die Kundendaten direkt auf den Drucker schicken. Dann kann ich das sogar vom Code an beliebiger Stelle machen, ohne in einer
Unit plötzlich ein 'uses MainForm' machen zu müssen. Das verstößt ja gegen jeden Ordnungssinn.
Ich finde 'TDatamodule' ist ein unglücklicher Name für einen Container, der für die unsichtbaren Komponenten zuständig ist (TContainer fände ich besser). Ich kann so einen Container als Datenbanklayer bzw. Teil davon ansehen (eben eine Art Datamodule), oder als Actioncontainer, oder als Sammelsurium sonstiger Dinge, die konzeptionell zusammen gehören, und für die es eine Komponente gibt.
Ich habe z.B. die gesammte
TCP/
IP-Kommunikationslogik mit einem
TCP-Server in einem Datenmodul drin. Was so ein Teil auf einem Formular zu suchen hat, frage ich mich bis heute. Cool. Das ist sogar komplett wiederverwendbar, was bei Plazierung auf meinem Formular nicht gegeben ist.
DevExpress bietet Templates für ihr Editoren an, damit steuert man das komplette Verhalten eines Eingabefeldes. Das packe ich mir in meinen TEditorTemplateContainer (was ein TDataModule ist), programmiere das durch und flansche es dort an, wo ich es benötige.
Die Zuweisung im
OI mag an mancher Stelle etwas mühselig sein, vor allen Dingen, wenn man das Formular lädt, ohne das vorher der Container geladen ist (dann verschwinden die Verknüpfungen blöderweise). Aber ich habe mir angewöhnt, diese Verknüpfungen im Code eh explizit zu setzen, meist im FormCreate.
Das nur mal so als Anregung.