ok, nochmal zum mitschreiben.
Folgende Gedankenkette:
1. Wir sorgen dafür, dass die Properties immer gültige Kombinationen haben.
2. Wenn 1. zutrifft, dann werden auch nur gültige Kombinationen gestreamt.
3. Wenn 2. zutrifft, dann werden nur gültige Werte gelesen.
4. Wenn 3. zutrifft, dann kann man sich die Überprüfung bei 3. sparen.
5. Wenn 4. erfüllt ist, dann kann man in 1. die Überprüfung begrenzen, dass diese immer nur dann ausgeführt wird, wenn nicht 3. aktuell ist.
Ergo: Wenn csLoading in ComponentState gesetzt ist, dann keine Gültigkeitsprüfungen. Dadurch kommen immer gültige Kombinationen in die Properties bzw. in die
DFM. Damit kann man sich die Überprüfung der Eigenschaft beim Laden des Formulars sparen.
Delphi-Quellcode:
type
TDependancy =
class(TComponent)
private
fValueMin: integer;
fValueMax: integer;
procedure SetValueMin(
const AValue: integer);
procedure SetValueMax(
const AValue: integer);
public
constructor Create(AOwner: TComponent);
override;
published
property ValueMin: integer
read fValueMin
write SetValueMin
default 0;
property ValueMax: integer
read fValueMax
write SetValueMax
default 10;
end;
...
constructor TDependancy.Create(AOwner: TComponent);
begin
inherited;
fValueMax := 10;
end;
procedure TDependancy.SetValueMin(
const AValue: integer);
begin
if fValueMin <> AValue
then
begin
if ( AValue >= fValueMax )
and not ( csLoading
in ComponentState )
then
raise Exception.CreateFmt('
minimum value has to be below the maximum value (%d)!', [fValueMax]);
fValueMin := AValue;
end;
end;
procedure TDependany.SetValueMax(
const AValue: integer);
begin
if fValueMax <> AValue
then
begin
if ( AValue <= fValueMin )
and not ( csLoading
in ComponentState )
then
raise Exception.CreateFmt('
maximum value has to be above the minimum value (%d)!', [fValueMin]);
fValueMax := AValue;
end;
end;
Da die Werte zur Designzeit überprüft werden, brauchen sie nicht mehr beim Laden überprüft werden.
Wenn du eine Aktion machst, welche mit/bei dem Laden ausgeführt werden muss und gültige Werte in beiden Properties voraussetzt, dann füge diese in die überschriebene Loaded; Methode ein. Wenn es nur um die Überprüfung der Abhängigkeiten geht, dann wie im Beispiel gezeigt.
/EDIT: Dein Problem mit den Memos: Properties mit Instanzen werden aus der
DFM gestreamt, aber deren Instanzen werden erst
nach dem Streamen aller Elemente aktualisiert von der
VCL. Somit kannst du definitiv nichts machen, wenn die AutoRunShell Property mit true aus dem Formular geladen wird. Dein Problem ist genau das von mir zuletzt beschriebene: Starte den Thread etc. in der überschriebenen Loaded Methode. Dort hast du die zugewiesene Memo Instanz samt Inhalt und dort kannst du auch schauen, ob AutoRunShell gesetzt ist.