Fichas de Referencia L.O. Basic

Ficha nº 7.
Diálogos

Nivel: Avanzado

Créditos

Autor: Jean-François Nifenecker – jean-francois.nifenecker@laposte.net

Traducción y adaptación: B. Antonio Fernández

Esta ficha de referencia está bajo licencia de CreativeCommons BY-SA v3 (fr) o posterior.: https://creativecommons.org/licenses/by-sa/3.0/fr/

img_FB26207-001

Este documento es una adaptación del documento original, en Francés, que se puede obtener en la Wiki de publicaciones de LibreOffice.

Versión

Fecha

Comentarios

2.0

06/04/2021

Mise en forme

2.0_ES

15/09/2026

Traducción y cambio de formato para esta versión

Somos como enanos a hombros de gigantes. Si alcanzamos a ver más cosas y más lejanas que ellos, no es por la perspicacia de nuestra visión, ni por nuestra grandeza, sino porque son ellos quienes nos elevan. (atribuido a Bernard de Chartres )

Diálogos Basic

Mostrar un mensaje simple

Print "Hola a todo el mundo !" (utilizado para depurar)

Mostrar un mensaje de Información

MsgBox("TextoMensaje"[, CódigoDiálogo[, "Título"]])

Figura 1: Mensajes sencillos

Mensajes sencillos

Mostrar un mensaje y leer la respuesta

Respuesta = MsgBox("TextoMensaje"[, CódigoDiálogo[, "Título"]]) donde:

Respuesta: devuelve un entero según la elección del usuario.
CódigoDiálogo: botones a mostrar + icono + botón predet. ej: (,3+32+256,) o lo mismo (,291,)

Botones a mostrar

 

 

(0) Aceptar

(1) Aceptar, Anular

(2) Detener, Reintentar, Ignorar

(3) Sí, No, Cancelar

(4) Si, No

(5) Reintentar, Cancelar

Icono

 

 

(0) ninguno

(16) Alerta

(32) Pregunta

(48) Avertencia

(64) i Información

Botón predeterminado

 

 

(0) primero

(256) segundo

(512) último

Valores de retorno

 

 

(1) Aceptar

(2) Cancelar

(3) Interrumpir

(4) Reintentar

(5) Ignorar

(6) Si

(7) No

InputBox()

InputBox("Mensaje" [, "Título"[, "Valor predeterminado"]])

Devuelve una cadena de texto, si se cancela devuelve una cadena vacía.

Diálogos de la API

Tipos de diálogo provistos por la API

Selección de archivo:FilePicker

 

com.sun.star.ui.dialogs.FilePicker

Según la configuración de LibreOffice

com.sun.star.ui.dialogs.OfficeFilePicker

Fuerza el estilo de LibreOffice.

com.sun.star.ui.dialogs.SystemFilePicker

Fuerza el estilo del S.O.

Selección de directorio: FolderPicker

 

com.sun.star.ui.dialogs.FolderPicker

Según la configuración

com.sun.star.ui.dialogs.OfficeFolderPicker

Fuerza el estilo de LibreOffice.

com.sun.star.ui.dialogs.SystemFolderPicker

Fuerza el estilo del S.O.

El Objeto FilePicker (o OfficeFilePicker o SystemFilePicker)

oFilePicker = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")

AppendFilter()

(2 argumentos.) appendFilter("NombreLiteral", "*.xyz")
oFilePicker.appendFilter("Documents ODF", "*.odt;*.ods")

CurrentFilter

El filtro predeterm., entre los filtros elegidos por AppendFilter
(nombre litteral) o el filtro elegido por el usuario.

DefaultName

Nombre predeterm. para el archivo a guardar.

DisplayDirectory

El directorion inicial o elegido por el usuario.

Execute

Transfiere el flujo de ejecución al diálogo y provee de un codigo de
retorno (ver constantes de códigos de retorno)

Files(0)

El archivo (en modo único archivo)

getSelectedFiles()

Array de los archivos seleccionados (en modo multiseleccion).

initialize()

Elección del tipo de diálogo (ver constantes de tipo).

Dim FPType(0) As Integer
FPType(0) = 'la constante de tipo
oFilePicker.initialize(FPType())

