[RESUELTO] Como asignar una macro a un control de un dialogo

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Avatar de Usuario
gustavodiaz00
Mensajes: 64
Registrado: Mié Abr 26, 2017 1:29 am
Ubicación: Argentina, San Nicolás de los Arroyos

[RESUELTO] Como asignar una macro a un control de un dialogo

Mensaje por gustavodiaz00 »

Hola a todos

Esta vez es para pedir ayuda si es posible.

Estaba trabajando en un menú sencillo con algunas etiquetas que voy creando en tiempo real y se me ocurrió que si en vez de usar listener como

Código: Seleccionar todo

Mouse = CreateUnoListener( "MenuClick_", "com.sun.star.awt.XMouseListener" )

Código: Seleccionar todo

Sub MenuClick_mousePressed(oEv)
   Dim Ctrl_Evento as String
   Ctrl_Evento = oEv.Source.Model.Name

   if Ctrl_Evento = "Salir" then 
    Salir
   end if  
 
End Sub
Si habra alguna forma distinta de asignar una macro a un control como se hace desde la GUI o con los Listener. :knock:

Encontre un ejemplo de una funcion que inserta una forma en la hoja y le asigna una macro. Pero este método me parece que solo sirve para el docummento y no funciona con un control de un dialogo.

Código: Seleccionar todo

Sub CreerRectangleAffecterMacro

dim oClasseur as object
dim oPage as object
dim oMonObjet as object
dim sTaille as new com.sun.star.awt.Size
dim sPos as new com.sun.star.awt.Point
dim oEvts as object
dim oEvt(1) as new com.sun.star.beans.PropertyValue

oClasseur = thiscomponent
oPage = oClasseur.sheets.getByName("Sheet1").DrawPage

sTaille.Height =  2310
sTaille.Width = 4620
sPos.X = 3000
sPos.Y = 2310

oMonObjet = oClasseur.createInstance("com.sun.star.drawing.RectangleShape")
oMonObjet.Size = sTaille
oMonObjet.Position = sPos

oPage.add(oMonObjet)

oEvts = oMonObjet.Events                            'accès aux événements disponibles pour cette image
oEvt(0).Name = "EventType"                          'confection d'un tableau de propriété pour décrire la macro
oEvt(0).Value = "Script"                            'qui sera associée à l'événement
oEvt(1).Name = "Script"
oEvt(1).Value = "vnd.sun.star.script:Standard.Module1.Main?language=Basic&location=document"
oEvts.replaceByName("OnClick", oEvt())     'attribution de la macro à l'événement "Clic sur l'objet"

msgbox "Terminé"

End Sub 
La macro crea un rectángulo al cual se le asigna la macro Main del Módulo y ejecuta el diálogo.

Si es posible quisiera que me orienten en como hacer lo mismo con el boton Salir del Diálogo y que ejecute la macro salir.

Les dejo un ejemplo para que lo vean mas claro.
Macro_Para_Asignar_Funciones.ods
(9.78 KiB) Descargado 232 veces
Desde ya les agradezco la ayuda que puedan aportar.
Última edición por fornelasa el Jue Dic 21, 2017 1:21 am, editado 2 veces en total.
Razón: Marcar resuelto correctamente
LibreOffice 6.1 en KDE Neon
Avatar de Usuario
gustavodiaz00
Mensajes: 64
Registrado: Mié Abr 26, 2017 1:29 am
Ubicación: Argentina, San Nicolás de los Arroyos

Re: Como asignar una macro a un control de un dialogo

Mensaje por gustavodiaz00 »

Hola en otro foro encontre una rutina la cual era lo que buscaba.

Hize un par de modificaciones para que funcione como yo quiero

aca les dejo el c'odigo y un ejemplo.

Código: Seleccionar todo

