Common Dialog

7
COMMON DIALOG 1 Veamos, a través de este ejemplo, cómo podemos utilizar el control ActiveX llamado Common Dialog para realizar dos operaciones de las que permite, aplicadas a Access, y que nos servirán para abrir un archivo y para guardarlo. En cuanto a la acción de abrir un archivo, veremos cómo podemos abrir un documento de texto y pasar su contenido a un textbox de un formulario, así como también cómo podemos abrir una imagen y asignarla a un picturebox. Y en cuando a guardar lo que haremos será guardar en un txt el contenido de lo que tengamos en un cuadro de texto. Dicho lo anterior empecemos con el proceso. CREANDO NUESTRO FORMULARIO FABRIR Vamos a crearnos un formulario en blanco, que guardaremos como FAbrir. En él insertaremos el control ActiveX llamado Common Dialog. Para acceder a este control ActiveX podemos irnos, teniendo un formulario en vista diseño, al grupo de la cinta de opciones llamado “Controles” (Access 2007 y siguientes), y ahí hacer clic sobre la opción “Controles ActiveX”. En la ventana que nos aparecerá seleccionamos “Microsoft Common Dialog Control, versión 6.0 (SP6)”. Si, una vez hecho lo anterior, nos vamos a al editor de VB (VBE) -con Access abierto pulsamos la combinación de teclas ALT+F11-, y abrimos el registro de referencias -Menú Herramientas Referencias... - veremos que se nos ha añadido una referencia del mismo nombre. Este es uno de los controles que nos aparece en el formulario en vista diseño como una especie de “botón cuadrado” y que, sin embargo, cuando situamos el formulario en vista formulario, no nos aparece nada. Es decir, que está ahí, subyacente aunque no lo veamos, y que “gestiona en la sombra” las diferentes opciones que explicaremos a lo largo de este ejemplo. Por cierto, este control no es redimensionable. Sigamos. En nuestro formulario FAbrir insertaremos: Un control Common Dialog, que guardaremos con el nombre de miCDlg 2 Un control imagen, que guardaremos con el nombre de miImg Un control textbox, que guardaremos con el nombre de txtTexto Un botón de comando, que guardaremos con el nombre de cmdAbreImagen Un botón de comando, que guardaremos con el nombre de cmdAbreTexto Cuando insertemos el control imagen nos pedirá qué imagen queremos insertar. Seleccionamos cualquier imagen que tengamos para que se nos cree el PictureBox. A mí me ha quedado una cosa así: 1 La BD de ejemplo os la podéis bajar aquí 2 Para asignar un nombre a un control lo que debemos hacer es sacar las propiedades de ese control e irnos a la Pestaña Otras Nombre. Ahí escribimos el nombre que queramos. 1 Visítame en http://neckkito.siliconproject.com.ar

Transcript of Common Dialog

Page 1: Common Dialog

COMMON DIALOG1

Veamos, a través de este ejemplo, cómo podemos utilizar elcontrol ActiveX llamado Common Dialog para realizar dosoperaciones de las que permite, aplicadas a Access, y quenos servirán para abrir un archivo y para guardarlo.

En cuanto a la acción de abrir un archivo, veremos cómopodemos abrir un documento de texto y pasar su contenidoa un textbox de un formulario, así como también cómopodemos abrir una imagen y asignarla a un picturebox.

Y en cuando a guardar lo que haremos será guardar en un txt el contenido de lo que tengamosen un cuadro de texto.

Dicho lo anterior empecemos con el proceso.

CREANDO NUESTRO FORMULARIO FABRIRVamos a crearnos un formulario en blanco, que guardaremos como FAbrir. En él insertaremosel control ActiveX llamado Common Dialog.

Para acceder a este control ActiveX podemos irnos, teniendo un formulario en vista diseño, algrupo de la cinta de opciones llamado “Controles” (Access 2007 y siguientes), y ahí hacer clicsobre la opción “Controles ActiveX”. En la ventana que nos aparecerá seleccionamos “MicrosoftCommon Dialog Control, versión 6.0 (SP6)”.

