2011-05-07 44 views
10

我想添加一個複選框或其他VCL組件到TSaveDialog。如何添加複選框到Delphi 2010中的TSaveDialog

坎說,

新的Vista打開和保存對話框(由IFileOpenDialog和
IFileSaveDialog接口來實現的)是直接由新FileOpenDialog和
FileSaveDialog組件,但也是標準OpenDialog映射並且SaveDialog組件使用
全局UseLatestCommonDialogs設置時的新樣式。

我不知道這是什麼意思(我從來沒有做過任何界面編程...)

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

我剛纔看到它在網絡搜索中建議我查看TOpenPictureDialog代碼並複製它。

在嘗試任何路徑之前,我想我會在這裏問一些指導。通過Win7解決方案的任何建議,以Windows版本獨立的方式添加複選框到現代文件,打開對話框?

Tom

回答

14

Robert,您可以使用對話框模板來做到這一點。

首先,你必須存儲模板爲您的應用程序的資源,然後加載使用TOpenFilename結構的模板(不要被名字擔心,是開放的相同和保存對話框),最後調用傳遞GetSaveFileName功能TOpenFilename結構。

檢查該樣本

創建對話框模板資源文件(calledSaveDialog.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

+0

做得很好,RRUZ。很好的答案,加上示例代碼,並顯示結果的屏幕截圖。謝謝! – RobertFrank 2011-05-08 02:13:07

9

您可以使用模板執行此操作,但這會導致Vista/7中的傳統對話框。在這些平臺上,您應該使用IFileDialogCustomize。當然,爲了支持XP,你也需要實現模板方法。