Delphi - Osztály típusú property létrehozása komponenshez

forráskód letöltése
Mellékelt példában bemutatjuk, hogy miként készíthetünk olyan Delphi komponenst, melynek egy property nem egy egyszerű adattípus, mint például a sztring vagy integer, hanem egy összetett TObject, vagy ennek valamelyik leszármazott osztályából származtatott saját típus. A mellékelt példaprogram megnyitása előtt a SampleComponent.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A létrehozott komponens gyakorlatilag nem használható semmire. Nincs is semmilyen funkciója, csupán annyi, hogy szemléltesse a feladat megoldását.

Létrehozunk tehát egy komponenst a TComponent osztályból származtatva. Ehhez két property-t deklarálunk.
…
    property DateStr: string read FDateStr write SetDateStr;
    property First: TFirstClass read FFirst write SetFirst;
…
Az egyik a DateStr egy egyszerű, sztring típus lesz, míg a First property egy TFirstClass típusú, amely már egy osztály. Mivel itt csak deklaráljuk az osztály típusú változót, így azt létrehozást előtt csak hibaüzenet kíséretében sikerülne használnunk. Ezt kerülendő célszerű már rögtön a komponens konstruktorában létre is hozni az osztály típusú változót.
constructor TSampleComponent.Create
    (AOwner: TComponent);
begin
  inherited;
  FFirst:=TFirstClass.Create(Self);
end;
Amit létrehozunk egyszer, azt nem árt idővel meg is szüntetnünk. Erre legalkalmasabb pillanat az, amikor maga a komponens is megszűnik, vagyis az objektum destruktora.
destructor TSampleComponent.Destroy;
begin
  FFirst.Free;
  inherited;
end;
A két létrehozott property-nél az értékadás mind két esetben egy-egy eljáráson keresztül történik.
Megfigyelhetjük, hogy amíg egy egyszerű adat típusnál elegendő a := jel használata értékadáshoz, addig osztály típus esetén az Assign eljárást kell használnunk értékadáshoz a helyes működés érdekében.
procedure TSampleComponent.SetDateStr
    (const Value: string);
begin
  FDateStr := Value;
end;

procedure TSampleComponent.SetFirst
    (const Value: TFirstClass);
begin
  FFirst.Assign(Value);
end;
Nem esett még szó a TFirstClass típusról. Mivel a Delphi-ben nem található ilyen nevű osztály, így nekünk kell létrehozni azt.
  TFirstClass=class(TPersistent)
  private
    FParent: TComponent;
    FColor: TColor;
    FSecond: TSecondClass;
    procedure SetColor(const Value: TColor);
    procedure SetSecond(const Value: TSecondClass);

  public
    constructor Create(parent: TComponent);
    destructor Destroy; override;

    procedure Reset;

  published
    property Color: TColor read FColor write SetColor;
    property Second: TSecondClass read FSecond 
        write SetSecond;

  end;
A TFirstClass osztályba két property-t veszünk fel. Egyik Color néven egy egyszerű TColor típussal, valamint egy Second néven TSecondClass típussal, amely szintén egy osztály típus.
Itt látható, hogy egy osztály típusú property-nek lehetnek újabb osztály típusú property-ei. Vagyis ez a folyamat akár a végtelenségig is egymásba ágyazható.

Hasonlóan az első osztályhoz itt is a konstruktornál és destruktornál kell létrehoznunk, illetve megszüntetnünk a Second property-hez tartozó változót.