Metodo InsertByName en UnoControlTabPage no funciona

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...

Metodo InsertByName en UnoControlTabPage no funciona

Notapor gustavodiaz00 » Vie Jul 14, 2017 1:25 am

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   Expandir vistaContraer vista
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   Expandir vistaContraer vista
    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.
Openoffice 4.1.3 en opensuse leap 42.2
Avatar de Usuario
gustavodiaz00
 
Mensajes: 19
Registrado: Mié Abr 26, 2017 1:29 am

Re: Metodo InsertByName en UnoControlTabPage no funciona

Notapor mauricio » Sab Jul 15, 2017 8:09 pm

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
AOO 4.1 | LibO 5.0 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5178
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: México, D.F.

Re: Metodo InsertByName en UnoControlTabPage no funciona

Notapor mauricio » Sab Jul 15, 2017 8:50 pm

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
AOO 4.1 | LibO 5.0 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5178
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: México, D.F.

Re: Metodo InsertByName en UnoControlTabPage no funciona

Notapor gustavodiaz00 » Sab Jul 15, 2017 9:40 pm

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.
Openoffice 4.1.3 en opensuse leap 42.2
Avatar de Usuario
gustavodiaz00
 
Mensajes: 19
Registrado: Mié Abr 26, 2017 1:29 am

Re: Metodo InsertByName en UnoControlTabPage no funciona

Notapor gustavodiaz00 » Sab Jul 15, 2017 11:45 pm

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

Código: Seleccionar todo   Expandir vistaContraer vista
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   Expandir vistaContraer vista
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) 4 veces
Openoffice 4.1.3 en opensuse leap 42.2
Avatar de Usuario
gustavodiaz00
 
Mensajes: 19
Registrado: Mié Abr 26, 2017 1:29 am

Re: Metodo InsertByName en UnoControlTabPage no funciona

Notapor gustavodiaz00 » Sab Jul 15, 2017 11:46 pm

si encuentran una mejor solución acepto sugerencias.
Openoffice 4.1.3 en opensuse leap 42.2
Avatar de Usuario
gustavodiaz00
 
Mensajes: 19
Registrado: Mié Abr 26, 2017 1:29 am

Re: Metodo InsertByName en UnoControlTabPage no funciona

Notapor mauricio » Vie Jul 21, 2017 4:18 pm

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
AOO 4.1 | LibO 5.0 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5178
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: México, D.F.


Volver a Macros y API UNO

¿Quién está conectado?

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