TClassProperty, czyli DesignTime edytory

bidok

W tym arcie postaram sie przyblizyc jak korzystac z design-time edytorow (tzn edytorow ktore pomagaja nam w czasie pracy w delphi :)
Postanowilem pokazac prosty sposob ktory umozliwi nam dodanie AboutBoxa do naszego komponentu.

Poczatek:

  1. Pierwsze co nalezalo by zrobic to stworzyc komponent w ktorym aboutbox ma byc (logiczne co?)
  2. Po drugie stworzyc forme ktora bedzie sie pojawiac czyli aboutbox
  3. Stworzyc pusta klase ktora bedzie przyciskiem about w object inspektorze
  4. Stworzyc klase ktora bedzie odpowiedzialna za tworzenie i wyswietlenie formy
  5. Cieszyc sie AboutBoxem :)

Przejscie do czynu!
Punkt 1 i 2 zostawiam do waszej dyspozycji. Ja do celow instruktarzowych stworze komponent nie robiacy nic :)

Ad 3:
Mowiac pusta klasa mialem na mysli klase ktora nie pochodzi od innej i nie zawiera zadnych wlasciwosci. Moze lepiej jak podam przyklad:

TInfo = class
end;

Ad 4:
Teraz najwazniejsze tuz przed rejestracja wydarzenie nie bede duzo opisywal, lepiej jak na poczatek dam przyklad:

TInfoProperty = class(TClassProperty)
public
  procedure Edit; override;
  function GetAtrubutes: TPropertyAtributes; override;
end;

Prosta deklaracja klasy. Ja juz dodalem nadpisanie procedury Edit ktora jast wywolywana przez Object Inspectora kiedy edytujemy wartosc (kto by pomyslal:) oraz funkcji GetAtributes dzieki czemu bedziemy mogli zmienic rodzaj edycji(ustawimy sobie "..." obok wartosci :)

Przejdzmy teraz do tego co jest w procedurach:

procedure TInfoProperty.Edit;
var
  AForm: TInfoForm;
begin
  inherited;
  try 
    AForm := TInfoForm.Create(nil);
    AForm.ShowModal;
  finally
    AForm.Free;
  end;
end;

Kazdy zapewne widzial juz cos takiego poprostu tworzymy forme (ja nazwalem ja InfoForm) wyswietlamy, czekamy do jaj zamkniecia i ja uwalniamy - proste :P

function GetAtributes: TPropertyAtributes;
begin
  Result := [paDialog, paReadOnly];
end;

Dzieki tej zmianie obok wartosci bedziemy miec [...] oraz user nie bedzie mogl zmienic tej wartosci - ladniej to wyglada :P

Teraz aby wszystko dzialalo mysimy przyklady polaczyc w jedna calos z pierwszym komponentem (patrz punkt 1) U mnie wyglada to nastepujaco:

TNic = class(TComponent)
private
  FVersionInfo: TInfo;
protected

public

published
  property VersionInfo: TInfo read FVersionInfo;
end;

I najwazniejsze! musisz dodac do procedure register!

RegisterPropertyEditor(TypeInfo(TInfo), TNic, '', TInfoProperty);

procedura ta rejestruje edytor TInfoProperty dla komponentu TNic dla kazdej wlasciwosci typu TInfo. A skladnia tej procedury wyglada tak:
RegisterPropertyEditor(TypeInfo(typ_wlasciwosci), klasa_komponentu, nazwa_wlasciwosci, edytor)

klasa_komponentu moze przyjac wartosc nil wtedy edytor bedzie w kazdym komponencie.
nazwa_wartosci jesli bedzie pustym stringiem to edytor bedzie przy kazdej wartosci okreslonego typu inaczej trzeba podac nazwe wlasciwosci np 'VarsionInfo'

A teraz caly kod:

unit Nic;

interface

uses
  SysUtils, Classes, Controls, {te trzeba dodac ->} DesignIntf, DesignEditors, InfoFormUnit {<- te trzeba dodac};

type
  TInfo = class
  end;

  TInfoProperty = class(TClassProperty)
  public
    procedure Edit; override;
    function GetAtributes: TPropertyAtributes;
  end;

  TNic = class(TComponent)
  private
    FVersionInfo: TInfo;
  protected

  public

  published
    property VersionInfo: TInfo read FVersionInfo;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Bidok', [TNic]);
  RegisterPropertyEditor(TypeInfo(TInfo), TNic, '', TInfoProperty);
end;

procedure TInfoProperty.Edit;
var
  AForm: TInfoForm;
begin
  inherited;
  try 
    AForm := TInfoForm.Create(nil);
    AForm.ShowModal;
  finally
    AForm.Free;
  end;
end;

function GetAtributes: TPropertyAtributes;
begin
  Result := [paDialog, paReadOnly];
end;

end.

Nie zapomnijce dodac DesignIntf i DesignEditors do listy uses oraz unitu z forma. Fin

Ad 5
A teraz instalujemy i sprawdzamy. Jak dobrze pojdzie to sie cieszymy :)

Final
Jesli chcecie sie dowiedziec jak napisac EDYTOR do komponentu to demosach delphi jest cos takiego jak PropEdit taki przykladzik lub piszcie do mnie michu-bidok@o2.pl

Fin

2 komentarzy

Gościu narobił byków i publikuje artykuł. Powinno być tak:

unit Nic;

interface

uses
SysUtils, Classes, Controls, {te trzeba dodac ->} DesignIntf, InfoFormUnit {<- te trzeba dodac};

type
TInfo = class
end;

TInfoProperty = class(TClassProperty)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
end;

TNic = class(TComponent)
private
FVersionInfo: TInfo;
protected

public

published
property VersionInfo: TInfo read FVersionInfo;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Bidok', [TNic]);
RegisterPropertyEditor(TypeInfo(TInfo), TNic, '', TInfoProperty);
end;

procedure TInfoProperty.Edit;
var
AForm: TInfoForm;
begin
inherited;
try
AForm := TInfoForm.Create(nil);
AForm.ShowModal;
finally
AForm.Free;
end;
end;

function TInfoProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes + [paDialog, paReadOnly];
end;

end.

P.S. Znajdź różnice ;)

co? już koniec?