Einzelnen Beitrag anzeigen

Roachford
(Gast)

n/a Beiträge
 
#7

Re: Reihenfolge beim Laden von Properties verändern

  Alt 24. Okt 2008, 18:21
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.
  Mit Zitat antworten Zitat