开发者

How to add a checkbox to TSaveDialog in Delphi 2010

I want to add a checkbox or other VCL component to the TSaveDialog.

Cantu says,

The new Vista Open and Save dialog boxes (implemented by the IFileOpenDialog and

IFileSaveDialog interfaces) are directly mapped by the new FileOpenDialog and

FileSaveDialog components, but also the standard OpenDialog and SaveDialog component uses

the new style when 开发者_运维问答the global UseLatestCommonDialogs is set.

I have no idea what that means (I've never done any Interface programming...)

And I don't want to use third party tools.

I saw it suggested on a web search just now that I look at the TOpenPictureDialog code and copy it.

Before trying any of the paths, I thought I'd ask here for some guidance. Any suggestions on an XP through Win7 solution to adding a checkbox to a modern File, Open dialog box in a Windows-version independent manner?

Tom


Robert, you can do that using a dialog template.

First you must store the template as a resource in your app, then load the template using the TOpenFilename structure (don't worry by the name, is the same for open and save dialogs) and finally call the GetSaveFileName function passing the TOpenFilename structure.

check this sample

Create a resource file (calledSaveDialog.rc) with the dialog template (look the MyCheckBox added)

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
}

this is the source code

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;

and this is the output

How to add a checkbox to TSaveDialog in Delphi 2010


You can do this with a template but this leads to the legacy dialogs in Vista/7. On those platforms you should make use of IFileDialogCustomize. Of course to support XP you need to implement the template approach too.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