Sub RunDocumentNamedMacro(Libreria as String, Macro As String)
  Dim oDisp 
  Dim sMacroURL As String
  Dim sMacroName As String
  Dim sMacroLocation As String
  Dim oFrame
  Dim Posicion as integer
  Dim IsModulo As Boolean
  Dim Modulo As String
  
  IsModulo = 0
   
  Longitud = len(Macro)
  Posicion = Instr(Macro, ".")
  if Posicion = 0 then
   exit sub
  end if 
  Modulo = left(Macro, posicion-1)
  Rutina = Lcase(Right(Macro, (Longitud-Posicion)))
  
  ' preguntamos si la libreria existe
  ' asignamos la libreria a una variable

  if NOT BasicLibraries.isLibraryLoaded(Libreria) Then
      BasicLibraries.loadLibrary(Libreria)
  End If
  
  oLib = BasicLibraries        ' For Basic libaries
  
  oSrcLib = oLib.getByName( Libreria )
  ' obtenemos el array con los nombres de los modulos
  sSrcModules = oSrcLib.getElementNames()
  
  Dim Texto As String
  
  for iCounter = lBound( sSrcModules() ) to uBound( sSrcModules() ) 
    If sSrcModules(iCounter) = Modulo then
     IsModulo = 1
     exit for
    end if 
  next
 
  if (IsModulo = False ) then 
   Msgbox "Error " & chr(10) & chr(10) & "Sub Rutina no encontrada. Verifique el comando" & chr(10) & _
          "El comando hace diferencias entre mayúsculas y minúsculas" & chr(10) & " " 
   exit sub       
  end if 
  
  oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
  
  sMacroName="vnd.sun.star.script:" & Libreria & "." & Modulo & "." & Rutina
  sMacroLocation="?language=Basic&location=document"
  sMacroURL=sMacroName & sMacroLocation 

  ' Quiero llamar a una macro contenida en ThisComponent, así que
  ' debe usar frame del documento que contiene la macro
  ' como el destinatario del envío.
  
  oFrame=ThisComponent.CurrentController.Frame
  oDisp.executeDispatch(oFrame,sMacroURL,"",0,Array())
  
End Sub
Ejemplo_Creacion_de_un_menu.ods
(15.5 KiB) Descargado 245 veces
LibreOffice 6.1 en KDE Neon
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: [RESUELTO]Como asignar una macro a un control de un dial

Mensaje por fornelasa »

Excelente Gustavo ..... gracias por compartirlo :bravo:
Saludos.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: [RESUELTO]Como asignar una macro a un control de un dial

Mensaje por arivas_2005 »

Saludos
Aprovechando el tema, tengo la inquietud de meter o insertar una macro en un botón de un dialog.
Estoy realizando prueba y error en el archivito siguiente pero no avanzo :crazy: .
Quiero insertarle la macro Salir al botón Salir del dialog.
Adjuntos
Macro_Para_contar_buscar_botones_en_dialog (1).ods
(10.69 KiB) Descargado 190 veces
Libreoffice 4.7
Puppy slacko 6 y windows 7
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: [RESUELTO] Como asignar una macro a un control de un dia

Mensaje por fornelasa »

arivas_2005, en tu caso sería creo más o menos como este ejemplo:
Saludos, Federico..
Adjuntos
AsignarMacroControl (1) (1).ods
Asignar macro
(12.16 KiB) Descargado 204 veces
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
gustavodiaz00
Mensajes: 64
Registrado: Mié Abr 26, 2017 1:29 am
Ubicación: Argentina, San Nicolás de los Arroyos

Re: [RESUELTO] Como asignar una macro a un control de un dia

Mensaje por gustavodiaz00 »

Hola Arivas

Trate de seguir el razonamiento de tu codigo y con algunas modificaciones yo lo entendí así.
Macro_Para_contar_buscar_botones_en_dialog (1).ods
(10.3 KiB) Descargado 191 veces
Recuerda que para asignar una macro por código no es muy complicado usando listener. O por medio del cuadro de diseño del control en la pestaña Sucesos del objeto en cuestion.

En el cuadro de dialogo ya tenías asignado en el boton Salir la sub sali22.

Saludos Gustavo.

PD: Gracias por tu pronta respuesta Federico esto es mas como un hobby para mi porque mi trabajo principal no tiene nada que ver con esto y le dedico parte de mi tiempo libre a tratar de apreender y hacer algo.
LibreOffice 6.1 en KDE Neon
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: [RESUELTO] Como asignar una macro a un control de un dia

