2011-05-07 3 views
10

Я хочу добавить флажок или другой компонент VCL в TSaveDialog.Как добавить флажок в TSaveDialog в Delphi 2010

Канту говорит,

Новый Vista, Открыть и Сохранить диалоговые окна (осуществляется IFileOpenDialog и
интерфейсов IFileSaveDialog) непосредственно сопоставляются новым FileOpenDialog и
компонентов FileSaveDialog, но и стандартный OpenDialog и компонент SaveDialog использует
новый стиль, когда установлен глобальный UseLatestCommonDialogs.

Я понятия не имею, что это значит (я никогда не делал какого-либо программирования интерфейса ...)

И я не хочу, чтобы использовать инструменты сторонних производителей.

Я видел, что это было предложено в веб-поиске только сейчас, когда я смотрю код TOpenPictureDialog и копирую его.

Прежде чем попробовать какие-либо дорожки, я подумал, что попрошу здесь дать некоторые рекомендации. Любые предложения по решению XP через Win7 по добавлению флажка в современный файл, открыть диалоговое окно в автономном режиме Windows?

Том

ответ

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

9

Вы можете сделать это с помощью шаблона, но это приведет к устаревшим диалоговым окнам в Vista/7. На этих платформах вы должны использовать IFileDialogCustomize. Конечно, для поддержки XP вам также необходимо реализовать шаблонный подход.