Si, una vez hecho lo anterior, nos vamos a al editor de VB (VBE) -con Access abierto pulsamosla combinación de teclas ALT+F11-, y abrimos el registro de referencias -Menú Herramientas →Referencias... - veremos que se nos ha añadido una referencia del mismo nombre.

Este es uno de los controles que nos aparece en el formulario en vista diseño como unaespecie de “botón cuadrado” y que, sin embargo, cuando situamos el formulario en vistaformulario, no nos aparece nada. Es decir, que está ahí, subyacente aunque no lo veamos, yque “gestiona en la sombra” las diferentes opciones que explicaremos a lo largo de esteejemplo. Por cierto, este control no es redimensionable.

Sigamos. En nuestro formulario FAbrir insertaremos:

• Un control Common Dialog, que guardaremos con el nombre de miCDlg2

• Un control imagen, que guardaremos con el nombre de miImg• Un control textbox, que guardaremos con el nombre de txtTexto• Un botón de comando, que guardaremos con el nombre de cmdAbreImagen• Un botón de comando, que guardaremos con el nombre de cmdAbreTexto

Cuando insertemos el control imagen nos pedirá qué imagen queremos insertar. Seleccionamoscualquier imagen que tengamos para que se nos cree el PictureBox.

A mí me ha quedado una cosa así:

1 La BD de ejemplo os la podéis bajar aquí2 Para asignar un nombre a un control lo que debemos hacer es sacar las propiedades de ese control e irnos a la Pestaña Otras →

Nombre. Ahí escribimos el nombre que queramos.

1Visítame en http://neckkito.siliconproject.com.ar

Page 2: Common Dialog

Vamos a ver algunas propiedades y métodos que podemos configurar del Common Dialog através del código, que está ampliamente comentado. Sin embargo, para este epígrafe esimportante saber que, para abrir un archivo, la “palabra mágica” es:

miCDlog.ShowOpen

Así pues asignaremos, a nuestro botón de comando, el siguiente código3:

…Private Sub cmdAbreImagen_Click()On Error Resume Next 'Declaramos las variables Dim miImagen As String 'Configuramos el CommonDialog para abrir un archivo de imagen 'Utilizo algunos valores "exagerados" para que se perciba el efecto más claramente With Me.miCDlg 'Configuramos el título de la caja de diálogo .DialogTitle = "VAMOS... ELIGE UNO!!!!!" 'Configuramos el directorio inicial .InitDir = "C:\Windows" 'Configuramos el filtro de las extensiones .Filter = "Archivos de imagen (*BMP)|*.BMP|Archivos de imagen (*JPG)|*.JPG" 'Configuramos las opciones del cuadro de diálogo manipulando las flags .Flags = cdlOFNLongNames 'Mostramos la opción de ABRIR .ShowOpen End With 'Asignamos el nombre (con la ruta) de la imagen seleccionada miImagen = miCDlg.FileName 'Cargamos la imagen que el usuario haya seleccionado y la asignamos al picturebox Me.miImg.Picture = miImagenEnd Sub…

Fijaos que lo que hacemos en el código, dentro del bloque WITH...END WITH, es

• Configurar el cuadro de diálogo que se nos abrirá• Abrir el cuadro de diálogo

Y dentro de esas configuraciones tenemos:

3 Para generar código debemos sacar las propiedades del control Pestaña Eventos, y nos situamos en la parte “blanca” a la→derecha del evento que queremos programar. Veremos un pequeño botón de puntos suspensivos. Si hacemos clic sobre él nosaparecerá una ventana que nos pedirá qué operación deseamos realizar. Le indicamos que queremos “generar código”.

2Visítame en http://neckkito.siliconproject.com.ar

Page 3: Common Dialog

• Configuramos el título a través de miCDlg.DialogTitle• Configuramos el directorio de inicio a través de miCDlg.InitDir

• Configuramos los filtros de archivo a través demiCDlg.Filter

• Configuramos las flags a través de miCDlg.Flags

Finalmente pronunciamos las palabras mágicas: “ábrete,Sésamo”, o, lo que es lo mismo, miCDlog.ShowOpen.

