Es gibt noch eine Unwägbarkeit bei dem Ganzen: Ob das funktioniert, ist von der Erstellungsreihenfolge abhängig! Der Ablauf, den ich in meinem letzten Beitrag beschrieben habe, läuft nur dann so ab, wenn das DBEdit
vor dem Datenmodul erstellt wird. Ansonsten sieht der Ablauf folgendermaßen aus:
Zuerst wird das Datenmodul erzeugt. Zu dieser Zeit bestehen keine nicht aufgelösten Abhängigkeiten. Nach der Erzeugung des Datenmoduls hat Screen.DataModules genau einen Eintrag: Ein Datenmodul mit Name "MyDM". Ein Datenmodul mit Name "MyCustomDM" hat nur während der Instanzierung von TMyDM kurzzeitig existiert. Wenn jetzt
danach DBEdit instanziert wird, dann kann die Abhängigkeit "MyCustomDM.DS" nicht aufgelöst werden, da weder ein Formular noch ein Datenmodul mit Namen "MyCustomDM" existiert.
Man kann das im Beispielprojekt leicht testen, wenn man den Konstruktor von TMyForm folgendermaßen umbaut (Das Datenmodul vor dem inherited-Aufruf instanziert):
Delphi-Quellcode:
constructor TMyForm.Create(AOwner: TComponent);
begin
SetDM(TMyDM.Create(Self)); //wenn Owner freigegeben wird, wird DM automatisch mit freigegeben
inherited;
end;
In dem Fall kann die Abhängigkeit nicht mehr aufgelöst werden und beim Klick auf DBEdit kommt die Meldung "nil".
Ein weiterer Fallstrick:
Instanziert man anschließend (z.B. per Buttonclick) eine weitere Instanz von TMyDM, dann wird die Abhängigkeit von DBEdit auf diese Instanz aufgelöst.
Ergo:
Abhängigkeiten zu Formularen/Datenmodulen , die niemals selbst instanziert werden (nur davon abgeleitete Klassen werden instanziert) sind mit Vorsicht zu genießen, da sie immer auf das erste passende Formular/Datenmodul aufgelöst werden, das
nach dem Control instanziert wird. Somit ist die
Erstellungsreihenfolge von entscheidender Bedeutung.
Mein Vorschlag, um diese Probleme zu umgehen:
In den Fällen, in denen Abhängigkeiten zu Datenmodulen notwendig sind, die nicht direkt instanziert werden (sondern nur deren Nachkommen), sowie bei Datenmodulen, die mehrfach instanziert werden (wobei mir dazu grad kein Anwendungsfall einfällt), sollte folgendermaßen vorgegangen werden: Auf der Form mit den
DB-Controls liegt ein (oder mehrere) entsprechendes Datasource, welches bei der Instanzierung der Form mit der
Query aus dem DM verbunden wird (Das DM muss also zwingend vorher instanziert worden sein). Somit gibt es keine zur Designtime definierten Abhängigkeiten mehr, deren Auflösung die Probleme verursacht.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."