R-10-00.DOC

(608 KB) Pobierz
Szablon dla tlumaczy

Edytory komponentów i edytory właściwości

Otwartość biblioteki VCL, umożliwiająca wzbogacanie jej o komponenty spełniające różnorodne funkcje niezbędne użytkownikowi tworzącemu skomplikowane aplikacje nie wyczerpuje bynajmniej znamion elastyczności narzędzi typu RAD, do których zalicza się m.in. C++Builder. Udogodnienia tego środowiska wykraczają bowiem poza dostarczanie programistom gotowych komponentów, lecz w trosce o ich komfort pracy wkraczają także na etap projektowania aplikacji, czyniąc w jak największym stopniu przyjazną i intuicyjną obsługę tychże komponentów. Temu właśnie celowi służą opisywane w niniejszym rozdziale specjalizowane edytory właściwości oraz edytory komponentów jako całości, które użytkownik może tworzyć stosownie do własnych potrzeb, i to przy wysiłku niewiele większym od tego potrzebnego do tworzenia typowych aplikacji.

Treść niniejszego rozdziału ilustrowana będzie konkretnymi przykładami, których kod źródłowy znajduje się na załączonym CD–ROMie. Znajdują się ta między innymi cztery pakiety demonstracyjne w postaci gotowej do zainstalowania w środowisku IDE. Pierwszy z nich — EnhancedEditors.bpk — jest pakietem wyłącznie projektowym (designtime package) zawierającym implementację przykładowych edytorów właściwości i komponentów — ich wyszczególnienie zawiera tabela 10.1. Dwa kolejne pakiety — NewAdditionalComponentsDTP.bpk i NewAdditionalComponentsRTP.bpk — to pakiety implementujące nowe komponenty wykorzystywane z niniejszym rozdziale; pierwszy z wymienionych pakietów jest pakietem wyłącznie projektowym (designtime) drugi natomiast jest pakietem wykonywalnym (runtime).

W katalogu Chapter10Packages (którego nazwę Czytelnik prawdopodobnie zmieni na bardziej intuicyjną) znajduje się podkatalog System zawierający pliki systemowe niezbędne do prawidłowej pracy wymienionych pakietów; należy je skopiować do lokalizacji zawierającej pliki systemowe Windows — na przykład katalogu Windows\System w Windows 9x lub WINNT\System32 w Windows NT/2000.

Aby zainstalować pakiet projektowy należy załadować go do IDE i z menu głównego wybrać opcję Component|Install Packages. Następnie w sekcji Design packages należy kliknąć przycisk Add, zlokalizować skompilowany plik pakietu (np. EnhancedEditors.bpl) i kliknąć przycisk Otwórz. W wyniku tej operacji na liście komponentów projektowych (w sekcji Design packages) pojawi się nowa pozycja o nazwie „Enhanced Property and Component Editors”. Kliknięcie w przycisk OK spowoduje dokończenie instalacji.

 

Tabela 10.1 Edytory komponentów i właściwości zawarte w pakiecie EnhancedEditors

 

Edytor

Zarejestrowany?

TShapeTypePropertyEditor

Tak

TImageListPropertyEditor

Tak

TImageIndexProperty

Nie (abstrakcyjna klasa bazowa)

TPersistentDerivedImageIndexProperty

Tak

TComponentDerivedImageIndexProperty

Tak

TMenuItemImageIndexProperty

Tak

TTabSheetImageIndexProperty

Nie wymaga rejestracji

TToolButtonImageIndexProperty

Tak

TCoolBandImageIndexProperty

Nie wymaga rejestracji

TListColumnImageIndexProperty

Tak

TCustomActionImageIndexProperty

Nie wymaga rejestracji

THeaderSectionImageIndexProperty

Nie wymaga rejestracji

TDisplayCursorProperty

Tak

TDisplayFontNameProperty

Tak

TUnsignedProperty

Tak

TCharProprtyEditor

Tak

TSignedCharProperty

Tak

TUnsignedCharProperty

Tak

TImageComponentEditor

Tak

 

Tworzenie edytorów właściwości

Klasą bazową dla wszelkich edytorów właściwości jest TPropertyEditor. Dostarcza ona niezbędnych środków zapewniających oglądanie i modyfikowanie właściwości komponentów w środowisku IDE. Jej deklarację prezentujemy na wydruku 10.1; znajduje się ona także w pliku DsgnIntf.hpp w podkatalogu Include\VCL lokalnej instalacji C++Buildera.

 

Wydruk 10.1 Deklaracja klasy TPropertyEditor

 

class DELPHICLASS TPropertyEditor;

typedef void __fastcall (__closure *TGetPropEditProc)(TPropertyEditor* Prop);

 

class PASCALIMPLEMENTATION TPropertyEditor : public System::TObject

{

