Вы можете сделать это, если используете функцию API ShBrowseForFolder
. Я думаю, что Delphi поставляется с версией SelectDirectory
, которая обертывает эту функцию, хотя оболочка может не обеспечить достаточный доступ для того, что вам нужно делать с ней. Вы должны включить callback function для параметра lpfn
с этой подписью:
function BrowseCallbackProc(Wnd: HWnd; uMsg: UInt; lParam, lpData: LParam): Integer; stdcall;
При изменении выбора, диалоговое окно будет вызывать функцию, при условии, с bffm_SelChanged
в качестве параметра uMsg
. Третий параметр будет PIDL, представляющим текущий выбор, поэтому вам может потребоваться позвонить ShGetPathFromIDList
, чтобы определить имя строки. Вы можете управлять кнопкой OK, отправив сообщения обратно в дескриптор окна диалогового окна в параметре Wnd
. Например:
SendMessage(Wnd, bffm_EnableOK, 0, 0); // disable the button
SendMessage(Wnd, bffm_EnableOK, 0, 1); // enable the button
Не забудьте снова включить кнопку для хороших выборов после отключения его для недействительных выборов.
Если критерием действительного выбора является то, что каталог должен содержать файл с определенным именем, обязательно укажите флаг bif_BrowseIncludeFiles
, чтобы люди могли видеть, какие файлы есть.
Очень приятно. Я хочу, чтобы элементы управления выбором каталога в VCL и JVCL предоставили для этого обработчик событий. –