При разработке приложений на Delphi часто возникает потребность в расширении стандартных диалогов, таких как TSaveDialog, добавлением пользовательских компонентов, например, чекбоксов. В версии Delphi 2010, если вы хотите использовать современные диалоги открытия и сохранения файлов, реализованные через интерфейсы IFileOpenDialog и IFileSaveDialog, вам потребуется воспользоваться компонентами FileOpenDialog и FileSaveDialog. Однако, если глобальный параметр UseLatestCommonDialogs установлен в истину, стандартные диалоги OpenDialog и SaveDialog также будут использовать новый стиль.
Описание проблемы
Пользователь Tom столкнулся с проблемой добавления чекбокса в диалог сохранения файла TSaveDialog в Delphi 2010. Он не знаком с программированием интерфейсов и не хочет использовать сторонние инструменты. Вопрос заключается в поиске решения, которое будет работать на системах от Windows XP до Windows 7.
Подход к решению
Роберт (Robert) предложил использовать диалоговый шаблон. Для этого необходимо сначала сохранить шаблон в ресурсах приложения, затем загрузить его с помощью структуры TOpenFilename и, наконец, вызвать функцию GetSaveFileName, передав структуру TOpenFilename.
Пример реализации
Создайте файл ресурсов SaveDialog.rc с диалоговым шаблоном, добавив в него чекбокс:
Uses
CommDlg;
{$R *.dfm}
{$R SaveDialog.Res}
var
lpofn: TOpenFilename;
lpstrFile: array[0..MAX_PATH-1] of Char;
function _lpfnHook(hdlg: HWND; uiMsg: UINT; wParam: WPARAM; lParam: LPARAM): UINT; stdcall;
begin
Result := 0;
case uiMsg of
// Установить начальное состояние чекбокса в состояние отмеченного
WM_INITDIALOG: CheckDlgButton(hdlg, 666, BST_CHECKED);
WM_COMMAND:
case wParam of
666:
begin
if (IsDlgButtonChecked(hdlg, 666) = BST_CHECKED) then
ShowMessage('Чекбокс был отмечен')
else
if (IsDlgButtonChecked(hdlg, 666) = BST_UNCHECKED) then
ShowMessage('Чекбокс был снят');
end;
end;
end;
end;
procedure TFrmMain.Button1Click(Sender: TObject);
begin
ZeroMemory(@lpofn, SizeOf(lpofn));
lpofn.lStructSize := SizeOf(lpofn);
lpofn.hwndOwner := Handle;
lpofn.hInstance := hInstance;
// Установить имя фильтра
lpofn.lpstrFilter := 'Все файлы (*.*)'#0'*.*'#0#0;
lpofn.lpstrTitle := 'Сохранить как';
lpofn.lpstrFile := lpstrFile;
lpofn.nMaxFile := MAX_PATH;
// Установить имя шаблона
lpofn.lpTemplateName := 'MYSAVEFILE';
// Установить функцию обратного вызова
lpofn.lpfnHook := _lpfnHook;
lpofn.Flags := OFN_EXPLORER or OFN_CREATEPROMPT or OFN_HIDEREADONLY or
OFN_PATHMUSTEXIST or OFN_ENABLEHOOK or OFN_ENABLETEMPLATE;
// Выполнить диалог
if GetSaveFileName(lpofn) then ShowMessage(lpofn.lpstrFile);
end;
Альтернативный подход для Vista/7
Для систем Vista и Windows 7 рекомендуется использовать IFileDialogCustomize, что позволит избежать использования устаревших диалогов. Однако для поддержки Windows XP все равно потребуется реализация с использованием шаблона.
Заключение
Добавление чекбокса в диалог сохранения TSaveDialog в Delphi 2010 возможно с использованием диалогового шаблона и ресурсов. Приведенный пример кода демонстрирует, как это можно сделать, и показывает итоговый диалог с чекбоксом.
Пользователь хочет добавить чекбокс в стандартный диалог сохранения файла TSaveDialog в Delphi 2010, используя ресурсный файл диалогового шаблона для поддержки систем от Windows XP до Windows 7.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.