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

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

Notapor gustavodiaz00 » Mar Dic 05, 2017 2:49 am

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   Expandir vistaContraer vista
Mouse = CreateUnoListener( "MenuClick_", "com.sun.star.awt.XMouseListener" )


Código: Seleccionar todo   Expandir vistaContraer vista
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   Expandir vistaContraer vista
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) 49 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 5.3.5.2 en opensuse leap 42.3
Avatar de Usuario
gustavodiaz00
 
Mensajes: 43
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

Notapor gustavodiaz00 » Sab Dic 16, 2017 6:36 am

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   Expandir vistaContraer vista
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) 58 veces
LibreOffice 5.3.5.2 en opensuse leap 42.3
Avatar de Usuario
gustavodiaz00
 
Mensajes: 43
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 dial

Notapor fornelasa » Dom Dic 17, 2017 8:40 pm

Excelente Gustavo ..... gracias por compartirlo :bravo:
Saludos.
lo 6.0.6 | aoo 4.1.5 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3062
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

Notapor arivas_2005 » Mié Dic 20, 2017 10:39 pm

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) 45 veces
Libreoffice 4.7
Puppy slacko 6 y windows 7
arivas_2005
 
Mensajes: 126
Registrado: Mié Nov 16, 2011 6:01 pm

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

Notapor fornelasa » Jue Dic 21, 2017 1:06 am

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) 45 veces
lo 6.0.6 | aoo 4.1.5 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3062
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

Notapor gustavodiaz00 » Jue Dic 21, 2017 4:04 pm

Hola Arivas

Trate de seguir el razonamiento de tu codigo y con algunas modificaciones yo lo entendí así.



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 5.3.5.2 en opensuse leap 42.3
Avatar de Usuario
gustavodiaz00
 
Mensajes: 43
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

Notapor arivas_2005 » Jue Dic 21, 2017 5:41 pm

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

Código: Seleccionar todo   Expandir vistaContraer vista
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   Expandir vistaContraer vista
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
arivas_2005
 
Mensajes: 126
Registrado: Mié Nov 16, 2011 6:01 pm

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

Notapor gustavodiaz00 » Vie Dic 22, 2017 6:42 am

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 5.3.5.2 en opensuse leap 42.3
Avatar de Usuario
gustavodiaz00
 
Mensajes: 43
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

Notapor arivas_2005 » Vie Dic 22, 2017 4:49 pm

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   Expandir vistaContraer vista
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) 33 veces
Libreoffice 4.7
Puppy slacko 6 y windows 7
arivas_2005
 
Mensajes: 126
Registrado: Mié Nov 16, 2011 6:01 pm

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

Notapor fornelasa » Vie Dic 22, 2017 7:20 pm

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) 47 veces
lo 6.0.6 | aoo 4.1.5 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3062
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

Notapor gustavodiaz00 » Sab Dic 23, 2017 5:33 am

Exelente Federico :bravo:

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

gracias por compartir.

Saludos.
LibreOffice 5.3.5.2 en opensuse leap 42.3
Avatar de Usuario
gustavodiaz00
 
Mensajes: 43
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

Notapor arivas_2005 » Sab Dic 23, 2017 9:16 pm

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   Expandir vistaContraer vista
' 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   Expandir vistaContraer vista
' 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   Expandir vistaContraer vista
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   Expandir vistaContraer vista
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: 126
Registrado: Mié Nov 16, 2011 6:01 pm

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

Notapor arivas_2005 » Jue Ene 04, 2018 9:46 pm

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   Expandir vistaContraer vista
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) 37 veces
Libreoffice 4.7
Puppy slacko 6 y windows 7
arivas_2005
 
Mensajes: 126
Registrado: Mié Nov 16, 2011 6:01 pm


Volver a Macros y API UNO

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados