[RESUELTO] InsertByName en UnoControlTabPage no funciona

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] InsertByName en UnoControlTabPage no funciona

Mensaje por gustavodiaz00 »

Hola de nuevo
En el tema anterior que publiqué, Ayuda con Listener - En Control TabPage, lo dí por resuelto pero al ejecutarlo en LibreOffice no funciona.
Vuelvo a subir el código

Código: Seleccionar todo

REM  *****  BASIC  *****

Sub tab_1
DialogLibraries.loadLibrary("Standard")

oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oDialogModel = oDialog.getModel()

dim oTabModel as Object   
   oTabModel = oDialogModel.CreateInstance("com.sun.star.awt.tab.UnoControlTabPageContainerModel")
   oTabModel.Name = "Tab"
   oTabModel.PositionX = 6
   oTabModel.PositionY = 20
   oTabModel.Width = 145
   oTabModel.Height = 100
   oTabModel.TabIndex = 2
   oTabModel.border = 1
   oTabModel.Backgroundcolor =  RGB(200,200,250)
   
oDialogModel.insertByName("tab", oTabModel)

dim args()

   args = Array(1)
Dim tabPageModel1 as Object
    tabPageModel1 = oDialogModel.createInstance("com.sun.star.awt.tab.UnoControlTabPageModel")
    tabPageModel1.initialize(args)
    tabPageModel1.Title = "Tab 1"
    tabPageModel1.Name = "Tab1"
    'tabPageModel1.ImageURL = "file:///home/gustavo/Imágenes/logo.png"
   
   args = Array(2)
Dim tabPageModel2 as Object
    tabPageModel2 = oDialogModel.createInstance("com.sun.star.awt.tab.UnoControlTabPageModel")
    tabPageModel2.initialize(args)
    tabPageModel2.Title = "Tab 2"
    tabPageModel2.Name = "Tab2"

oTabModel.insertByIndex(0, tabPageModel1)
oTabModel.insertByIndex(1, tabPageModel2)

Dim oButton As Object

oButton = tabPageModel1.CreateInstance("com.sun.star.awt.UnoControlButtonModel")
          tabPageModel1.PositionX = 20
          tabPageModel1.PositionY = 20
          tabPageModel1.Width = 50
          tabPageModel1.Height = 12
          tabPageModel1.TabIndex = 0


'tabPageModel1.insertByName("Salir", oButton)


oDialog.getControl("tab").ActiveTabPageID = 1

oDialog.execute()
oDialog.dispose()
End Sub
Cuando llega LibreOffice a tabPageModel1.insertByName("Salir", oButton) me pone un error

Error de ejecución de BASIC.
Se ha producido una excepción
Type: com.sun.star.beans.UnknownPropertyException
Message: .

Encontré otro código que hace lo mismo y funciona en LibreOffice pero no funciona en OpenOffice
Usa otras librerias.

Código: Seleccionar todo

    Sub CreateTab2
      dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
      model = dlg.getModel()
     
      tab_model = model.createInstance("com.sun.star.awt.UnoMultiPageModel")
      With tab_model
        .PositionX = 5
        .PositionY = 5
        .Width = 150
        .Height = 110
      End With
     
      model.insertByName("tab", tab_model)
       
      tab1 = dlg.getControl("tab")
     
      Dim args As New com.sun.star.beans.NamedValue
     
      args.Name = "Title"
      args.Value = "Page 1"
      tab1_model = tab1.getModel()
      page_model = tab1_model.createInstance("com.sun.star.awt.UnoPageModel")
      tab1_model.insertByName("page1", page_model)
      n = UBound(tab1_model.getElementNames())
      tab1.setTabProps(n+1, Array(args))
      page_model1 = page_model
     
     
      args.Name = "Title"
      args.Value = "Page 2"
      tab2_model = tab1.getModel()
      page_model = tab2_model.createInstance("com.sun.star.awt.UnoPageModel")
      tab2_model.insertByName("page2", page_model)
      n = UBound(tab2_model.getElementNames())
      tab1.setTabProps(n+1, Array(args))
      page_model2 = page_model
     
     
      btn_model = page_model1.createInstance("com.sun.star.awt.UnoControlButtonModel")
      With btn_model
        .PositionX = 10
        .PositionY = 10
        .Width = 30
        .Height = 15
        .Label = "btn 1"
      End With
      page_model1.insertByName("btn", btn_model)
     
      dlg.execute()
      dlg.dispose()
    End Sub
