Как добавить флажок в TSaveDialog в Delphi 2010 - PullRequest
10 голосов
/ 07 мая 2011

Я хочу добавить флажок или другой компонент VCL в TSaveDialog.

Cantu говорит,

Новые диалоговые окна Vista Open и Save (реализованные IFileOpenDialog и
Интерфейсы IFileSaveDialog) непосредственно сопоставляются новыми компонентами FileOpenDialog и
FileSaveDialog, но также стандартные компоненты OpenDialog и SaveDialog используют
новый стиль, когда задан глобальный UseLatestCommonDialogs.

Я понятия не имею, что это значит (я никогда не занимался программированием интерфейса ...)

И я не хочу использовать сторонние инструменты.

Я видел, что это предложено напоиск в Интернете только сейчас, когда я смотрю код TOpenPictureDialog и копирую его.

Перед тем, как попробовать любой из путей, я подумал, что я бы попросил здесь некоторые указания.Любые предложения по решению XP через Win7 для добавления флажка в современное диалоговое окно File, Open независимо от версии Windows?

Tom

Ответы [ 2 ]

15 голосов
/ 07 мая 2011

Роберт, вы можете сделать это, используя шаблон диалога.

Сначала вы должны сохранить шаблон как ресурс в своем приложении, а затем загрузить шаблон с использованием структуры 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;

и это вывод

enter image description here

9 голосов
/ 07 мая 2011

Вы можете сделать это с помощью шаблона, но это приводит к устаревшим диалогам в Vista / 7.На этих платформах вы должны использовать IFileDialogCustomize .Конечно, для поддержки XP вам также необходимо реализовать шаблонный подход.

...