Ich habe doch noch ein bischen probiert:
In der Methode Paint teste ich jetzt, ob meiner
DB-Komponmente noch keine DataSource zugewiesen wurde und das DataModule bereits existiert. In dem Fall weise ich der
DB-Komponente die passende DataSource zu...
Delphi-Quellcode:
constructor DBKompo.Create;
begin
inherited;
FieldName:='Name';
...
end;
procedure Paint;
begin
if ((DataSource=nil) and (MyDataModule<>nil)) then begin
DataSource:=MyDataModule.MyDataSource;
end;
inherited;
end;
Sobald die Komponente gezeichnet wird und das DataModle (inzwischen) existiert, wird also die
DB-Verbindung eingerichtet.
Zur Laufzeit funktioniert das wunderbar. Ich brauche einfach nur die
DB-Komponenten erzeugen, einige Einstellungen vornehmen und um die
DB-Verbindung kümmern sie sich dann "ganz selbständig".
Während der Entwicklungszeit ist jedoch das MyDataModule nicht instanziert. Ich habe versucht, über GetParentForm oder GetRealParentForm und FindComponent('MyDataModule') weiterzukommen, was jedoch nicht funktioniert hat...
Es wäre einfach sehr schön, wenn ich schon zur Entwurfszeit durch das Einsetzen einer
DB-Komponente in das Formular alles komplett hätte. Ich möchte die Komponenten möglichst so aufbauen, dass weder der Nutzer noch der Entwickler merken (obwohl ich es als Entwickler ja eigentlich weiß
), dass da irgendeine Datenbank dahinter steckt.
Weiß jemand, wie ich zur Entwurfzeit an die MyDataModule-Instanz aus der
IDE herankomme?
Wie geht denn Delphi mit dem Erzeugen der Formulare und DataModule um? Es muss ja sicher verhindert werden, dass
DB-Komponenten erzeugt werden bevor die DataModule erzeugt werden, da sonst keine Verbindung mehr hergestellt werden kann. Oder Delphi merkt sich in einer Liste alle Komponenten, deren
DB-Verbindung wegen eines fehlenden DataModuls gescheitert ist und versucht, die Verbindung später nachzuholen.
So etwas könnte ich mir auch ganz gut als Lösung für "feste
DB-Verbingen" vorstellen:
- in der Methode Loaded die Existenz des entsprechenden DataModuls testen und dieses dann zuordnen
- wenn dies scheitert, die Komponente in eine TList aufnehmen und einen Timer starten
- solange der Timer läuft, versuchen, die Verbingungen nachzuholen
- bei Erfolg den Eintrag aus der Liste löschen
- wenn die Liste leer ist, Timer beenden
Man müsste eben nur auch zur Entwicklungszeit die MyDataModule-Instanz finden...
Stahli
PS: Feste
DB-Verbindungen sollten gar kein Problem darstellen, wenn die Data-Sourcen direkt im Formular plaziert werden. Aber das ist ja keine wirkliche Alternative.