簡體   English   中英

如何在Delphi 2010中為TSaveDialog添加一個復選框

[英]How to add a checkbox to TSaveDialog in Delphi 2010

我想在TSaveDialog中添加一個復選框或其他VCL組件。

坎圖說,

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

我不知道這意味着什么(我從未做過任何接口編程......)

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

我剛才在網絡搜索中看到它建議我查看TOpenPictureDialog代碼並復制它。

在嘗試任何路徑之前,我想我會在這里尋求一些指導。 有關XP到Win7解決方案的任何建議,以獨立於Windows版本的方式向現代文件,打開對話框添加復選框?

湯姆

羅伯特,你可以使用對話框模板來做到這一點。

首先,您必須將模板作為資源存儲在應用程序中,然后使用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;

這是輸出

在此輸入圖像描述

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM