Jupp, den ComponentState im Setter auf csLoading oder csReading prüfen,
in diesem Fall die Aktion nicht ausführen (nur den Wert speichern)
und die gewünschte Aktion dann später im Loaded nachholen.
Aber wie schon gesagt, hier muß dann das Datenmodul entweder vor dem Laden vorhanden sein, oder es müsste während des Ladens erstellt werden.
Wir haben hier auch ein paar nette Effekte mit einem Datenmodul, was einmal über ein Designtime-
Package als instanz in der
IDE vorhanden ist. (die
VCL/
IDE speichert eine globale Liste mit allen Forms und Datenmodulen und kann darüber das Gegenüber finden)
Spaßig wird es, wenn man dann zusätzlich noch die
Unit mit diesem Datenmodul öffnet, also dann das Modul doppelt vorhanden ist.
Allersdings kann man sich auch über
RegisterFindGlobalComponentProc registrieren und die Übersetzung Name-zu-Instanz selber vorgeben.
Delphi-Quellcode:
class function TIDEHelperModul.FindGlobalModules(const Name: string): TComponent;
begin
Result := nil;
if SameText(Name, 'DM1') then Result := UDM1.DM1;
if SameText(Name, 'SysDB') then Result := UDataModul_SysDB.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 pgQueries
if Assigned(Result) and ((csReading in Result.ComponentState) or (csDestroying in Result.ComponentState)) then
Result := nil;
end;
[edit]
OK, dann csDesigning ... ist für die Instanz, welche gerade in der Delphi-
IDE bearbeitet wird.
Kann also im Getter oder Setter benutzt werden, für das was man z.B. im Objektinspektor eingibt oder angezeigt bekommt.