MultiSelectionMode

Permite (True) o desactiva (False) la selección de varios archivos.
(False es el predeterminado)

Title

El título del diálogo.

Constantes de tipos de FilePicker

com.sun.star.ui.dialogs.TemplateDescription.XXX:

FILEOPEN_SIMPLE

0

Apertura simple.

FILESAVE_SIMPLE

1

Guardado simple.

FILESAVE_AUTOEXTENSION_PASSWORD

2

Guardado: extensión automática + contra.

FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS

3

Guardado: extensión automática + contraseña + opciones filtro.

FILESAVE_AUTOEXTENSION_SELECTION

4

Guardado: extensión automática + selec.

FILESAVE_AUTOEXTENSION_TEMPLATE

5

Guardado: extensión automática + lista «Plantillas».

FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE

6

Apertura: inserción como enlace + previsualizar + plantilla.

FILEOPEN_PLAY

7

Apertura: reproducir.

FILEOPEN_READONLY_VERSION

8

Apertura: sólo lectura + versión.

FILEOPEN_LINK_PREVIEW

9

Apertura: inserción como enlace + previsualizar.

FILESAVE_AUTOEXTENSION

10

Guardado: extensión autom.

FILEOPEN_PREVIEW

11

Apertura: previsualizar.

FILEOPEN_LINK_PLAY

12

Apertura: inserción como enlace + reproducir.

Códigos de retorno

com.sun.star.ui.dialogs.ExecutableDialogResults.XXX

CANCEL

0

Cancelar

OK

1

Aceptar

El objeto FolderPicker (u OfficeFolderPicker o SystemFolderPicker)

oFldrPicker = CreateUnoService("com.sun.star.ui.dialogs.FolderPicker")

Description

Texto de ayuda (sobre el diálogo, en un OfficeFolderPicker, no se ve).

DisplayDirectory

Directorio inicial. (Si no se indica, posible Usuario> Documentos)

Execute

Transfiere el foco al diálogo y provee de un codigo de retorno.

Title

El título del diálogo.

Directory

Elegido por el usuario

Abrir un único archivo (FilePicker)

El ejemplo crea un FilePicker con el tipo predeterminado (FILEOPEN_READONLY_VERSION), inicia el diálogo (propiedades y métodos), lo ejecuta. Lee la respuesta del usuario mediante las propiedades CurrentFilter, DisplayDirectory y Files (array)

Dim oFilePicker As Object, FPTipo(0) As Integer
Dim NombreArchivo As Variant, DirInicio As String
FPTipo(0) = 8 'Con opción solo lectura
 NombreArchivo = ""
 DirInicio = ""
'Iniciación del diálogo FilePicker
 oFilePicker = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
 oFilePicker.Initialize(FPTipo())
 oFilePicker.DisplayDirectory = DirInicio
 oFilePicker.appendFilter("Hojas de cálculo", "*.ods")
 oFilePicker.CurrentFilter = "Hojas de cálculo"
 oFilePicker.Title = "Elige la hoja de cálculo"
'Ejecución y verificación del código de retorno (OK)
 If oFilePicker.execute = com.sun.star.ui.dialogs.ExecutableDialogResults.OK Then
' También su puede usar el código retorno:  If oFilePicker.execute = 1 Then
   NombreArchivo = oFilePicker.Files(0) 'resultado (único archivo)
   Msgbox ("Ha elegido "& Chr(10) & NombreArchivo,0+64+0,"Elección")
 End If

Abrir varios archivos (FilePicker)