Y ya tenemos nuestro cuadro de diálogo listo para abrir unaimagen y cambiarla en nuestro formulario

ALGUNAS CONFIGURACIONES MÁSPodríamos configurar algunas opciones más, además de las que ya hemos configurado en elcódigo. Veamos cómo lo podríamos haber escrito:

With miCDlg.DefaultExt = “xxxx” fijaríamos la extensión por defecto para abrir (y también→

guardar) archivos.FileName = “c:\ruta\archivo.extension” fijaríamos el nombre completo del archivo→

que queremos abrir (o guardar).FilterIndex = 2 fijaríamos el índice de los elementos que hemos definido en el filtro.→

Por defecto ese índice, si no decimos nada, es 1End with

Conclusión: que podemos configurar estas opciones a nuestra conveniencia, tanto en la opciónpara abrir un archivo como para guardarlo.

¿QUÉ ES ESTO DE LAS “FLAGS”?En el código anterior hemos manipulado una propiedad llamada “flags” (miCdlg.Flags). Através de dicha manipulación hemos configurado las opciones del cuadro de diálogo que nosaparecía para abrir el archivo.

Hay varias características de ese cuadro de diálogo que podemos manipular; algunas se ven,otras no. Y cuando digo varias me refiero a “muchas”.

Dado que no tendría sentido hacer un ejemplo para todas ellas lo que haré será dejaros aquíuna relación de las mismas y su utilidad todo ello en plan “puramente teórico”. Es algo que nome gusta, pero creo que, si las tenéis aquí, os pueden servir de referencia por si en algúnmomento las necesitáis.

La tabla que os mostraré a continuación está extraída de un “librote” de programación paraVisual Basic 6, cuya reseña bibliográfica4 podéis encontrar en el pie de esta página.

Constante Valor Descripción

cdlOFNAllowMultiselect &H200 Especifica que el cuadro de lista Nombre de archivo permitevarias selecciones

cdlOFNCreatePrompt &H2000 Especifica que el cuadro de diálogo solicita al usuario lacreación de un archivo que no existe actualmente. Estableceautomáticamente los indicadores cdlOFNPathMustExist y

4 Rodríguez Bucarelly, Carlos, Rodríguez Bucarelly, Pablo A. Visual Basic 6.0 Orientado a bases de datos. Segunda Edición. EdiciónDigital. 1998-2008

3Visítame en http://neckkito.siliconproject.com.ar

Page 4: Common Dialog

Constante Valor Descripción

cdlOFNFileMustExist

cdlOFNExplorer &H80000 Usa la plantilla del cuadro de diálogo “Abrir” archivo de tipoexplorador. Funciona en Windows 95 y Windows NT 4.0

cdlOFNExtensionDifferent &H400 Indica que la extensión del nombre de archivo devuelto esdistinta de la extensión especificada por la propiedadDefaultExt. Este indicador no está definido si la propiedadDefaultExt es NULL, si las extensiones coinciden o si elarchivo no tiene extensión. El valor de este indicador se puedecomprobar después de cerrar el cuadro de diálogo

cdlOFNFileMustExist &H1000 Especifica que el usuario sólo puede introducir nombres dearchivos existentes en el cuadro de texto “Nombre de archivo”.Establece automáticamente el indicadorcdlOFNPathMustExist

cdlOFNHelpButton &H10 Hace que el cuadro de diálogo presente el botón “Ayuda”

cdlOFNHideReadOnly &H4 Oculta la casilla de verificación “Sólo lectura”

cdlOFNLongNames &H200000 Usa nombres de archivos largos

cdlOFNNoChangeDir &H8 Hace que el cuadro de diálogo restablezca como directorioactual el que lo era en el momento de abrirse el cuadro dediálogo

cdlOFNNoDereferenceLinks &H100000 No resuelve la referencia en vínculos del sistema (accesosdirectos). De forma predeterminada la elección de un vínculohace que el sistema resuelva la referencia que contiene.

cdlOFNNoLongNames &H40000 No utiliza nombres de archivo largos

cdlOFNNoReadOnlyReturn &H8000 Especifica que el archivo devuelto no tendrá establecido elatributo de “Sólo lectura” y no estará en un directorioprotegido contra escritura

cdlOFNNoValidate &H100 Especifica que el cuadro de diálogo común permite caracteresno válidos en el nombre de archivo devuelto

cdlOFNOverwritePrompt &H2 Hace que el cuadro de diálogo “Guardar como” genere uncuadro de mensajes si el archivo seleccionado ya existe. Elusuario tiene que confirmar si desea sobrescribir el archivo

cdlOFNPathMustExist &H800 Especifica que el usuario sólo puede escribir rutas de accesoválidas. Si este indicador está activado y el usuario escribe unaruta no válida se mostrará un mensaje de advertencia

cdlOFNReadOnly &H1 Hace que la casilla de verificación “Sólo lectura” esté activadainicialmente cuando se crea el cuadro de diálogo. Esteindicador también indica el estado de dicha casilla deverificación cuando se cierra el cuadro de diálogo

cdlOFNShareAware &H4000 Especifica que se pasarán por alto los errores de violación alcompartir.

SEGUIMOS CON LA APERTURA DEL ARCHIVO DE TEXTOLa configuración del código para abrir un archivo de texto tiene muchas similitudes con el

4Visítame en http://neckkito.siliconproject.com.ar

Page 5: Common Dialog

código anterior, pero, evidentemente, al final la mecánica difiere un poco simplemente portratarse de un archivo de texto. Veamos cómo sería ese código que, recordemos, debemosasignar al evento “Al hacer clic” de cmdAbreTexto:

…Private Sub cmdAbreTexto_Click()On Error GoTo sol_err 'Declaramos las variables Dim miTexto As String, unaLinea As String Dim rutaTexto As String 'Configuramos el CommonDialog para abrir un archivo de texto With Me.miCDlg 'Configuramos el título de la caja de diálogo .DialogTitle = "VAMOS... ELIGE ESE PEQUEÑO BLOC DE NOTAS!!!!!"

'Configuramos el directorio inicial .InitDir = "C:\Windows" 'Configuramos el filtro de las extensiones .Filter = "Archivos de texto (*txt)|*.TXT" 'Configuramos las opciones del cuadro de diálogo manipulando las flags .Flags = cdlOFNLongNames .Flags = cdlOFNHideReadOnly 'Mostramos la opción de ABRIR .ShowOpen End With 'Cargamos la ruta del texto, con nombre de archivo y extensión rutaTexto = miCDlg.FileName 'Abrimos el txt y leemos las líneas hasta el final (EOF) Open Me.miCDlg.FileName For Input As #1 Do While Not EOF(1) Input #1, unaLinea 'Guardamos los contenidos de la línea miTexto = miTexto & unaLinea & vbCrLf Loop 'Cerramos Close 'Modificamos miTexto para añadirle la información del archivo miTexto = miTexto & vbCrLf & "Extraído de: " & rutaTexto 'Asignamos su valor al textbox Me.txtTexto.Value = miTextoSalida: Exit Subsol_err: If Err.Number = 75 Then MsgBox "Canceló la apertura del archivo", vbExclamation, "CANCELADO" Else MsgBox "Se ha producido el error " & Err.Number & " - " & Err.Description End If Resume SalidaEnd Sub...

He añadido dos manipulaciones de flags para que veáis que se pueden gestionar todas las quenos interesen.

Por otra parte podéis ver en el código algo que no debe confundirnos: una cosa es la ruta delarchivo (con nombre y extensión), dato al cual se accede a través de ( rutaTexto =

miCDlg.FileName), y otra cosa es el contenido del archivo, para lo cual debemos utilizar el bloque

…Open Me.miCDlg.FileName For Input As #1 Do While Not EOF(1) Input #1, unaLinea 'Guardamos los contenidos de la línea miTexto = miTexto & unaLinea & vbCrLf Loop 'Cerramos Close

5Visítame en http://neckkito.siliconproject.com.ar

Page 6: Common Dialog

Finalmente comentaros que, como podéis ver, he añadidoun control de errores para gestionar el error número 75,que es el que se produce cuando cancelamos la aperturadel archivo.

