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:
- Pierwsze co nalezalo by zrobic to stworzyc komponent w ktorym aboutbox ma byc (logiczne co?)
- Po drugie stworzyc forme ktora bedzie sie pojawiac czyli aboutbox
- Stworzyc pusta klase ktora bedzie przyciskiem about w object inspektorze
- Stworzyc klase ktora bedzie odpowiedzialna za tworzenie i wyswietlenie formy
- 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
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?