Mensaje por arivas_2005 »

Saludos @fornelasa y @gustavodiaz00.
Estaba rayando en la idea del segmento de codigo siguiente:

Código: Seleccionar todo

oPage.add(oMonObjet)

oEvts = oMonObjet.Events                            'accès aux événements disponibles pour cette image
oEvt(0).Name = "EventType"                          'confection d'un tableau de propriété pour décrire la macro
oEvt(0).Value = "Script"                            'qui sera associée à l'événement
oEvt(1).Name = "Script"
oEvt(1).Value = "vnd.sun.star.script:Standard.Module1.Main?language=Basic&location=document"
oEvts.replaceByName("OnClick", oEvt())     'attribution de la macro à l'événement "Clic sur l'objet"

msgbox "Terminé"
Es decir, aplicando la lógica llegué a suponer que si la forma de asignar una macro a un 'botón' (oMonObjet) al momento de crearlo, también podría funcionar en un 'botón' ya creado Y en un dialog. Hoy concluyo que mi lógica no es correcta!

Según el aporte que me ofrece @gustavodiaz00, es por medio de la captura de evento,

Código: Seleccionar todo

Sub MouseClick_mousePressed(oEv)
   Dim Ctrl_Evento as String
   Ctrl_Evento = oEv.Source.Model.Name   
   if Ctrl_Evento = "Salir" then 
     Salir
   end if   
End Sub
Gracias!
Libreoffice 4.7
Puppy slacko 6 y windows 7
Avatar de Usuario
gustavodiaz00
Mensajes: 64
Registrado: Mié Abr 26, 2017 1:29 am
Ubicación: Argentina, San Nicolás de los Arroyos

Re: [RESUELTO] Como asignar una macro a un control de un dia

Mensaje por gustavodiaz00 »

Hola arivas

No he profundizado mucho el tema pero si no me equivoco, el método

oEvts.replaceByName("OnClick", oEvt())

se aplica para formularios en el documento.

Observa el siguiente enlace https://www.openoffice.org/api/docs/com ... vents.html

Saludos.
LibreOffice 6.1 en KDE Neon
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: [RESUELTO] Como asignar una macro a un control de un dia

Mensaje por arivas_2005 »

Saludos

En las pruebas y errores, he logrado insertar la informacion de la macro en el botón, tal como se observa por medio de MRI. Sin embargo, despues de insertada la informacion, el clic sobre el boton no da resultado.

Código: Seleccionar todo

Dim Dlg as object


Sub contando_elementos_en_dialog_0
	Globalscope.BasicLibraries.LoadLibrary( "MRILib" )
    DialogLibraries.LoadLibrary("Standard")
    Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
    Dlg.getPeer().setProperty( "NativeWidgetLook", False )
    dlgmodel = dlg.getModel()
    num_botones =Dlg.Model.ElementNames
'	msgbox UBound(num_botones) + 1
	mensaje = ""
	
	dim boton as object
	dim botonpamacro as object
	
	i = -1	
	For Each elemento in num_botones
		i = i + 1
		boton = Dlg.Model.getByName(elemento)
		tipo = boton.ImplementationName
		nombreboton=boton.name
		if instr(tipo,"ButtonModel")>0 and nombreboton="Salir" then
			botonpamacro=boton
		endif
	Next
    
    dim oEvts as object
    oEvts = botonpamacro.getEvents
    'mri oEvts'.elementnames

	msgbox "Eventos del boton Salir antes : " & ubound(oEvts.elementnames)+1
'		
' ----------  forma 
	 sScriptURL = "vnd.sun.star.script:Standard.Module1.Salir?language=Basic&location=document" 'Was location=application
     aEvent = CreateUnoStruct("com.sun.star.script.ScriptEventDescriptor")
 	 With aEvent
	    .AddListenerParam = ""
	    .EventMethod = "mousePressed"   'mousePressed
	    .ListenerType = "XMouseListener"  ' com.sun.star.awt.XMouseListener
	    .ScriptCode = sScriptURL  'vnd.sun.star.script:Standard.Module1.Salir?language=Basic&location=document
	    .ScriptType = "Script"
	  End With
  			''  com.sun.star.awt.XMouseListener::mousePressed  
  	'oEvts.insertByName("OnClick", aEvent)
  	oEvts.insertByName("mousePressed", aEvent)
	 
    oEvts = botonpamacro.getEvents     
	'mri oEvts.elementnames
	msgbox  "Eventos del boton Salir despues: " & ubound(oEvts.elementnames)+1

	Dlg.execute()
   
End Sub


Sub Salir
	msgbox "El Dialog se cerrará"
 	Dlg.endExecute()
end sub
Macro_Para_contar_buscar_botones_en_dialog (1)0.ods
documento con el codigo y el dialog
(10.48 KiB) Descargado 175 veces
Libreoffice 4.7
Puppy slacko 6 y windows 7
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: [RESUELTO] Como asignar una macro a un control de un dia

Mensaje por fornelasa »

Yo no comprendo el porque no te gusta esta forma de hacerlo:
Saludos, Federico.
Adjuntos
Macro_Para_contar_buscar_botones_en_dialog (1) (6).ods
Asignar macro a control
(11.26 KiB) Descargado 199 veces
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
gustavodiaz00
Mensajes: 64
Registrado: Mié Abr 26, 2017 1:29 am
Ubicación: Argentina, San Nicolás de los Arroyos

Re: [RESUELTO] Como asignar una macro a un control de un dia

Mensaje por gustavodiaz00 »

Exelente Federico :bravo:

He aprehendido otra forma de de ver los controles en un dialogo.

gracias por compartir.

Saludos.
LibreOffice 6.1 en KDE Neon
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: [RESUELTO] Como asignar una macro a un control de un dia

Mensaje por arivas_2005 »

Saludos @fornelasa.
Mis agradecimientos sinceros por el apoyo que ofrece en proponer alternativas y soluciones a los que (como este humilde que escribe), con poca o mucha frecuencia dependemos de este foro para poder completar nuestros micro-proyectos

Sus propuestas que ofrece con el uso de 'oEv.Source.Model.Name ' y la del uso de 'CreateUnoListener("Salir_","com.sun.star.awt.XActionListener")', son geniales y funcionan perfecto
Ahora me explico por la insistencia:
* me llamó la atención esto:
gustavodiaz00 escribió: Si habra alguna forma distinta de asignar una macro a un control como se hace desde la GUI o con los Listener. :knock:
Encontre un ejemplo de una funcion que inserta una forma en la hoja y le asigna una macro. Pero este método me parece que solo sirve para el docummento y no funciona con un control de un dialogo.
Bueno.. es algo asi como una curiosidad obsesiva... que me invadió cuando revisé el codigo de la función de la auforma. A decir; pensé que si con ese código se asigna una macro a la forma u objeto que se crea, entonces debería ser similar el proceso de asignar macro a una autoforma u objeto ya existente(bastaría sólo con localizarlo).
Es obvio que no domino el uso del lenguaje ooobasic más que en lo mínimo y de ahí es que intenté ver si usando lineas similares podía configurarse la macro para un control ya existente, tal como se hace para un control nuevo.

Mostrare mi idea:
fornelasa escribió:Yo no comprendo el porque no te gusta esta forma de hacerlo:
Saludos, Federico.
Si reviso los botones en un dialog, entonces puedo cambiarle las propiedades (alineado)

Código: Seleccionar todo

' seccion de codigo 
aNames =Dlg.Model.ElementNames
	msgbox UBound(aNames)
	For i = 0 to UBound(aNames)
	   Frm = Dlg.Model.getByName(aNames(i))
	   Frm.Align=2  '<-- alineado
	next i
Si creo un boton en el dialog, entonces puedo asignarle la propiedad (alineado)

Código: Seleccionar todo

' seccion de codigo
Function CrearButton ( dialogModel As Object, buttonModel As Object,Nombre As String, PositionX As Integer, PositionY As Integer, Width As Integer, Height As Integer, Label As String, TabIndex As Integer, ToolTip As String) As Object
    buttonModel = dialogModel.CreateInstance("com.sun.star.awt.UnoControlButtonModel")
    buttonModel.Name = "Salir"
    buttonModel.Align =2 '  <-- alineado
