Man kann Datenmodule auch referenzieren (wenn das Datenmodul in einem Design-
Package geladen wird).
Wenn es in der
IDE keine Instanz des DatenModuls gibt, z.B. weil diese
Unit grade geöffnet ist,
dann erstellt Delphi intern selbst Eine, aber dafür muß es irgendwie die
Unit dieses Moduls finden/identifizieren können. (z.B. wenn diese
Unit im aktiven Projekt eingebunden ist und die Kennung/Kommentar mit dem Namen existiert)
RegisterFindGlobalComponentProc kann auch verwendet werden, falls es beim
DFM-Laden in eigenen Programmen mal knallt.
"Eigentlich" registrieren sich TDataModule-Instanzen selbst, beim AddDataModule, aber manchmal will es doch nicht richtig funktionieren.
Delphi-Quellcode:
// beim Laden des Packages ( procedure Register; )
RegisterFindGlobalComponentProc(FindGlobalModules);
// und beim Entladen des Packages ( finalization )
UnregisterFindGlobalComponentProc(FindGlobalModules);
// globale/einzelne Function oder statische Class-Function.
class function TIDEHelperModul.FindGlobalModules(const Name: string): TComponent; static;
begin
Result := nil;
if SameText(Name, 'DM1') then Result := UDM1.DM1;
if SameText(Name, 'CimDM_SysDB') then Result := UDataModul_SysDB.CimDM_SysDB;
if SameText(Name, 'DMSys') then Result := USysModule.DMSys;
//
// nicht beim Laden / nur vollständig :
// TReader.ReadRootComponent>FindUniqueName findet sich sonst selber und ändert den Namen -> "DM1" zu "DM1_1" -> Referenzen werden dann nicht mehr gefunden oder falsch gespeichert
// Grund: siehe TDM1.Create -> globale Instanz vorher setzen, für deren Benutzung während des Ladens der enthaltenen TCimComponent und TCimQuery2
if Assigned(Result) and ((csReading in Result.ComponentState) or (csDestroying in Result.ComponentState)) then
Result := nil;
end;
Ein Therapeut entspricht 1024 Gigapeut.