La pregunta básicamente es si hay alguna forma de modificar el primer código para que funcione indistintamente en cualquiera de las dos suits.

Hay cosas que no entiendo. Este es un foro básicamente de AOOBasic. LOBasic ha realizado bastantes cambios hasta donde yo se.
Pero sobre LO específicamente casi no hay documentación sobre LOBasic y casi todas las referencias vienen a este foro.

Les agradezco eternamente si me pudieran orientar en esto porque estoy desorientado con el error.



Desde ya agradezco cualquier aporte que puedan hacer.
Última edición por gustavodiaz00 el Sab Oct 21, 2017 7:04 am, editado 2 veces en total.
LibreOffice 6.1 en KDE Neon
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Metodo InsertByName en UnoControlTabPage no funciona

Mensaje por mauricio »

MRI (la extensión más valiosa para nosotros los desarrolladores de macros), usa Tabs en su interfaz, y la misma funciona tanto en OpenOffice, como en LibreOffice... a ver si me doy un tiempo para revisarla...

Por otra parte, considera seriamente usar Python en vez de Basic, un experto en Basic, te lo dice.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Metodo InsertByName en UnoControlTabPage no funciona

Mensaje por mauricio »

ya vi el código, si hace una diferencia entre OpenOffice y LibreOffice... ¿algún requerimiento especial para separar o usar en los dos?

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
gustavodiaz00
Mensajes: 64
Registrado: Mié Abr 26, 2017 1:29 am
Ubicación: Argentina, San Nicolás de los Arroyos

Re: Metodo InsertByName en UnoControlTabPage no funciona

Mensaje por gustavodiaz00 »

Gracias Mauricio por tu recomendación. MRI habia visto algo, pero estoy trabajando en una serie de planillas relacionadas entre si indirectamente y lo que me interesa es poder hacer todo el trabajo con las herramientas básicas que trae incorporadas para poder distribuirlo y que funcione sin tener que obligar a instalar ningún complemento extra.

Me falta poco para terminar si puedo resolver esto. Luego empiezo a ver el tema de Python y la conversión del código.

Estoy trabajando en una serie de planillas las cuales describen las operaciones que debe realizar el operario de una línea de producción en su estación de trabajo.
Consta de una planilla principal en la cual se detallan las operaciones en orden de como se beben realizar y por otro lado una serie de planillas aparte que describe el como, donde y porque debe hacer cada operación.
Las vinculo mediante un cuadro de diálogo donde puedo editar todos los datos de la planilla principal o crear una nueva seleccionando las operaciones.
Es una herramienta fundamental para estandarizar y optimizar una línea de producción.

Mas adelante voy a empezar el desarrollo completo con bases de datos, pero para esto voy a necesitar que usar como para poder distribuir y no tener demasiadas complicaciones con la distribución ya que Base no me llama mucho.
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: Metodo InsertByName en UnoControlTabPage no funciona

Mensaje por gustavodiaz00 »

La solución que encontré es un poco rebuscada pero funciona

Código: Seleccionar todo

Sub tab_1
DialogLibraries.loadLibrary("Standard")

oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oDialogModel = oDialog.getModel()

Dim Suit As String

Suit = fsGetSetting("ooName")

Select Case Lcase(Suit) ' openoffice o libreoffice
       Case "libreoffice"
            tabsModel = oDialogModel.createInstance("com.sun.star.awt.UnoMultiPageModel")
                    With tabsModel
                        .PositionX = 5
                        .PositionY = 5
                        .Width = 150
                        .Height = 110
                    End With
     
             oDialogModel.insertByName("tab", tabsModel)
       
             Dim args As New com.sun.star.beans.NamedValue
     
             args.Name = "Title"
             args.Value = "Page 1"
             tab1_model = oDialog.getControl("tab").getModel()
             tabPageModel1 = tab1_model.createInstance("com.sun.star.awt.UnoPageModel")
             tab1_model.insertByName("page1", tabPageModel1)
             n = UBound(tab1_model.getElementNames())
             oDialog.getControl("tab").setTabProps(n+1, Array(args))
             tabPageModel = tabPageModel1
     
     
             args.Name = "Title"
             args.Value = "Page 2"
             tab2_model = oDialog.getControl("tab").getModel()
             tabPageModelb = tab2_model.createInstance("com.sun.star.awt.UnoPageModel")
             tab2_model.insertByName("page2", tabPageModelb)
             n = UBound(tab2_model.getElementNames())
             oDialog.getControl("tab").setTabProps(n+1, Array(args))
             tabPageModel2 = tabPageModelb
             
             oDialog.getControl("tab").activateTab(1)
     
      Case "openoffice"       
	         tabsModel = oDialogModel.CreateInstance("com.sun.star.awt.tab.UnoControlTabPageContainerModel")
	         tabsModel.Name = "Tab"
       	     tabsModel.PositionX = 6
             tabsModel.PositionY = 20
             tabsModel.Width = 145
             tabsModel.Height = 100
             tabsModel.TabIndex = 2
             tabsModel.border = 1
             tabsModel.Backgroundcolor =  RGB(200,200,250)
	
             oDialogModel.insertByName("tab", tabsModel)

             dim args2() 

             args2 = Array(1)
             tabPageModel = oDialogModel.createInstance("com.sun.star.awt.tab.UnoControlTabPageModel")
             tabPageModel.initialize(args2)
             tabPageModel.Title = "Encabezado de planilla"
             tabPageModel.Name = "Tab1"
	
           	 args2 = Array(2)
             tabPageModel2 = oDialogModel.createInstance("com.sun.star.awt.tab.UnoControlTabPageModel")
             tabPageModel2.initialize(args2)
             tabPageModel2.Title = "Datos de los elementos"
             tabPageModel2.Name = "Tab2"

             tabsModel.insertByIndex(0, tabPageModel)
             tabsModel.insertByIndex(1, tabPageModel2)
             
             oDialog.getControl("tab").ActiveTabPageID = 1
      End Select 
      
   btn_model1 = tabPageModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
             With btn_model1
                 .PositionX = 10
                 .PositionY = 10
                 .Width = 30
                 .Height = 15
                 .Label = "btn 1"
             End With       
   btn_model2 = tabPageModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
             With btn_model2
                 .PositionX = 10
                 .PositionY = 10
                 .Width = 30
                 .Height = 15
                 .Label = "btn 2"
             End With                 
          
  tabPageModel.insertByName("Tab 1", btn_model1)
  tabPageModel2.insertByName("Tab 2", btn_model2)
          
oDialog.execute()
oDialog.dispose()
End Sub

Function fsGetSetting(sA)
   GlobalScope.BasicLibraries.LoadLibrary("Tools")
   Dim oProdNameAccess As Object
   oProdNameAccess=GetRegistryKeyContent("org.openoffice.Setup/Product")
    Select Case Lcase(sA)
    Case "language"
      fsGetSetting=GetStarOfficeLocale().language
   Case "country"
      fsGetSetting=GetStarOfficeLocale().country
   Case "ooname"
      fsGetSetting=oProdNameAccess.getByName("ooName")
   Case "ooversion"
      fsGetSetting=oProdNameAccess.getByName("ooSetupVersion")
   Case Else
      fsGetSetting="???"
   End Select
End Function
Con la función

Código: Seleccionar todo

Function fsGetSetting(sA)
   GlobalScope.BasicLibraries.LoadLibrary("Tools")
   Dim oProdNameAccess As Object
   oProdNameAccess=GetRegistryKeyContent("org.openoffice.Setup/Product")
    Select Case Lcase(sA)
    Case "language"
      fsGetSetting=GetStarOfficeLocale().language
   Case "country"
      fsGetSetting=GetStarOfficeLocale().country
   Case "ooname"
      fsGetSetting=oProdNameAccess.getByName("ooName")
   Case "ooversion"
      fsGetSetting=oProdNameAccess.getByName("ooSetupVersion")
   Case Else
      fsGetSetting="???"
   End Select
End Function
Obtengo con que suit estoy trabajando (LibreOffice u OpenOffice)y con un select case defino el ControlTab según corresponda.

Acá dejo el ejemplo completo
Adjuntos
LibreOffice OpenOffice - ControlTabPage.ods
(11.13 KiB) Descargado 170 veces
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: Metodo InsertByName en UnoControlTabPage no funciona

Mensaje por gustavodiaz00 »

si encuentran una mejor solución acepto sugerencias.
LibreOffice 6.1 en KDE Neon
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Metodo InsertByName en UnoControlTabPage no funciona

Mensaje por mauricio »

Por si fuera de interes para los que programan en LibreOffice con Python, he implementado esto en nuestra librería: https://gitlab.com/mauriciobaeza/easy-m ... %C3%A1gina

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Responder