如何在Delphi 2010中向TSaveDialog添加复选框

10
我想向TSaveDialog添加复选框或其他VCL组件。
Cantu说:
新的Vista打开和保存对话框(由IFileOpenDialog和IFileSaveDialog接口实现)由新的FileOpenDialog和FileSaveDialog组件直接映射,但是当全局UseLatestCommonDialogs被设置时,标准的OpenDialog和SaveDialog组件也使用了新样式。
我不知道这意味着什么(我从未进行过任何界面编程...),而且我不想使用第三方工具。我刚才在网上搜索时看到建议我查看TOpenPictureDialog代码并将其复制。在尝试任何路径之前,我想在这里寻求一些指导。您有关于XP到Win7解决在不依赖于Windows版本的情况下向现代文件打开对话框添加复选框的建议吗?
Tom
2个回答

16
罗伯特,您可以使用对话框模板来实现这一点。首先,您必须将模板作为应用程序资源存储,然后使用 TOpenFilename 结构加载模板(不用担心名称,对于打开和保存对话框是相同的),最后调用传递 TOpenFilename 结构的 GetSaveFileName 函数。请查看以下示例:创建一个资源文件(称为 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;

这是输出结果:

在此输入图片描述


做得好,RRUZ。非常棒的答案,加上示例代码,并展示了结果的屏幕截图。谢谢! - RobertFrank

9

您可以使用模板来完成这一操作,但这将导致在Vista / 7中遗留旧的对话框。在这些平台上,您应该利用IFileDialogCustomize。当然,为了支持XP,您还需要实现模板方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接