Como lo anterior, Iniciar (en modo múltiple oFilePicker.MultiSelectionMode = True y el resultado (un array) se obtiene con oFilePicker.getSelectedFiles() que devuelve la selección efectuada por el usuario.

Guardar un archivo (FilePicker)

Como lo anterior, Iniciar en modo guardar FPTipo(0) =  FILESAVE_XXX y el retorno con un único archivo oFilePicker.Files(0).

Elegir un directorio (FolderPicker)

Crear un FolderPicker, iniciarlo (propiedades y métodos indicados), el retorno (lectura de la elección del usuario) se da en oFoldP.Directory.

Dim oFoldP As Object, NombreDir As String
 NombreDir = ""
 oFoldP = CreateUnoService("com.sun.star.ui.dialogs.FolderPicker")
 oFoldP.DisplayDirectory = ConvertToURL("C:\Ruta\al\Directorio")
 oFoldP.Description = "Seleccione un directorio"
 oFoldP.Title = "Elige el directorio de backup"
 If oFoldP.execute = com.sun.star.ui.dialogs.ExecutableDialogResults.OK Then
   NombreDir = oFoldP.Directory
   Msgbox "Directorio Destino = " & NombreDir
 End If

Diálogos personalizados - Principios

Diálogo Basic = un módulo Diálogo (diseño) + (al menos) un módulo de código

Secuencia de ejecución de un diálogo

Figura 2: Secuencia de ejecución de un diálogo

Secuencia de ejecución de un diálogo

La secuencia de ejecución se muestra en el gráfico:

  1. Creación del diálogo en respuesta a un suceso de la aplicación

  2. Iniciación de los controles desde el contexto de aplicación

  3. Ejecución el diálogo que recibe el flujo de la ejecución

  4. Se muestra en pantalla,

  5. Gestión de los sucesos de los controles del diálogo

  6. Los sucesos provocan el cierre del diálogo (Aceptar, cancelar);

  7. Finalización hacia el contexto aplicativo si es preciso (operaciones)

  8. Destrucción del diálogo y devuelve código a la macro que hace la llamada

Carga de las bibliotecas de diálogos

Modal frente a No modal

Modal

Un diálogo modal toma el control total del teclado, ratón y pantalla en espera de una acción del usuario, la aplicación permanece inaccesible

  • Los diálogos son modales de manera predeterminada.

No modal

Un diálogo no modal no bloquea el acceso a la aplicación.

Ej.: el diálogo Buscar y reemplazar de LibreOffice

  • Cuidado con las ejecuciones múltiples de diálogos no modales, ya que pueden bloquear la aplicación.

Diálogos personalizados comunes (Modales)

Tenemos un módulo de diálogo MiDlg y un módulo de código MiCodigoDlg en la biblioteca MiLibDlg. En una subrutina del módulo de código se crea una instancia de un objeto diálogo (oDlg) a partir del diálogo.

Creación/carga en memoria

  DialogLibraries.loadLibrary("MilibDlg")
 oLib = DialogLibraries.getByName("MiLibDlg")
 oModulo = oLib.getByName("MiDlg")
 oDlg = CreateUnoDialog(oModulo)
 'y ahora se puede manipular oDlg

Sólo Llamada

oDlg.execute

  • El flujo de ejecución se tranfiere al diálogo.

Llamada y comprobación del retono

If oDlg.execute = com.sun.star.ui.dialogs.ExecutableDialogResults.OK Then

Finalización / destrucción del diálogo

oDlg.dispose

Ejemplo recapitulativo (módulo de código)

Sub MostrarDialogo()
 Dim oLib As Object, oModulo As Object, oDlg As Object
 DialogLibraries.loadLibrary("MiLibDlg")
 oLib = DialogLibraries.getByName("MiLibDlg")
 oModulo = oLib.getByName("MiDlg")
 oDlg = CreateUnoDialog(oModulo)
 'IniciarDlg() 'initializar el contenido del diálogo
 If oDlg.execute = com.sun.star.ui.dialogs.ExecutableDialogResults.OK Then
   'FinalizarDlg() 'Hacer algo con los datos obtenidos
 End If
oDlg.dispose
End Sub

Diálogos personalizados no modales

Tenemos un módulo de diálogo MiDlgNM y un módulo de código MiCodigoDlgNM en la biblioteca MiLibDlgNM. En una subrutina del módulo de código se crea una instancia de un objeto diálogo (oDlg) a partir del diálogo.

Aplicar los mismos principios que antes con las sustituciones:

  1. La presentación del diálogo se asegura con oDlg.SetVisible(True) en lugar de oDlg.execute,

  2. Dos variables globales booleanas de control:

  1. las respuestas a los eventos (controles) ponen gMostrar a Falso cierre diálogo.

Presentación del diálogo

oDlg.SetVisible(True)

  • El diálogo se muestra.
    El flujo de ejecución NO se transfiere al diálogo

Ejemplo recapitulativo (módulo de código)

'Control presentación del diálogo, declarado al inicio del módulo!
Dim gMostrar As Boolean
'control de ejecuciones múltiples no deseadas también al inicio
Dim gCorriendo As Boolean

Sub MostrarDialogoNoModal() 'gestiona creacción y presentación. del diálogo
 Dim oBibli As Object, oModulo As Object, oDlg As Object
 
'évitar ejecuciones múltiples
 If Not gCorriendo Then
   
gCorriendo = True : gMostrar = True
   DialogLibraries.loadLibrary("MiLibDlgNM")
   oBibli = DialogLibraries.getByName("MiLibDlgNM")
   oModulo = oLib.getByName("MiDlgNM")
   oDlg = CreateUnoDialog(oModulo)
'IniciarDlg() 'iniciar el contenido del diálogo
'Mostrar el diálogo mientras que gMostrar sea True
   Do While gMostrar = True
     Wait 20  'permite la ejecución de otros programas
     oDlg.SetVisible(True)  'mantenerlo en pantalla
   Loop
   'FinalizarDlg() 'hacer algo con los datos obtenidos si es preciso
   oDlg.dispose
   gCorriendo = False
 End If
End Sub 'MostrarDialogoNoModal

Sub AlPulsarAceptar(ByRef pEvt As Object)
' Instrucciones tras la Réspuesta a un clic en Aceptar
'realizar las acciones necesarias y
  'Finalizar con :
 gMostrar = False  '=> fin del bucle while y por consiguiente cierre del diálogo
End Sub 'OnBtnOKClick

Asociar un suceso con una macro

Nuestro diálogo se comunica con la aplicación a través de los sucesos ( del esquema). Habrá que crear entonces las macros que respondan a los sucesos (extracto de Guía ref. n.o 4):

  1. Creamos la macro a ejecutar siguiendo el modelo:

Sub NombreDeLaMacro()

End Sub

La Subrutina puede incluir un parámetro Ver abajo «Obtener informaciones...»,

  1. seleccionamos el objeto que va a interceptar el evento.

  2. Accedemos a su configuración (método variable según el objeto),

  3. elegimos el suceso a interceptar,

  4. Asignamos la macro a ejecutar en el desplegable del suceso (punto 1.).

Obtener informaciones sobre el evento desencadenante

La macro de procesamiento puede consultar el parámetro que recibe para obtener las informaciones complementarias sobre el evento:

Sub RespuestaEvento(ByRef Evento As Object)
End Sub

La estructura y las propiedades del objeto Evento dependerán del tipo de evento que desencadene la llamada al procedimiento

Información de los controles

Para acceder a

Consulta

(Objeto) control que hace la llamada

Event.Source

(Objeto) modelo del control

Event.Source.Model

(Objeto) diálogo contenedor del control

Event.Source.Context

Iniciación y finalización

Iniciación

( en el esquema) El diálogo necesita a menudo informaciones procedentes del contexto de ejecución. La macro de iniciación configura el diálogo a partir de sus datos.

Finalización

( en el esquema) Este proceso implica realizar la operación inversa a la anterior: actualizar los datos contextuales a partir de los ingresados o elegidos en el diálogo

Gestión de los módulos de diálogo

LibreOffice gestiona los módulos de diálogo independientemente del código (Guía de referencia. n.o 1). Es posible copiar estos objetos de un documento a otro.

Copiar un módulo de diálogo de una biblioteca a otra

(en el mismo documento o entre documentos / contenedores)

En el IDE, abrimos los dos documentos/contenedores origen y destino.

Abrimos el Organizador de macros (botón img_FB26207-004), pestaña Diálogos, arrastramos y soltamos desde el origen al destino.

Guardar una copia de un módulo de diálogo

  1. En el IDE, abrimos el módulo Diálogo que queremos guardar.

  2. Pulsamos el botón img_FB26207-005 Exportar diálogo en la barra de herramientas.

  3. Asignamos un nombre al archivo y lo guardamos.

El documento se guarda en formato XML y con la extensión .xdl.

Contenido