[RESUELTO]Abrir un formulario con características previas

Discute sobre las herramientas de la base de datos

[RESUELTO]Abrir un formulario con características previas

Notapor Longi » Dom Mar 14, 2021 8:00 pm

Buenas!

No sé si el título es muy explicativo...
Para abrir un formulario, además de mediante un botón, suelo hacerlo por macro con el código siguiente:

Código: Seleccionar todo   Expandir vistaContraer vista
    oDoc = Thisdatabasedocument.formdocuments.getbyname("Myform").open


También podemos de la siguiente manera:

Código: Seleccionar todo   Expandir vistaContraer vista
sub openform_in_designmode_and_add_button
   
    Dim oParms(1) As New com.sun.star.beans.PropertyValue
    oDC = createUnoService("com.sun.star.sdb.DatabaseContext")                              ' Servicio de Base de datos     
    oCon = oDC.getByName(ThisDataBaseDocument.getURL()).getConnection("","")        ' Conexión con la base de destino (la misma que la de origen)
    oDoc = ThisComponent.getformdocuments.getbyname("MyForm")
    oDocname=oDoc.name
      oParms(0).name="OpenMode"
      oParms(0).value="open"
      oParms(1).name="ActiveConnection"
      oParms(1).value=oCon
      oFormDocs = ThisComponent.FormDocuments
      odoc = oFormDocs.loadComponentFromURL(oDocname, "", 0, oParms())

end sub


