Ну, во-первых, поскольку компонент мы наследуем, а не создаем с нуля, то, казалось бы, кое-какие свойства у него уже есть. Я больше скажу - свойств у него более чем достаточно, особенно от предков TComponent и TObject. Однако большинство этих свойств нам не нужны. Поэтому... А поэтому будем все делать сами... Ниже будет код, со всеми нужными свойствами, методами и событиями:
//---------------------------------- #ifndef FolderDialogH #define FolderDialogH //---------------------------------- #include <SysUtils.hpp> #include <Controls.hpp> #include <Classes.hpp> #include <Forms.hpp> #include <Dialogs.hpp> //---------------------------------- class TFolderDialog; typedef enum { fdBrowseForComputer,fdBrowseForPrinter,fdDontGoBelowDomain, fdReturnOnlySysAncestors,fdReturnOnlySysDirs, fdStatusText} TFolderDialogFlags; typedef Set <TFolderDialogFlags,fdBrowseForComputer,fdStatusText> TFlagSet; int __stdcall FolderBrowseProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData); typedef void __fastcall(__closure *TFolderChangedEvent)(TFolderDialog *Sender, AnsiString NewFolder); class PACKAGE TFolderDialog : public TCommonDialog { friend int __stdcall FolderBrowseProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData); private: protected: AnsiString FFolder; AnsiString FTitle; AnsiString FStatusText; bool FOkEnabled; HWND FHandle; TFlagSet FOptions; void __fastcall SetFolder(AnsiString folder); void __fastcall SetOkEnabled(bool enabled); void __fastcall SetStatusText(AnsiString text); TNotifyEvent FOnShow; TNotifyEvent FOnClose; public: TFolderChangedEvent FOnFolderChanged; __fastcall TFolderDialog(TComponent* Owner); void __fastcall Execute(void); __property HWND Handle = {read = FHandle, write = FHandle, default=NULL}; __property AnsiString Folder = {read = FFolder, write = FFolder}; __property bool OkEnabled = {read = FOkEnabled, write = SetOkEnabled}; __published: __property TFolderChangedEvent OnFolderChanged = {read = FOnFolderChanged, write = FOnFolderChanged}; __property TNotifyEvent OnShow = {read = FOnShow, write = FOnShow}; __property TNotifyEvent OnClose = {read=FOnClose, write=FOnClose}; __property AnsiString StatusText = {read = FStatusText, write = SetStatusText}; __property AnsiString Title = {read = FTitle, write = FTitle}; __property TFlagSet Options = {read = FOptions, write = FOptions}; }; //---------------------------------- #endif #endif
Это каркас свойств для наиболее полного использования функции SHBrowseForFolder. Как Вы видите, даже в таком простом примере полно всякой всячины - метода записи свойств, значения по умолчанию, множества и прочее... Помимо прочего еще и описана функция FolderBrowseProc, которая является friend функцией. Надеюсь, Вы еще помните, что это такое, поскольку я за последнее время видел довольно малое число классов, использующих дружественные функции. Зачем это надо? Для доступа к защищенным полям естественно... Конкретнее? Все станет ясно в следующем шаге.