【问题标题】:How to add a checkbox to TSaveDialog in Delphi 2010如何在 Delphi 2010 中向 TSaveDialog 添加复选框
【发布时间】:2011-08-20 14:07:53
【问题描述】:

我想在 TSaveDialog 中添加一个复选框或其他 VCL 组件。

坎图说,

新的 Vista 打开和保存对话框(由 IFileOpenDialog 和
实现 IFileSaveDialog 接口)由新的 FileOpenDialog 直接映射,并且
FileSaveDialog 组件,也是标准的 OpenDialog 和 SaveDialog 组件使用
设置全局 UseLatestCommonDialogs 时的新样式。

我不知道那是什么意思(我从来没有做过任何接口编程......)

而且我不想使用第三方工具。

刚才在网络搜索上看到提示,我看了一下TOpenPictureDialog代码,复制一下。

在尝试任何路径之前,我想我会在这里寻求一些指导。关于通过 Win7 的 XP 解决方案以独立于 Windows 版本的方式将复选框添加到现代文件、打开对话框的任何建议?

汤姆

【问题讨论】:

    标签: delphi delphi-2010 tcheckbox tsavedialog


    【解决方案1】:

    罗伯特,您可以使用对话模板来做到这一点。

    首先您必须将模板作为资源存储在您的应用中,然后使用TOpenFilename 结构加载模板(不用担心名称,打开和保存对话框相同)最后调用@987654322传递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;
    

    这是输出

    【讨论】:

    • 干得好,RRUZ。很好的答案,加上示例代码,并显示了结果的屏幕截图。谢谢!
    【解决方案2】:

    您可以使用模板执行此操作,但这会导致 Vista/7 中的旧对话框。在这些平台上,您应该使用IFileDialogCustomize。当然,要支持 XP,您还需要实现模板方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多