Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как добавить в диалог TOpenDialog свой CheckBox

Delphi , ОС и Железо , Диалоги и Фреймы

Вообще, винда предоставляет возможность расширения некоторых стандартных диалогов с помощью шаблонов и hook-процедуры. Например, для OpenFileDialog'а пишется к примеру, такой rc-скрипт с шаблоном
 
myres.rc

Code:

OFT DIALOG -1, 1, 304, 62
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
CAPTION ""
FONT 8, "MS Sans Serif"
{
CONTROL "Select Options", 100, "button", BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP, 69, 4, 224, 52
CONTROL "CheckBox1", 101, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 84, 19, 60, 12
CONTROL "CheckBox2", 102, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 84, 38, 60, 12
}

потом он компилится
 

brcc32.exe myres.rc  
 
и получается myres.res, который линкуется к проекту директивой {$R} (удобнее, конечно создавать и компилить шаблон в каком-нить редакторе ресурсов, типа Resource Workshop'а).
 
Ну а в проге заполняется структура TOpenFileName (надо в uses подключить commdlg), у которой в поле lpTemplateName задается имя шаблона, а в поле lpfnHook - hook-процедура. В этой hook-процедуре и обрабатывается реакция на дополнительные контролы (например чекбоксы). Там же можно обработать смену типа файла, директории, выбранного файла, нажатие на OK, etc.
Ну а для показа самого диалога вызывается API'шная GetOpenFileName
 
Короче, вот пример кода
 

Code:

uses
commdlg;
{©Drkb v.3(2007): www.drkb.ru}
 
{$R *.dfm}
 
{$R MYRES.RES} // файл ресурсов с шаблоном
 
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);
 
ofn.lStructSize := sizeof(TOpenFileName);
ofn.hwndOwner := Handle;
ofn.hInstance := hInstance;
 
ofn.lpstrFilter       :=  'Text Files (*.TXT)'#0'*.txt'#0+
                           'Executables (*.EXE)'#0'*.exe'#0+
                           'All files (*.*)'#0'*.*'#0#0;
ofn.lpstrTitle        := 'Select File';
ofn.lpstrFile         := f;
ofn.nMaxFile          := MAX_PATH;
ofn.lpTemplateName    :='OFT';   // имя шаблона
ofn.lpfnHook          := Fh;     // hook-процедура
ofn.Flags             := OFN_EXPLORER or OFN_CREATEPROMPT or
                         OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or
                         OFN_PATHMUSTEXIST or OFN_ENABLEHOOK or
                         OFN_ENABLETEMPLATE;
// показываем диалог
if GetOpenFileName(ofn) then ShowMessage(ofn.lpstrFile);
end;

 

Автор: Krid

Взято из http://forum.sources.ru

Чтобы добавить чекбокс в TOpenDialog в Delphi, можно использовать подход, описанный выше, который заключается в созданииcustom ресурсного файла (.res) с шаблоном для вашего диалога и затем связать его с проектом.

Вот пример, как можно модифицировать код для добавления чекбокса:

Сначала создайте новый ресурсный файл (например, myres.res) с следующим содержимым:

// myres.rc

// Диалоговое определение
OFT DIALOG -1, 1, 304, 62
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
CAPTION ""
FONT 8, "MS Sans Serif"
{
    CONTROL "Select Options", 100, "button", BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP, 69, 4, 224, 52
    CONTROL "CheckBox1", 101, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 84, 19, 60, 12
}

Скомпилируйте ресурсный файл с помощью Brcc32.exe:

brcc32.exe myres.rc

Это будет генерировать новый .res-файл (myres.res), который можно связать с проектом.

В вашем коде Delphi включите следующие строки:

uses
    commdlg;

{$R *.dfm}
{$R MYRES.RES}  // включить custom ресурсный файл

В процедуре Button1Click установите структуру TOpenFileName как обычно, а затем добавьте следующие строки для указания имени шаблона и функции hook:

ofn.lpTemplateName := 'OFT';  // имя custom шаблона
ofn.lpfnHook := Fh;  // функция hook для обработки custom контролов

Остальная часть кода остается прежней. Когда вы запустите ваше приложение, будет отображаться диалог с чекбоксом.

Обратите внимание, что вам нужно создать функцию hook (Fh в этом примере) для обработки событий, генерируемых custom контролом. В этом случае мы используем сообщения WM_COMMAND и WM_NOTIFY для ответа на изменения состояния чекбокса.

Добавить в диалог TOpenDialog свой CheckBox можно с помощью шаблона и hook-процедуры, создавая rc-скрипт с контролами, компилируя его в файл ресурсов, а затем используя структуру TOpenFileName и вызывая API-функцию GetOpenFileName.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Диалоги и Фреймы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 05:23:33/0.025725126266479/1