Modo administración

Forastero en Tierra Extraña

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.lss

Parece 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 :

Captura aspecto formulario 'Dialogos'

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






 







 




 
 
Licencia de Creative Commons

Este artículo está bajo una licencia de Creative Commons.
Comentarios deshabilitados