Das leider garnicht.
Praktisch kannst du im Formdesigner immer nur mit
einer globalen Instanz (Signleton) deines DatenModuls arbeiten.
Du kannst aber im Create, vor dem Inherited eine Instanz deines Datenmoduls erzeugen. (es darf aber zur Laufzeit keine automatisch erzeugte Instanz dieses Moduls existieren, bzw. diese wird vorher umbenannt oder freigegeben)
DatenModule registrieren sich global im Delphi und der Form-Loader findet sie dann über ihren Namen, bzw. mann kann sich selber ein GetGlobalDataModule-Event registrieren.
Nach dem Laden (nach dem Create-Inherited oder spätestens im TForm.Loaded) dann das Datenmodul umbenennen (oder den Namen löschen >
''
), damit es mit späteren Instanzen deiner Form keine Überschneidungen gibt.
In der
IDE muß aber eine "globale" Instanz vorhanden sein.
Gegen diese kannst du dann Designen (in der
DFM wird der Name gespeichert) und beim Laden deiner Form im laufenden Programm wird dann jeweils die aktuelle/individuelle Instanz mit diesem Namen verwendet.
Statt vorher eine neue Datenmodul-Instanz zu erzeugen erstmal die globale Instanz verwenden und dann nach dem Laden der Form die "Globale" umbenennen, eine neue Instanz mit dem alten Namen erzeugen und der globalen Variable zuweisen (für ein eventuell nachfolgendes Laden weiterer Formen)
Tipp:
Wir haben bei uns ein paar DatenModule, die aber in verschiedenen Packages liegen und von der
IDE leider nicht immer gefunden werden, wenn man nicht zufällig die
Unit dieses DatenModules geöffnet hat, wenn gerade ein anderes
Package aktiv ist.
Delphi scheint da nicht immer alle Packages "geladen" zu haben und dann existiert keine Instanz dieses Datenmoduls, was dann beim Öffnen der Form im FormEditor gern mal knallt.
Es gibt zwar in den geladenen DesignPackages nochmal eine Instanz, aber diese wird nicht vom FormDesigner gefunden, bzw. diese manuell erstellten Module werden nicht gefunden-
Aus diesem Grund hab ich unsere Instanzen der DesignTime-Packages auch nochmal manuell in der
IDE "registriert".
Delphi-Quellcode:
RegisterFindGlobalComponentProc(FindGlobalModules); // im Class-Constructor des TIDEHelperModul
UnregisterFindGlobalComponentProc(FindGlobalModules);
class function TIDEHelperModul.FindGlobalModules(const Name: string): TComponent;
begin
Result := nil;
if SameText(Name, 'DM1') then Result := UDM1.DM1;
if SameText(Name, 'DMSys') then Result := USysModule.DMSys;
end;
Alternativ eben nochmal der Vorschlag von nahpets.
Zitat:
Delphi-Quellcode:
procedure TfmMeinDataModulForm.SetDataSource(ADataModule : TDataModule);
begin
fDataModule := ADataModule;
if Assigned(fDataModule) then begin
... // eventuell erforderliche weitere Zuweisungen, Plausibilitätsprüfungen ...,
// in Bezug auf das DataModule.
// Z. B.: Sind dort die erforderlichen DataSets ... vorhanden ...
end;
end;
Siehe die Kommentare.
Im
OI nichts zuweisen, sondern das im Setter der Form an die Unterkomponenten durchreichen.