2011-05-07 12 views
10

TSaveDialog'a bir onay kutusu veya başka bir VCL bileşeni eklemek istiyorum.Delphi 2010'da TSaveDialog'a nasıl bir onay kutusu eklenir

Cantu diyor, (IFileOpenDialog ve
IFileSaveDialog arayüzleri tarafından uygulanan)

yeni Vista Açık ve iletişim kutularını Kaydet doğrudan yeni FileOpenDialog ve
FileSaveDialog bileşenleri, aynı zamanda standart OpenDialog tarafından eşlenir ve SaveDialog bileşeni, global UseLatestCommonDialogs ayarlandığında
yeni stili kullanır.

I (... Ben herhangi Arayüz programlama hiç yapmadım) bunun ne anlama geldiğini hiçbir fikri var

Ve üçüncü parti araçları kullanmak istemiyoruz.

Sadece TOpenPictureDialog koduna bakıp kopyaladığım bir web aramasında önerildiğini gördüm.

Yollardan herhangi birini denemeden önce, bir miktar rehberlik için burada rica edeceğimi düşündüm. Windows XP'den Win7 çözümüne, Windows sürümünde bağımsız bir biçimde modern bir Dosya, Aç iletişim kutusuna bir onay kutusu eklemeye yönelik herhangi bir öneriniz var mı?

Tom

cevap

14

Robert, bir iletişim şablonu kullanarak yapabilir.

Önce, şablonu uygulamanızda bir kaynak olarak depolamanız, ardından TOpenFilename yapısını kullanarak şablonu yüklemeniz gerekir (adla endişelenmeyin, açma ve kaydetme işlemleri için aynıdır) ve son olarak GetSaveFileName işlevini çağırın. TOpenFilename yapısı.

onay bu örnek

iletişim şablonla bir kaynak dosyası (calledSaveDialog.rc) oluşturun (bak MyCheckBox eklendi)

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 
} 

bu kaynak kodu

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; 

ve Bu, çıktı

enter image description here

+0

Güzel bitti, RRUZ. Harika bir cevap, artı örnek kod ve sonucun ekran görüntüsünü gösterir. Teşekkürler! – RobertFrank

9

Bunu bir şablonla yapabilirsiniz, ancak bu Vista/7'deki eski iletişim kutularına yönlendirir. Bu platformlarda IFileDialogCustomize'u kullanmalısınız. Tabii ki XP'yi desteklemek için şablon yaklaşımını da uygulamanız gerekiyor.