Вообще, винда предоставляет возможность расширения некоторых стандартных диалогов с помощью шаблонов и hook-процедуры. Например, для OpenFileDialog'а пишется к примеру, такой rc-скрипт с шаблоном
и получается myres.res, который линкуется к проекту директивой {$R} (удобнее, конечно создавать и компилить шаблон в каком-нить редакторе ресурсов, типа Resource Workshop'а).
Ну а в проге заполняется структура TOpenFileName (надо в uses подключить commdlg), у которой в поле lpTemplateName задается имя шаблона, а в поле lpfnHook - hook-процедура. В этой hook-процедуре и обрабатывается реакция на дополнительные контролы (например чекбоксы). Там же можно обработать смену типа файла, директории, выбранного файла, нажатие на OK, etc.
Ну а для показа самого диалога вызывается API'шная GetOpenFileName
var
ofn:TOpenFileName;
f:array[0..MAX_PATH-1] of Char;
// hook-процедура
function Fh(Wnd: HWND; Msg:cardinal; wParam,lParam: Integer): UINT stdcall;
begin
result:=0;
case Msg of
WM_INITDIALOG:
begin
CheckDlgButton(Wnd,101,BST_CHECKED); // отметим первый чекбокс
end;
WM_COMMAND: // реакция на изменение состояния чекбоксов
case LOWORD(wParam) of
101:
begin
if (IsDlgButtonChecked(Wnd,101)=BST_CHECKED) then MessageBox(Wnd,'CheckBox1 Checked!','FileOpenDialog',0);
end;
102:
begin
if (IsDlgButtonChecked(Wnd,102)=BST_CHECKED) then MessageBox(Wnd,'CheckBox2 Checked!','FileOpenDialog',0);
end;
end;
WM_NOTIFY:
case
POFNotify(lParam)^.hdr.code of
CDN_FILEOK: // реакция на выбор файла
begin
if (IsDlgButtonChecked(Wnd,101)=BST_CHECKED) then
MessageBox(Wnd,PChar('CheckBox1 Checked and '+ofn.lpstrFile+' selected'),'FileOpenDialog',0);
if (IsDlgButtonChecked(Wnd,102)=BST_CHECKED) then
MessageBox(Wnd,PChar('CheckBox2 Checked and '+ofn.lpstrFile+' selected'),'FileOpenDialog',0);
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FillChar(f,sizeof(f),0);
FillChar(ofn,sizeof(ofn),0);
Статья Как добавить в диалог TOpenDialog свой CheckBox раздела ОС и Железо Диалоги и Фреймы может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.