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