Programowanie w języku Delphi » Artykuły

TClassProperty, czyli DesignTime edytory

  • 2006-06-20 15:53
  • 2 komentarze
  • 462 odsłony
  • Oceń ten tekst jako pierwszy
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 [email protected]</email>

Fin

2 komentarze

marogo 2013-03-15 09:31

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 ;)

wotek 2005-03-17 19:28

co? już koniec?