En ambos casos puedo aplicar el mismo alineado con el mismo modelo. ( Frm.Align=2 ; boton ya existe. buttonModel.Align =2 boton nuevo )
Entonces... suponia yo... que si al crear un boton se le podia asignar una macro de la misma forma que si ya existia (como el .Align)

Por eso, podría considerarlo como una .... una curiosidad obsesiva... (digo yo-- pero muy didáctica pienso! :oops: ):
-- Continuando con mi explicación: si con este código ....

Código: Seleccionar todo

oPage.add(oMonObjet)
oEvts = oMonObjet.Events                            'accès aux événements disponibles pour cette image
oEvt(0).Name = "EventType"                          'confection d'un tableau de propriété pour décrire la macro
oEvt(0).Value = "Script"                            'qui sera associée à l'événement
oEvt(1).Name = "Script"
oEvt(1).Value = "vnd.sun.star.script:Standard.Module1.Main?language=Basic&location=document"
oEvts.replaceByName("OnClick", oEvt())     'attribution de la macro à l'événement "Clic sur l'objet"
. ..... se asigna una macro a un Object luego de creado, entonces, pos bastaría con identificar el control del boton ya existente en el dialog y meterle la macro, o sea algo asi como lo siguiente

Código: Seleccionar todo

aNames =Dlg.Model.ElementNames
	msgbox UBound(aNames)
	For i = 0 to UBound(aNames)
	   Frm = Dlg.Model.getByName(aNames(i))
           ''oEvts = oMonObjet.Events '-->>  oMonObjet=Frm ''  ji ji ji  
	   'Frm.Align=2
           oEvts = Frm.Events '-->>
          .............
          oEvts.replaceByName("OnClick", oEvt())  ''  ????
	next i
Por el momento, de acuerdo con lo revisado en este hilo, concluyo que mi deducción de asignar macro a un objeto existente se hace de un modo distinto al utilizado cuando se crea. (
Pues, bién!.
Mis respetos @fornelasa. Reiterando mis agradecimientos por su apoyo
Libreoffice 4.7
Puppy slacko 6 y windows 7
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: [RESUELTO] Como asignar una macro a un control de un dia

Mensaje por arivas_2005 »

Saludos a la comunidad "Macros" y a todo el foro. éxitos para el 2018

Les comento que persiste en mi esa curiosidad obsesiva de saber si funciona o no la asignación de macros por código en los botones de un dialog.
pero, intentando usar la misma forma que la de crear el botón y luego asignarle la macro [[ oPage.add(oMonObjet) -->oEvts = oMonObjet.Events: ]]
arivas_2005 escribió:Saludos @fornelasa y @gustavodiaz00.

Código: Seleccionar todo

oPage.add(oMonObjet)
oEvts = oMonObjet.Events                            'accès aux événements disponibles pour cette image
oEvt(0).Name = "EventType"                          'confection d'un tableau de propriété pour décrire la macro
oEvt(0).Value = "Script"                            'qui sera associée à l'événement
oEvt(1).Name = "Script"
oEvt(1).Value = "vnd.sun.star.script:Standard.Module1.Main?language=Basic&location=document"
oEvts.replaceByName("OnClick", oEvt())     'attribution de la macro à l'événement "Clic sur l'objet"
ojala puedan revisar el código del adjunto (intentando usar el modelo oEvts).
Se puede notar que por medio del código sí se inserta una referencia y también se elimina otra referencia. En el posible caso de que vaya por buen camino, entonces faltaria refrescar los cambios (cosa que no me imagino como hacerla).

En el dialogo a la vista, cuando presiona la tecla, se lee el mensaje de la macro asignada manualmente (Mostrar) y la cual fue removida durante el proceso, como se puede notar en la 3ra ventanilla del mri, en la que ya no aparece la referencia al evento keypressed.

MIs agradeciimientos por sus aportes.
Adjuntos
Macro_Para_contar_buscar_botones_en_dialog_2.ods
(10.79 KiB) Descargado 192 veces
Libreoffice 4.7
Puppy slacko 6 y windows 7
Responder