[Delphi] dodać właściwość do istniejącego

0

Jak do istniejącego komponentu dodać nowy Property?
Jak poprawić lub przerobic np. ItemEditor?

0

Oczywiscie że można dodać nowy property a nawet zmienić już istniejący!!

Chyba przede wszystkim chodzi ci o PropertyEditor lub ComponentEditor.

Owszem można je przerobić a nawet stworzyć własny!

Aby stworzyc nowy property:

1)pomyśl jakiego typu property to ma być np zmienna albo typ proceduralny (wtedy powstanie event), ew. nawet inny obiekt ale wtedy aby property właściwie działał trzeba najpierw go utworzyć
2) Wymyśl nazwę dla pola i property zwykle nazwa property to nazwa pola bez literki f (f od field - pole)
3) zastanów się czy ma to być property typu indeksowanego (np array, który jest możliwy tylko poza published)
4) pomyśl czy dostęp ma być realizowany bezpośrednio do np pola czy też poprzez procedury i funkcje. W przypadku procedur i funkcji można nawet zrobić coś takiego, że wartosc jest nigdzie nie przechowywana, a tworzona dynamicznie.
5)Zdeklaruj ew. pole(a) w klasie
6) napisz ew. procedury i funkcje dla property.
7)zastanów się czy property ma być przechowywany w pliku formatki (wartosc), czy ma miec wartosc domyslną itp (jest jeszcze pare parametrow, ale zwykle się z nich nie korzysta jak np implements)

interface

Type
TMojEvent = procedure (Sender: TObject) of object; //to jest de facto typ TNotifyEvent
TMojaKlasaPrzykladowa = Class (TCustomPanel) //w nawiasach klasa od ktorej dziedziczysz. Aby property byly mozliwe musi to byc co najmniej tpersistent a aby mozna bylo komponenty dodawac (bez rysowania ich) TComponent, a z rysowaniem TWinControl
private
fBezposredniDostep: Integer;
fDostepPrzezMetode: Boolean;
fObiekt: TLabel;
fTablica: Array [0..255] of word;
fMojEvent: TMojEvent;
procedure SetDostepPrzezMetode (Value: Boolean);
procedure SetElementTablicy (Index: Byte; Value: Word);
procedure SetWirtualnaZmienna (Value: String);
function GetDostepPrzezMetode: boolean;
function GetElementTablicy (Index: Byte): Word;
function GetWirtualnaZmienna: String;
public
property Pierwszy: Word index 1 read GetElementTablicy write SetElementTablicy; //to jest nieco inny sposób dostępu do tablicy w podobny sposób można zrobić dostęp do recordów
property Drugi: Word index 2 read GetElementTablicy write SetElementTablicy;
property Trzeci: Word index 3 read GetElementTablicy write SetElementTablicy;
property Ostatni: Word index 255 read GetElementTablicy write SetElementTablicy;
property MojaTablica [Index: Byte]: Word read GetElementTablicy write SetElementTablicy; //a to jest bardziej typowy dostęp do tablicy
constructor Create; override;
published
property BezposredniDostep: Integer read fBezposredniDostep write fBezposredniDostep stored True default 100; //bezpośrednio do zmiennej tutaj zastosowalem także domyślną wartość, zwykle wtedy stosuje się także przechowywane tak samo jak tu
property DostepPrzezMetode: Boolean read GetDostepPrzezMetode write SetDostepPrzezMetode;
property Obiekt: TLabel read fObiekt; //nie ma przymusu aby i read i write istniały jednocześnie, ale albo jeden albo drugi musi być| property z obiektu są zwykle rozwijalne
property OnMojEvent: TMojEvent read fMojEvent write fMojEvent; //to jest event ktory pojawi się w object inspektorze aby wywolać taki event najpierw sprawdź czy zostala mu przypisana metoda np za pomocą assigned i dopiero wywoluj tak samo jak kazdą inną procedurę
property WirtualnaZmienna: String read GetWirtualnaZmienna write SetWirtualnaZmienna; //aby odczytać i zapisać zmienną są wykorzystane procedura i funkcja, które nie zapisują do żadnej zmiennej wartości i nie pobieraja jej
property Height stored False defalut 40; //tak zdeklarowany na nowo property zmienia jedynie wartosc domyslna i stan przechowywania ale nie zmienia read write i pozostalych jego własciwosci
end;

implementation

constructor TMojaKlasaPrzykladowa.Create;
begin
inherited;
fObiekt := TLabel.Create(Self);
fObiekt.Parent:=self;
fObiekt.SetSubComponent; //sprawia że propertisy tego komponentu będą zapisywane wraz z propertisami jego właściciela;

Height := 40; //wartości default trzeba przypisać aby zadziałało;
fBezposredniDostep := 100; //wartości default musza byc identyczne z tymi, które się przypisuje w create bo inaczej nie zadziała odpowiedni mechanizm
end;

function TMojaKlasaPrzykladowa.GetDostepPrzezMetode: boolean;
begin
result := fDostepPrzezMetode; //można także dopisać przeróżne inne rzeczy do wykonania tak samo jak w pozostałych
end;

function TMojaKlasaPrzykladowa.GetElementTablicy(Index: Byte): Word;
begin
result := fTablica[Index];
end;

function TMojaKlasaPrzykladowa.GetWirtualnaZmienna: String;
begin
result := inttostr(random(100));
end;

procedure TMojaKlasaPrzykladowa.SetDostepPrzezMetode(Value: Boolean);
begin
fDostepPrzezMetode := Value;
end;

procedure TMojaKlasaPrzykladowa.SetElementTablicy(Index: Byte; Value: Word);
begin
fTablica[Index] := Value;
end;

procedure TMojaKlasaPrzykladowa.SetWirtualnaZmienna(Value: String);
begin
//tutaj nic nie wpisuje bo nie ma sensu aczkolwiek mozna np zaleznie od np tekstu wykonać różne rzeczy
end;

Teoretycznie to jest w pełni funkcjonalny przykład. W razie błędów daj znać (gdybys go kompilował to go zmodyfikuje)

więcej info możesz uzyskać kiedy naciśniesz f1 mając kursor na słowie property

1 użytkowników online, w tym zalogowanych: 0, gości: 1