Bien!,
Tengo un formulario ("MyForm) que después de abrirlo le aplico una macro para quitarle las barras y además otra para maximizar la ventana en la que se encuentra, y otra para ponerse en el último registro.
Al abrirlo hace un baile de pantallazos (más bien parpadeos) que no lo deja ni muy estético ni muy agradable.
Se me ocurrió que si con este segundo método pudiese poner esas características en el array de propiedades, el formulario se abriría con la configuración final directamente y se evitaría tanto parpadeo. Lo que no sé es si se puede añadir las nuevas características al array, ni cómo hacerlo.
¿Alguna idea?

Gracias y un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Longi
 
Mensajes: 726
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Abrir un formulario con características previas

Notapor FJCC-ES » Dom Mar 14, 2021 10:25 pm

¿Ha probado usando la función lockControllers()?
Código: Seleccionar todo   Expandir vistaContraer vista
ThisComponent.lockControllers()
'Código que cambia la configuración del formulario
ThisComponent.unlockControllers()
FJCC-ES
 
Mensajes: 766
Registrado: Mié Mar 25, 2009 1:19 am
Ubicación: Colorado, USA

Re: Abrir un formulario con características previas

Notapor Longi » Lun Mar 15, 2021 11:01 am

Buenas!
Mi desconocimiento de la API es preocupante.....
Lo utilicé y no me resuelve, ya que primero ha de abrirse el formulario, luego bloquear los controles, cargar los datos, etc, y al final, en el formulario, según lo tengo hecho, el efecto es el mismo o prácticamente el mismo que antes.
Uno de los 'parpadeos' (el más abultado) es el correspondiente al tiempo de carga de los datos, y no parece que haya muchas diferencias entre los distintos posibles orígenes de datos. He probado con consulta con un command antes de abrir el formulario (con lo que los datos ya se le dan filtrados) y con un SQL (que refleja exactamente la consulta del command). Ya con tabla y luego aplicar filtro no lo intenté ya que primero hay que abrir, después aplicar el filtro y por último un reload, por lo que tendríamos más saltos.
De todos modos es bueno tener en cuenta el consejo para otros formularios.

Gracias! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Longi
 
Mensajes: 726
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Abrir un formulario con características previas

Notapor RMG » Lun Mar 15, 2021 5:35 pm

Hola longi,

Esto es lo que yo uso y sin problemas de parpadeo, Veras que maximizo en vez de pantalla completa, me gusta poder acceder al resto de aplicaciones. Al final he puesto la de pantalla completa para que te la acoples si lo prefieres. Lo pongo en el evento al cargar el formulario.

Código: Seleccionar todo   Expandir vistaContraer vista
'*****Abre cualquier formulario a traves del Tag del botón
Sub AbrirFormularioStandar(Evento)
   ThisDatabaseDocument.FormDocuments.GetByName(Evento.Source.Model.Tag).Open   
End Sub

'Función para maximizar los formularios, solo Window
Declare Function ShowWindow Lib "user32" (ByVal lHwnd As Long,ByVal lCmdShow As Long) As Boolean

Sub MaximizaFormulario(Frame As Object)'funcion para maximizar el formulario, solo en Windows
'On Error Resume Next
   Dim oConWin As Object
   Dim oHandle
   oConWin = Frame.GetContainerWindow()
   oHandle = oConWin.GetWindowHandle(dimarray(),1)
   ShowWindow(oHandle,3)
End Sub

Sub AlCargarMaximizarForm(Evento As Object)'evento al cargar el formulario para maximizarlo, solo Windows
'On Error Resume Next
   Dim oFrame1 As Object
   Dim oFrame As Object
   Dim Layout As Object
   Dim I As Integer
   Dim strURL As String
   Dim Allowed
   oFrame1=Evento.Source.Parent.Parent.CurrentController.Frame
   MaximizaFormulario(oFrame1)
   
   If IsMissing(Allowed) Or Not IsArray(Allowed) Then Allowed=Array()
   BubbleSort(Allowed)'llamada a la funcion BubbleShort
   oFrame = ThisComponent.CurrentController.Frame
   Layout = oFrame.LayoutManager

   For I = 0 To UBound(Layout.Elements)
      strURL=Layout.Elements(I).ResourceURL
      If BinSearch(strURL,Allowed)>=0 Then 'llamada a la funcion BinSearch
         Layout.showElement(strURL)
      Else
         Layout.hideElement(strURL)
      End If
   Next I
End Sub

'Funciones que eliminan la barra de herramientas
Function BinSearch(Item As String,Items As Variant) As Integer
   Dim Low As Integer
   Dim High As Integer
   Dim N As Integer
   Dim Middle As Integer
   BinSearch = -1
   N=UBound(Items)+1
   If N <=1 Then Exit Function
   Low = 0
   High = N-1
   While(Low<=High)
      Middle=(Low+High)/2
      If Items(Middle) > Item Then
         High = Middle-1
      ElseIf Items(Middle) < Item Then
         Low = Middle+1
      Else
         BinSearch=Middle : Exit Function      
      End If
   Wend
End Function

Function BubbleSort(Items As Variant) As Boolean
   Dim I As Integer
   Dim J As Integer
   Dim Tmp As Variant
   For I = 0 To UBound(Items)
      For J=UBound(Items) To I+1 Step -1
         If Items(J-1) > Items(J) Then
            Tmp=Items(J-1)
            Items(J-1)=Items(J)
            Items(J)=Tmp
         End If
      Next J
   Next I
End Function

'************ MACRO PARA ESTABLECER LA PANTALLA COMPLETA *************
Sub PantallaCompleta(Event As Object)'Evento al cargar
   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



Saludos
OpenOffice 4.1.9 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
RMG
 
Mensajes: 3811
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Abrir un formulario con características previas

Notapor Longi » Lun Mar 15, 2021 11:28 pm

Buenas!
El conjunto de código que pones ya lo utilicé en alguna ocasión, y tiene pinta de ir algo más rápido de lo que tengo implementado en este momento, pero, si el formulario en vista diseño lo dejas con tamaño a media pantalla (por ejemplo) inevitablemente hay un 'parpadeo' hasta que se pone a pantalla maximizada, y lo mismo pasa con la eliminación de las barras.
Si se pudiese hacer lo que comenté no habría esos saltos, ya que el formulario saldría en pantalla con todas las características cargadas previamente a abrirlo.
Quizá según está la API no sea posible, pero si es así quizá sería una mejora a proponer, aunque ya sé que desarrolladores de base no hay ni en AOo ni en LOo....
¿Qué le vamos a hacer?

Gracias por el aporte!

Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Longi
 
Mensajes: 726
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Abrir un formulario con características previas

Notapor Longi » Mar Mar 16, 2021 6:22 pm

Gracias por los aportes.
Los parpadeos los he conseguido reducir a la mitad (no eliminarlos) ya que después de revisar el código he encontrado un fallo de primero de primaria que hacía que todo fuese bastante peor de como debía.
De todos modos la pregunta inicial seguiría siendo una posibilidad de mejora. En realidad en accees los formularios tienen unas características (en ocasiones demasiadas) en el modo de diseño que termina siendo lo que yo estaba preguntando/pidiendo.
Lo dejaré como resuelto.

Muchas gracias y un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Longi
 
Mensajes: 726
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España


Volver a Base

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron