Artículo: Cuadros de diálogo (Parte I) »
JUAN F. RUIZ F. - SEP 16, 2006 (11:26:04 AM)
¿Quién no ha querido alguna vez adecentar una aplicación Notes con cuadros de diálogo?
Aunque Notes nos provee de algunos mediante lenguajes de formula o lotusscript existen algunas carencias que deberemos resolver recurriendo al API de Windows o mediante automatización OLE.
Introducción
Todo el mundo sabe que Notes contiene unas cuantas @fórmulas y métodos en las clases de Notes en LotusScript para tratar con cuadros de diálogo ... pero ... digamos que no son lo flexibles que deberían ser y, en mi caso, no he conseguido seleccionar más de un fichero a la vez.
Tampoco he encontrado ninguna formula, comando o método para mostrar el cuadro de diálogo que te permite seleccionar una carpeta del sistema de ficheros con lo cual debes montarte tu "a mano" ese cuadro de diálogo ...
Buscando en Internet información sobre cómo resolver esto de una manera adecuada me encontré con una aplicación de ejemplo de Jordan Price que llamó "Apigoods" y que vosotros podéis encontrar en la sección "SandBox" de [ Lotus Domino Developer ] donde habla sobre cómo utilizar el API de Windows para poder mostrar los cuadros de diálogo estándar de Windows en nuestras aplicaciones.
La aplicación está muy bien realizada y el código es fácil de entender pero yo lo he retocado un poquito intentando mejorarlo y hacer más amigable su uso aparte de solucionar algún problema con la devolución de resultados de las funciones del API.
Objetivo
Bueno, el objetivo es el siguiente: Definirnos una librería en LotusScript que haciendo llamadas a ciertas funciones del API de Windows y metodos OLE ( eso lo he añadido yo ) conseguir mostrar, configurar y gestionar los resultados de tres cuadros de diálogo estándar de Windows que son :
- Cuadro de diálogo "Abrir".
- Cuadro de diálogo "Salvar".
- Cuadro de diálog "Buscar carpeta".
Haremos una aplicación donde tendremos una librería LS con las funciones necesarias ( y que así podremos reutilizar en otras aplicaciones ) y un formulario donde podremos hacer uso de estos cuadros de diálogo pasándoles parámetros de uso y viendo los resultados que habremos seleccionado en los cuadros de diálogo.
Otro objetivo, implícito en este artículo, es que veais cuál es el procedimiento en Notes y LotusScript para poder utilizar el API de Windows, el cual, tiene sus "peculiaridades" y, si no tenemos cuidado, * mucho peligro * ( A nadie le gusta que, sin haber salvado su trabajo, se le cuelgue el PC, ¿Verdad? ).
Cómo se hace
Bueno, pasamos a explicar cómo se hace. Lo primero, como siempre, es crearse una nueva base de datos, llamadla como queráis y poned como nombre físico el que os guste.
Ahora lo primero que haremos será crearnos una libreria de LotusScript a la que llamaremos "BSDialogos" y que contendrá el código del adjunto :
BSDialogos.lssParece una gran cantidad de líneas pero debéis tener en cuenta que los comentarios engordan bastante el código, sobre todo los comentarios de descripción de cada función.
Como véis, están incluidas las funciones originales de Jordan Price así como las mías, que en el caso de la función DlgAbrirFicheroExt() permite seleccionar más de un fichero.
Por otro lado, se os ofrece dos formas de mostrar el cuadro de diálogo "Buscar Carpetas", una mediante el uso del componente OLE "Shell.Application" en la función DlgBuscaCarpeta() y otra mediante varias llamadas al API de Windows en la función DlgBuscaCarpetaAPI().
Aparte de la librería de lotusscript y para poder realizar las pruebas necesitamos crearnos un formulario al que llamaremos Dialogos y le daremos como nombre de alias FDialogos
Las propiedades del formulario se dejan como están, con los valores por defecto y pasamos a completar el contenido del formulario que nos dejará un aspecto similar al siguiente :
Los campos que posee este formulario se describen a continuación :
- Form : Tipo texto, calculado al crear, Formula de ocultación : @True,Valor : "FDialogos".
- SaveOptions : Tipo texto, calculado al crear, Formula de ocultación : @True, Valor : "0".
- Titulo : Tipo texto, calculado al visualizar, Valor : @RightBack( Form; 1).
- Carpeta : Tipo texto, editable, el resto por defecto.
- CarpetaRaiz : Tipo texto, editable, el resto por defecto.
- Filtros : Tipo texto, editable, el resto por defecto.
- ExtensionPorDefecto : Tipo texto, editable, el resto por defecto.
- TituloDialogo : Tipo texto, editable, el resto por defecto.
- Fichero : Tipo texto, editable, Permitir varios valores, Separador usado al introducir datos : Coma, punto y coma, nueva línea. Separador usado al visualizar datos : Nueva línea.
Por supuesto, no he indicado ningún valor para las pestañas "Fuentes", "Alineación del párrafo" y "HTML extra del campo" porque éstas dependen del gusto de cada cual y no influyen en la funcionalidad del ejemplo.
En cuanto a los botones el código de cada uno de ellos viene indicado a continuación :
- "Seleccionar carpeta" :
Use "BSDialogos"
Sub Click(Source As Button)
Dim nwrk As New notesuiworkspace
Dim cpath As String
If nwrk.currentdocument.editmode = False Then
nwrk.currentdocument.editmode = True
End If
cpath = DlgBuscaCarpeta()
cpath = Trim(cpath)
nwrk.currentdocument.fieldsettext "Carpeta",cpath
End Sub
- "Abrir fichero" :
Use "BSDialogos"
Sub Click(Source As Button)
Dim nwrk As New notesuiworkspace
Dim nuid As notesuidocument
Dim ndoc As notesdocument
Dim nite As notesitem
Dim cCarpetaRaiz As String
Dim cFiltros As String
Dim cExtDef As String
Dim cTitDlg As String
Dim cFichero As String
Dim iCon As Integer
Set nuid = nwrk.currentdocument
Set ndoc = nuid.document
' Borramos el contenido que pudiera tener el campo
nuid.fieldsettext "Fichero",""
If ndoc.hasitem("Fichero") Then
Set nite = ndoc.getfirstitem("Fichero")
Set nite = ndoc.replaceitemvalue( "Fichero","")
Else
Set nite = ndoc.replaceitemvalue( "Fichero","")
End If
cCarpetaRaiz = nuid.fieldgettext("CarpetaRaiz")
cFiltros = nuid.fieldgettext("Filtros")
cExtDef = nuid.fieldgettext("ExtensionPorDefecto")
cTitDlg = nuid.fieldgettext("TituloDialogo")
cFichero = DlgAbrirFicheroExt(cCarpetaRaiz, "", cFiltros,cExtDef, cTitDlg)
If Not cFichero = "{%Err%}" Then
' Recorremos el vector en busca de nombres de fichero ...
For iCon = 0 To Ubound( acFicheros )
If acFicheros( iCon ) <> "" Then
' Lo añadimos al campo Ficheros del
' documento en pantalla
nite.Appendtotextlist(acFicheros( iCon ))
Else
' Ya no hay mas ficheros ...
Exit For
End If
Next
End If
End Sub
- "Salvar fichero" :
Use "BSDialogos"
Sub Click(Source As Button)
Dim nwrk As New notesuiworkspace
Dim nuid As notesuidocument
Dim cCarpetaRaiz As String
Dim cFiltros As String
Dim cExtDef As String
Dim cTitDlg As String
Dim cFichero As String
Set nuid = nwrk.currentdocument
cCarpetaRaiz = nuid.fieldgettext("CarpetaRaiz")
cFiltros = nuid.fieldgettext("Filtros")
cExtDef = nuid.fieldgettext("ExtensionPorDefecto")
cTitDlg = nuid.fieldgettext("TituloDialogo")
' Borramos el contenido que pudiera tener el campo
nuid.fieldsettext "Fichero",""
cFichero = DlgSalvarFichero(cCarpetaRaiz, "", cFiltros,cExtDef, cTitDlg)
If Not cFichero = "{%Err%}" Then
nuid.fieldsettext "Fichero",cFichero
End If
End Sub



