In der UnterForm wird ein Event ausgelöst welches in der HauptForm eine Procedure aufruft.
In der Procedure werden die benötigten Daten dann in eine Property der UnterForm geschrieben.
Die UnterForm holt sich dann die Daten dort ab und verarbeitet sie weiter.
Das funktioniert so, ist aber nicht gerade elegant. Gibt es evt. eine „schöne“ Lösung ?
Mir fällt auf Anhieb nichts ein, was dagegen sprechen würde, das so zu machen. Mir ist aber auch nicht klar, was genau du unter einer "schönen Lösung" verstehst. "Schön" ist für mich im Zusammenhang mit Anwendungsentwicklung, wenn's erstens funktioniert und zweitens übersichtlich programmiert wurde, so daß ich auch noch nach Jahren nahezu auf Anhieb erkennen kann, was ich da zusammengewurschtelt habe
Wenn ich z.B. mit Frames arbeite (statt z.B. mit TPageControl und Tabsheets), werden die Frames alle von der Mainform gesteuert. Das hat den Vorteil, daß ich z.B. Datenbank-Operationen quasi nur einmal programmieren muß und sie auf alle Frames, die Tabellen darstellen und bearbeiten lassen, anwenden kann. Die Frames stellen dabei eigentlich nur die Schnittstelle für den Anwender dar: Bedienung (Editfelder, DBGrids etc.) und Darstellung. Die eigentliche Funktionalität (Append, Delete, Edit, Post, Cancel etc.) erledigt eine eigene Klasse, die je nach dem, welches Frame gerade angezeigt wird, das entsprechende Dataset bzw.
Query aus dem Datenmodul verwendet. Aber das würde jetzt zu weit führen.
Benötigen die Frames in seltenen Fällen doch einmal Reaktionen von der MainForm, mache ich das ganz genau so, wie du es oben dargestellt hast: Ich löse ein Ereignis aus. Die allermeisten Ereignisse werden bei mir aber vom Datenmodul ausgelöst und von der MainForm verarbeitet. Also ich finde diesen Aufbau gelungen und in gewisser Weise auch "schön", weil für mich übersichtlich und leicht zu erweitern/ändern.
wie wäre es mit einem Datenmodul auf das Beide Formulare zugreifen?
... oder irgend einer "klassenlosen"
Unit, die beide Formulare in ihre Uses-Klausel aufnehmen (Implementation-Abschnitt)? Geht natürlich auch mit dem Datenmodul, das aber mehr Ressourcen benötigt. Ich verwende Datenmodule ausschließlich für Datenbank-Sachen. Eine einfache
Unit, wo man die benötigten globalen Variablen und Konstanten einfach im Interface-Abschnitt deklariert, tut's auch. Dort kann man dann auch prima häufig benötigte Hilfs-Funktionen und -Prozeduren unterbringen wie z.B. den Aufruf einer
URL via Default-Browser oder das Ausführen einer externen Anwendung oder oder ... Bei mir werden dort z.B. auch Benutzerdaten und -einstellungen zwischengespeichert, die beim Programmstart aus der Datenbank (oder Registry oder Ini-Datei) gelesen und beim Programmende wieder zurückgeschrieben werden. Aus meiner Sicht hat sich diese Vorgehensweise bewährt.