2011-05-07 8 views
10

Quiero agregar una casilla de verificación u otro componente de VCL al TSaveDialog.Cómo agregar una casilla de verificación a TSaveDialog en Delphi 2010

Cantu dice,

El nuevo Vista Abrir y cuadros de diálogo Guardar (implementado por el IFileOpenDialog y
interfaces de IFileSaveDialog) se asignan directamente por la nueva FileOpenDialog y
componentes FileSaveDialog, sino también el estándar OpenDialog y el componente SaveDialog usa
el nuevo estilo cuando se establece el conjunto global UseLatestCommonDialogs.

que no tienen idea de lo que eso significa (que nunca he hecho ningún tipo de programación de interfaz ...)

Y no quiero utilizar herramientas de terceros.

Lo vi sugerido en una búsqueda web ahora que miro el código TOpenPictureDialog y lo copio.

Antes de probar cualquiera de las rutas, pensé en pedir aquí una guía. ¿Alguna sugerencia sobre una solución de XP a Win7 para agregar una casilla de verificación a un cuadro de diálogo Abrir archivo moderno en una versión independiente de Windows?

Tom

Respuesta

14

Robert, puede hacerlo utilizando una plantilla de diálogo.

Primero debe almacenar la plantilla como recurso en su aplicación, luego cargar la plantilla usando la estructura TOpenFilename (no se preocupe por el nombre, es lo mismo para abrir y guardar diálogos) y finalmente llamar a la función GetSaveFileName la estructura TOpenFilename.

cheque esta muestra

Crear un archivo de recursos (calledSaveDialog.rc) con la plantilla de diálogo (busque el MyCheckBox añadido)

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 
} 

este es el código fuente

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; 

y esta es la salida

enter image description here

+0

Bien hecho, RRUZ. Gran respuesta, más código de muestra, y muestra la captura de pantalla del resultado. ¡Gracias! – RobertFrank

9

Puede hacerlo con una plantilla, pero esto lleva a los diálogos heredados en Vista/7. En esas plataformas debe hacer uso de IFileDialogCustomize. Por supuesto, para soportar XP necesita implementar el enfoque de plantilla también.

Cuestiones relacionadas