COMMON DIALOG: GUARDARVeamos cómo podemos utilizar el cuadro de diálogo paraguardar el contenido de un textbox de nuestra BD en unbloc de notas.

Así como la “palabra mágica” del epígrafe anterior era “ShowOpen”, en este caso, paraguardar, utilizaremos “ShowSave”.

Para otro tipo de elementos, y hablando exclusivamente de Access, esta acción no la veo,personalmente, excesivamente útil, dado que Access nos proporciona suficientes elementoscomo para exportar a un fichero los objetos que nos interesen. Pero, dado que estamosanalizando el Common Dialog, veremos cómo “hacerlo funcionar” para este caso concreto deguardar un txt.

Vamos a crearnos un formulario en blanco que guardaremos con el nombre de FGuardar. En élvamos a insertar dos controles:

Un cuadro de texto, que llamaremos txtDatos.Un botón de comando, que llamaremos cmdGuardarTexto

Evidentemente insertaremos el control ActiveX Common Dialog, al que le pondremos denombre miCDlg.

Más o menos así:

Al botón que nos guardará el texto que hayamos escrito, en su evento “Al hacer clic”, legeneramos el siguiente código:

…Private Sub cmdGuardarTexto_Click() 'Declaramos las variables Dim miTexto As String 'Cogemos el valor introducido en el textbox miTexto = Nz(Me.txtDatos.Value, "")

6Visítame en http://neckkito.siliconproject.com.ar

Page 7: Common Dialog

'Si no se ha escrito nada avisamos y salimos If miTexto = "" Then MsgBox "Debe escribir 'algo' para poder guardarlo", vbExclamation, "CUIDADÍN!!!" Exit Sub End If

'Configuramos el Common Dialog With Me.miCDlg 'Configuramos el título del cuadro de diálogo .DialogTitle = "¿Qué nombre le ponemos al archivo de texto?" 'Configuramos el directorio inicial .InitDir = "C:\WINDOWS" 'Configuramos la extensión por defecto para guardar .DefaultExt = "txt" 'Configuramos los filtros .Filter = "Archivos de texto (txt)|*.txt"

'Ocultamos la casilla de verificación de sólo lectura .Flags = cdlOFNHideReadOnly 'Abrimos el cuadro de diálogo .ShowSave End With 'Si el usuario no hubiera escrito ningún nombre de archivo salimos If Me.miCDlg.FileName = "" Then Exit Sub 'Guardamos el texto como un txt Open Me.miCDlg.FileName For Output As #1 'Escribimos el contenido Print #1, miTexto 'Cerramos el archivo Close 'Lanzamos un mensaje de confirmación MsgBox "Su archivo " & Me.miCDlg.FileName & " ha sido guardado con éxito", _ vbExclamation, "CORRECTO"End Sub…

Un par de comentarios sobre el código:

• Si os fijáis el funcionamiento es muy parecido al Common Dialog para abrir un archivo:configuramos las propiedades del Common Dialog con la misma nomenclatura quehemos utilizado para abrir un archivo.

• He añadido una configuración de Flags para que vierais que, teniendo a mano lasconstantes oportunas, no es “tan difícil”... je, je...

• Utilizamos la palabra mágica para abrir el cuadro de diálogo: ShowSave• A continuación simplemente escribimos un archivo txt y le pasamos el contenido de lo

que teníamos escrito en el textbox.

Y con esto y un bizcocho... Como os decía antes Access dispone de diferentes procedimientospara exportar archivos, por no hablar de la automatización, por lo que este punto lo dejamoscasi como anecdótico.

PARA FINALIZAR ESTE EJEMPLOHemos utilizado controles independientes para guardar las imágenes o los contenidos delarchivo de texto, pero podríamos haber utilizado campos vinculados a tablas para almacenaresa información. Lo comento sólo a efectos informativos.

Y poca cosa más que añadir. Espero que este ejemplo os pueda ser útil.

Un saludo, y...

¡suerte!

7Visítame en http://neckkito.siliconproject.com.ar