Как добавить флажок в TSaveDialog в Delphi 2010
Я хочу добавить флажок или другой компонент VCL в TSaveDialog.
Канту говорит,
Новые диалоговые окна "Открыть" и "Сохранить" (реализованы с помощью IFileOpenDialog и
Интерфейсы IFileSaveDialog) непосредственно отображаются новым FileOpenDialog и
Компоненты FileSaveDialog, но также используются стандартные компоненты OpenDialog и SaveDialog
новый стиль, когда установлен глобальный UseLatestCommonDialogs.
Я понятия не имею, что это значит (я никогда не занимался программированием интерфейса...)
И я не хочу использовать сторонние инструменты.
Я увидел, что это предложено в веб-поиске только сейчас, когда я смотрю на код TOpenPictureDialog и копирую его.
Прежде чем попробовать какой-либо из путей, я подумал, что я бы попросил у вас совета. Какие-нибудь предложения по решению XP через Win7 для добавления флажка в современное диалоговое окно File, Open независимо от версии Windows?
Том
2 ответа
Роберт, ты можешь сделать это используя шаблон диалога.
Сначала вы должны сохранить шаблон как ресурс в вашем приложении, а затем загрузить шаблон с помощью TOpenFilename
структура (не беспокойтесь по имени, то же самое для открытия и сохранения диалогов) и, наконец, вызовите GetSaveFileName
функция прохождения TOpenFilename
состав.
проверьте этот образец
Создайте файл ресурса (называемый SaveDialog.rc) с шаблоном диалога (смотрите добавленный MyCheckBox)
MYSAVEFILE DIALOG -1, 1, 300, 60
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
CAPTION ""
FONT 8, "Tahoma"
{
CONTROL "MyCheckBox", 666, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 84, 19, 60, 12
}
это исходный код
Uses
CommDlg;
var
lpofn : TOpenFilename;
lpstrFile: Array[0..MAX_PATH-1] of Char;
{$R *.dfm}
{$R SaveDialog.Res}
function _lpfnHook(hdlg: HWND; uiMsg:UINT;wParam:WPARAM;lParam:LPARAM): UINT stdcall;
begin
Result:=0;
case uiMsg of
// Set the initial state of mycheckbox to checked
WM_INITDIALOG : CheckDlgButton(hdlg,666,BST_CHECKED);
WM_COMMAND :
case wParam of
666:
begin
if (IsDlgButtonChecked(hdlg,666)=BST_CHECKED) then
ShowMessage('MyCheckBox was checked')
else
if (IsDlgButtonChecked(hdlg,666)=BST_UNCHECKED) then
ShowMessage('MyCheckBox was unchecked');
end;
end;
end;
end;
procedure TFrmMain.Button1Click(Sender: TObject);
begin
ZeroMemory(@lpofn,sizeof(lpofn));
lpofn.lStructSize := SizeOf(lpofn);
lpofn.hwndOwner := Handle;
lpofn.hInstance := hInstance;
//set the filter name
lpofn.lpstrFilter := 'All files (*.*)'#0'*.*'#0#0;
lpofn.lpstrTitle := 'Save As';
lpofn.lpstrFile := lpstrFile;
lpofn.nMaxFile := MAX_PATH;
//Set the template Name
lpofn.lpTemplateName :='MYSAVEFILE';
//set the callback function
lpofn.lpfnHook := _lpfnHook;
lpofn.Flags := OFN_EXPLORER or OFN_CREATEPROMPT or OFN_HIDEREADONLY or
OFN_PATHMUSTEXIST or OFN_ENABLEHOOK or OFN_ENABLETEMPLATE;
//execute the dialog
if GetSaveFileName(lpofn) then ShowMessage(lpofn.lpstrFile);
end;
и это выход
Вы можете сделать это с помощью шаблона, но это приводит к устаревшим диалогам в Vista/7. На этих платформах вы должны использовать IFileDialogCustomize. Конечно, для поддержки XP вам также необходимо реализовать шаблонный подход.