Página 1 de 1

[RESUELTO] InsertByName en UnoControlTabPage no funciona

NotaPublicado: Vie Jul 14, 2017 1:25 am
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   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.

Re: Metodo InsertByName en UnoControlTabPage no funciona

NotaPublicado: Sab Jul 15, 2017 8:09 pm
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

Re: Metodo InsertByName en UnoControlTabPage no funciona

NotaPublicado: Sab Jul 15, 2017 8:50 pm
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

Re: Metodo InsertByName en UnoControlTabPage no funciona

NotaPublicado: Sab Jul 15, 2017 9:40 pm
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.

Re: Metodo InsertByName en UnoControlTabPage no funciona

NotaPublicado: Sab Jul 15, 2017 11:45 pm
por gustavodiaz00
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

Re: Metodo InsertByName en UnoControlTabPage no funciona

NotaPublicado: Sab Jul 15, 2017 11:46 pm
por gustavodiaz00
si encuentran una mejor solución acepto sugerencias.

Re: Metodo InsertByName en UnoControlTabPage no funciona

NotaPublicado: Vie Jul 21, 2017 4:18 pm
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