Ну, во-первых, поскольку компонент мы наследуем, а не создаем с нуля, то, казалось бы, кое-какие свойства у него уже есть. Я больше скажу - свойств у него более чем достаточно, особенно от предков 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 функцией. Надеюсь, Вы еще помните, что это такое, поскольку я за последнее время видел довольно малое число классов, использующих дружественные функции. Зачем это надо? Для доступа к защищенным полям естественно... Конкретнее? Все станет ясно в следующем шаге.