divendres, 13 d’agost del 2010

obrir, tancar i maximitzar formularis a OpenOffice.org Base / 05 agost 2010

obrir, tancar i maximitzar formularis a OpenOffice.org Base

Una possibilitat a l'hora de realitzar una aplicació d'escriptori amb eines de  programari lliure que involucri una base de dades pot ser ser OpenOffice.org . En particular, OpenOffice.org Base.

Ara bé, quan hom es posa a treballar amb Base, sobretot si abans ha realitzat aplicacions d'escriptori amb Access troba immediatament diferències entre ambdós entorns. I certes coses que són molt fàcils de fer amb Access, són més complicades amb Base o, no es poden fer si es treballa amb el Basic com llenguatge de desenvolupament.

Certament, per no endur-se un disgust, cal tenir ben present que és el que es pot fer i el que no es pot fer amb l'OpenOffice.org.

Algunes de les tasques que podem esperar a l'hora de desenvolupar una aplicació amb OpenOffice.org és que calgui treballar amb formularis.  En general, una aplicació qualsevol consisteix en un conjunt de formularis que interaccionen amb la base de dades, o entre ells i la base de dades. Per exemple, els assistents són una seqüència de formularis que es corresponen amb uns estats i que la transició d'un estat inicial a un estat següent depèn de les decisions que es prenen al formulari corresponent a l'estat inicial.

Tot això es pot fer amb OpenOffice.org. Cal tenir en compte, però, que cada formulari (junt amb el seus subformularis) s'obre com finestra independent. També cal tenir en compte que no podrem ocultar els menús estándards de l'OpenOffice.org. En general, en una aplicació feta sobre OpenOffice.org, serà evident per l'aspecte,pels menús, pel look & feel, que allò és OpenOffice.org.

Doncs bé, en el món Access, obrir, tancar, maximitzar un formulari és una cosa que no costa gaire: hi han macros directes del tipus OpenForm, o des del VBA d'Access és tan senzill com indicar el nom del formulari i invocar els mètodes Show,o Close, o Maximize. No té truc.

En canvi, a OpenOffice.org, i això sobta molt, no és tan directe obrir formularis des de l'OOo Basic. I tancar-los o maximitzar-los és realitza amb una invocació més semblant a com ho fa Access, però que, tanmateix, és sorprenent.

Per obrir un formulari, ens caldrà una snippet com el següent:

Sub ObrirForm(sNomForm as String, sBaseDades as String)
    ' variables
    ' necessari una array de propietats de dimensió 2 elements per invocar a loadComponentFromURL
    Dim prProp(1) as New com.sun.star.beans.PropertyValue
    ' objectes per a accedir a compartir la connexió
    Dim oDatabaseContext, oDataSource, oForms, oConnection
   
    ' obté el context de base de dades
    oDatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")

    ' obté  el datasource corresponent a la base se dades
    oDataSource = oDatabaseContext.getByName(sBaseDades)

    ' obté la col·lecció de formularis de la base de dades
    oForms = oDataSource.DataBaseDocument.getFormDocuments

    'obté la connexió
    oConnection=ThisComponent.Parent.DataSource.getConnection("","")

    ' li indica que la connexió és la de la base de dades
    prProp(0).Name = "ActiveConnection"
    prProp(0).Value = oConnection
   
    ' li indica que cal obrir el formulari
    prProp(1).Name = "OpenMode"
    prProp(1).Value = "open"

    '  obre el formulari de nom sNomForm,passant-li connexió activa
    oForms.loadComponentFromURL(sNomForm, "",0,prProp())
end sub



Per tancar el formulari, en canvi, es pot fer així: posem un botó de "tancar formulari", a les propietats del control, en la pestanya general, en la propietat "Acció", trio: "obre el document o la pàgina"; i a la propietat URL ".uno:CloseDoc". no és broma.

I per posar el formulari a pantalla completa? (compte! posar a pantalla completa no és el mateix que maximitzar)
es pot fer associant el següent codi a l'event "en carregar" del formulari

Sub PantallaComplerta(Event As Object)
   Dim oFrame As Object
   Dim oDispatchHelper
   oFrame=Event.Source.Parent.Parent.CurrentController.Frame
   oDispatchHelper=CreateUnoService("com.sun.star.frame.DispatchHelper")
   oDispatchHelper.ExecuteDispatch(oFrame,".uno:FullScreen","",0,Array())
End Sub


I maximitzar? directament no es pot. És degut a que la maximització d'una finestra és una tasca que realitza el gestor de finestres subjacent... i de gestors de finestres en poden haver de diferents a Linux. L'enfocament és diferent. El que es busca és redimensionar i recol·locar la finestra per a fer que ocupi tota la pantalla. Realment no està maximitzat. De moment no poso el codi perquè els que he trobat i estic provant no em convencen.

El que sí que es pot fer, en to cas, és maximitzar el formulari  en mode de disseny eliminant tots els elements, barres d'eines, d'estat... que no vulgui que apareguin en la visualització en mode formulari, i desar. En principi, en obrir el formulari de nou aquest s'obrirà maximitzat i així es mantindrà mentre l'usuari no el desmaximitizi. No és la millor solució, però...

En Windows sí que es diposa d'un snippet per a maximitzar.

Declare Function GetActiveWindow Lib "user32" Alias "GetActiveWindow" () As Long
Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Public Sub GlobMaxWindow()

Dim WinWnd As Long, TytOkna As String
    TytOkna=ThisComponent.CurrentController.Frame.Title
    WinWnd = GetActiveWindow 'get active window handle
    'WinWnd = FindWindow("", TytOkna)' Different function get window handle by Title window

    If WinWnd = 0 Then Exit Sub

    'Show window

    ShowWindow WinWnd, 3 '0-hide, 1-to yor seting size, 2-minimalize, 3-max size
End Sub

Cap comentari:

Publica un comentari a l'entrada