              typedef System::TObject inherited;

             

private:

              _di_IFormDesigner FDesigner;

              TInstProp *FPropList;

              int FPropCount;

              AnsiString __fastcall GetPrivateDirectory();

              void __fastcall SetPropEntry(int Index, Classes::TPersistent* AInstance, Typinfo::PPropInfo APropInfo

                            );

             

protected:

              __fastcall virtual TPropertyEditor(const _di_IFormDesigner ADesigner, int APropCount);

              Typinfo::PPropInfo __fastcall GetPropInfo(void);

              Extended __fastcall GetFloatValue(void);

              Extended __fastcall GetFloatValueAt(int Index);

              __int64 __fastcall GetInt64Value(void);

              __int64 __fastcall GetInt64ValueAt(int Index);

              Sysutils::TMethod __fastcall GetMethodValue();

              Sysutils::TMethod __fastcall GetMethodValueAt(int Index);

              int __fastcall GetOrdValue(void);

              int __fastcall GetOrdValueAt(int Index);

              AnsiString __fastcall GetStrValue();

              AnsiString __fastcall GetStrValueAt(int Index);

              Variant __fastcall GetVarValue();

              Variant __fastcall GetVarValueAt(int Index);

              void __fastcall Modified(void);

              void __fastcall SetFloatValue(Extended Value);

              void __fastcall SetMethodValue(const Sysutils::TMethod &Value);

              void __fastcall SetInt64Value(__int64 Value);

              void __fastcall SetOrdValue(int Value);

              void __fastcall SetStrValue(const AnsiString Value);

              void __fastcall SetVarValue(const Variant &Value);

             

public:

              __fastcall virtual ~TPropertyEditor(void);

              virtual void __fastcall Activate(void);

              virtual bool __fastcall AllEqual(void);

              virtual bool __fastcall AutoFill(void);

              virtual void __fastcall Edit(void);

              virtual TPropertyAttributes __fastcall GetAttributes(void);

              Classes::TPersistent* __fastcall GetComponent(int Index);

              virtual int __fastcall GetEditLimit(void);

              virtual AnsiString __fastcall GetName();

              virtual void __fastcall GetProperties(TGetPropEditProc Proc);

              Typinfo::PTypeInfo __fastcall GetPropType(void);

              virtual AnsiString __fastcall GetValue();

              AnsiString __fastcall GetVisualValue();

              virtual void __fastcall GetValues(Classes::TGetStrProc Proc);

              virtual void __fastcall Initialize(void);

              void __fastcall Revert(void);

              virtual void __fastcall SetValue(const AnsiString Value);

              bool __fastcall ValueAvailable(void);

              DYNAMIC void __fastcall ListMeasureWidth(const AnsiString Value, Graphics::TCanvas* ACanvas, int &AWidth

                            );

              DYNAMIC void __fastcall ListMeasureHeight(const AnsiString Value, Graphics::TCanvas* ACanvas, int &

                            AHeight);

              DYNAMIC void __fastcall ListDrawValue(const AnsiString Value, Graphics::TCanvas* ACanvas, const Windows::TRect

                            &ARect, bool ASelected);

              DYNAMIC void __fastcall PropDrawName(Graphics::TCanvas* ACanvas, const Windows::TRect &ARect, bool

                            ASelected);

              DYNAMIC void __fastcall PropDrawValue(Graphics::TCanvas* ACanvas, const Windows::TRect &ARect, bool

                            ASelected);

              __property _di_IFormDesigner Designer = {read=FDesigner};

              __property AnsiString PrivateDirectory = {read=GetPrivateDirectory};

              __property int PropCount = {read=FPropCount, nodefault};

              __property AnsiString Value = {read=GetValue, write=SetValue};

};

 

Modyfikując wirtualne (virtual) i dynamiczne (DYNAMIC) metody klasy TPropertyEditor można przystosowywać jej zachowanie do specyficznych warunków, tworząc tym samym nowe klasy edytorów właściwości. Drzewo genealogiczne standardowych reprezentantów tej rodziny przedstawia rysunek 10.1 — edytory znajdujące się na pozycjach „zacienionych” charakteryzują się odmiennym (w stosunku do klasy TPropertyEditor) sposobem graficznego reprezentowania właściwości (zajmiemy się nimi w dalszej części rozdziału). Wykaz najpowszechniej używanych edytorów właściwości zawiera tabela 10.2.

 

Proszę tutaj umieścić rysunek identyczny z tym ze strony 407 (10.1) bez żadnych zmian.

Rysunek 10.1 Hierarchia edytorów właściwości VCL

 

 

Tabela 10.2 Powszechnie używane edytory właściwości

 

Klasa edytora

Przeznaczenie i opis

Przykład edytowanej właściwości

TCaptionProperty

...
Zgłoś jeśli naruszono regulamin