Jak korzystać z TPersistent

bidok

Pewnie nie raz pisząc komponent do Delphi chwytaliście się za głowę widząc (a raczej nie widząc) właściwości pogubione między innymi standartowymi. O ile nie sprawiało to problemu przy odwoływaniu sie do TComponent lub klas TCustom[..] to przy innych zdawało sie być problemem...

Teraz to już nie problem! Piszac komponent skorzystajmy z klasy TPersistent!

Info!!! Tekst jest zwrócony dla osób raczej początkujących

Krótka informacja o klasie: Widzieliście kiedyś w Object Inspector'ze takie + przy właściwościach? Po kliknięciu których rozwija się wiecej opcji? Taki efekt można własnie uzyskać dzieki TPersistent;

Przejdę do przykładu:

type
  TOpcje = class(TPersistent)
  private
    FProp1: Integer;
    FProp2: string;
    FProp3: Boolean;
  published
    property Prop1: Integer read FProp1 write FProp1;
    property Prop2: string read FProp2 write FProp2;
    property Prop3: Boolean read FProp3 write FProp3;
  end;

Nie musze tego chyba tłumaczyć? Zwykła deklaracja klasy.

Teraz w głownym komponencie wystarczy w sekcji published dodać:

property Opcje: TOpcje read FOpcje write FOpcje;

A w private:

FOpcje: TOpcje

Na koniec najwazniejsze: w OnCreate glownego komponentu nalezy dodac:

FOpcje := TOpcje.Create

Takie dzieło już bedzie ładniej wygladać Object Inspector'ze, programićci dostaną lepiej poukładane właściwości w nowych komponentach.

A teraz przykładowy kodzik:

unit Przyklad;

interface

uses
  SysUtils, Classes, Controls;

type
  TOpcje = class(TPersistent)
  private
    FProp1: Integer;
    FProp2: string;
    FProp3: Boolean;
  published
    property Prop1: Integer read FProp1 write FProp1;
    property Prop2: string read FProp2 write FProp2;
    property Prop3: Boolean read FProp3 write FProp3;
  end;

  TPrzyklad = class(TComponent)
  private
    FOpcje: TOpcje;
  protected

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Opcje: TOpcje read FOpcje write FOpcje;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Przyklad', [TPrzyklad]);
end;

procedure TPrzyklad.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  // tworzymy obiekt
  FOpcje := TOpcje.Create;

  // ustawiamy wlasciwosci
  FOpcje.Prop1 := 123
  FOpcje.Prop2 := 'test';
  FOpcje.Prop3 := True;
end;

procedure TPrzyklad.Destroy;
begin
  // niszczymy już nie potrzebny obiekt tuż przed zniszczeniem komponentu rodzica
  FOpcje.Free;
  inherited Destroy;
end;

5 komentarzy

Od siebie dodam tylko, że ten "pseudo art" został jakimś dziwnym trafem odświeżony po ponad dwóch latach (jeśli wierzyć temu co podaje historia.. imo minęło o wiele więcej czasu od jego pierwszej publikacji..)
Choć patrząc nie bardzo poznaje swoje pismo to postaram się poprawić.

W konstruktorze tworzysz obiekt, ale gdzie go zwalniasz??????

Prosze poprawic ten tekst (polskie znaki, dostosowac sie do wskazowek opisanych w "Zasady redagowania tekstow" w Pomocy) albo ten artykul zostanie skazowany jako niska wartosc merytoryczna.

poza tym co wymienił Morris, to nie mam żadnych zastrzeżeń ,
dobry art, rzeczywiście brakowało tego opisu

Komentarze? Właściwie to mam dwa:

  1. Używaj polskich liter
  2. Pisz bardziej formalnym językiem - wyrażenia typu "pozdro", "kodzik", "bluzgać" oraz emotikony wydają się być nie na miejscu