Редакторы свойств - вспомогательный элемент компонента, помогающий изменять значения свойств компонента at design-time в красивом (или не очень - как обычно все зависит от программиста) диалоге. Делать это обычно удобнее, чем вручную сидеть и набивать значение свойства в маленькое поле. Вот типпичные примеры редакторов свойств:
Ну, Вы не подумайте, что они у меня так выглядят тоже - узенько и без оконных кнопок - это просто монтаж.
Теперь поняли, какая это хорошая вещь? Для начала добавим свойство Root - папка, от которой отображается дерево. Ну, и какой же редактор свойств нам подойдет больще всего? Конечно же, окно просмотра папки :)). Ну я думаю, мы рекурсивно создавать не будем компонент, а сделаем так:
// ------------- FolderDialog.h #ifndef FolderDialogH #define FolderDialogH //----------------------------------- #include <SysUtils.hpp> #include <Controls.hpp> #include <Classes.hpp> #include <Forms.hpp> #include <Dialogs.hpp> #include <dsgnintf.hpp> //----------------------------------- // ... class PACKAGE TFolderDialog : public TCommonDialog { // ... private: // ... protected: // ... AnsiString FRoot; // ... TNotifyEvent FOnClose; public: // ... __published: // ... __property AnsiString Root = {read = FRoot, write = FRoot}; __property AnsiString StatusText = {read = FStatusText, write = SetStatusText}; // ... }; class PACKAGE TFolderPropertyEditor : public TStringProperty { public: __fastcall TFolderPropertyEditor(void):Dsgnintf::TStringProperty(Designer,0){}; TPropertyAttributes __fastcall GetAttributes() { return TPropertyAttributes()<<paDialog; }; void __fastcall Edit(); }; //----------------------------------- #endif
Файл FolderDialog.cpp:
// ------------- FolderDialog.cpp #define NO_WIN32_LEAN_AND_MEAN #include <shlobj.h> #include <vcl.h> #pragma hdrstop #include "FolderDialog.h" // ... #pragma package(smart_init) // ... //----------------------------------- bool __fastcall TFolderDialog::Execute(void) { // ... if(FRoot!=NULL){ if(FRoot.Length()>0) { LPITEMIDLIST pidl; LPSHELLFOLDER folder; SHGetDesktopFolder(&folder); unsigned long parsed; folder->ParseDisplayName(NULL,0, WideString(FRoot).c_bstr(), &parsed,&pidl,NULL); delete folder; bi.pidlRoot = pidl; }; }; LPITEMIDLIST lst = SHBrowseForFolder(&bi); FHandle = 0; if(FOnClose) OnClose(this); if(!lst) return false; char buf[MAX_PATH]; SHGetPathFromIDList(lst,buf); FFolder = buf; return true; } // ... namespace Folderdialog { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TFolderDialog)}; RegisterComponents("Ossam", classes, 0); PTypeInfo ti = *GetPropInfo(__typeinfo(TFolderDialog),"Root")->PropType; RegisterPropertyEditor(ti, __classid(TFolderDialog), "Root",__classid(TFolderPropertyEditor)); } } // ... void __fastcall TFolderPropertyEditor::Edit(void) { BROWSEINFO bi; setmem(&bi, sizeof(bi), 0); bi.hwndOwner = NULL; bi.ulFlags = 0; bi.lpszTitle = String("Select Folder").c_str(); LPITEMIDLIST idl = SHBrowseForFolder(&bi); if(idl==NULL) return; char buf[MAX_PATH]; SHGetPathFromIDList(idl,buf); SetValue(AnsiString(buf)); }; // ...
Ну вот. Такой вариант редактора свойств Вас устраивает? В следующем шаге еще что-нибудь по поводу редакторов свойств расскажу.