2011-05-07 10 views
10

Desidero aggiungere una casella di controllo o un altro componente VCL a TSaveDialog.Come aggiungere una casella di controllo a TSaveDialog in Delphi 2010

Cantu dice,

Il nuovo Vista Apri e Salva finestre di dialogo (attuato dal IFileOpenDialog e
interfacce IFileSaveDialog) sono direttamente mappati dal nuovo FileOpenDialog e
componenti FileSaveDialog, ma anche lo standard OpenDialog e il componente SaveDialog utilizza
il nuovo stile quando è impostato il UseLatestCommonDialogs globale.

Non ho alcuna idea di cosa significhi (non ho mai fatto alcuna programmazione di interfaccia ...)

E io non voglio utilizzare strumenti di terze parti.

L'ho visto suggerire su una ricerca Web proprio ora che guardo il codice TOpenPictureDialog e lo copio.

Prima di provare uno qualsiasi dei percorsi, ho pensato di chiedere qui alcune indicazioni. Qualche suggerimento su una XP attraverso la soluzione Win7 per aggiungere una casella di controllo a un file moderno, aprire la finestra di dialogo in una versione indipendente di Windows?

Tom

risposta

14

Robert, è possibile farlo utilizzando un modello di finestra di dialogo.

In primo luogo è necessario memorizzare il modello come una risorsa nella vostra applicazione, quindi caricare il modello utilizzando il TOpenFilename struttura (non vi preoccupate dal nome, è lo stesso per Apri e Salva finestre di dialogo) e, infine, chiama la funzione di passaggio GetSaveFileName la struttura TOpenFilename.

controllo questo campione

Creare un file di risorse (calledSaveDialog.rc) con il modello finestra di dialogo (vedi la MyCheckBox aggiunto)

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 
} 

questo è il codice sorgente

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; 

e questa è l'uscita

enter image description here

+0

Ben fatto, RRUZ. Ottima risposta, più codice di esempio, e mostra la cattura dello schermo del risultato. Grazie! – RobertFrank

9

È possibile farlo con un modello, ma questo porta alle finestre di dialogo legacy in Vista/7. Su quelle piattaforme dovresti fare uso di IFileDialogCustomize. Naturalmente per supportare XP è necessario implementare anche l'approccio del template.

Problemi correlati