Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: fest eingestellte DB-Komponenten?

  Alt 28. Aug 2007, 13:05
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.
  Mit Zitat antworten Zitat