[RESUELTO]Abrir un formulario con características previas

Discute sobre las herramientas de la base de datos
Responder
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

[RESUELTO]Abrir un formulario con características previas

Mensaje por Longi »

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

    oDoc = Thisdatabasedocument.formdocuments.getbyname("Myform").open 
También podemos de la siguiente manera:

Código: Seleccionar todo

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
FJCC-ES
Mensajes: 873
Registrado: Mié Mar 25, 2009 1:19 am
Ubicación: Colorado, USA

Re: Abrir un formulario con características previas

Mensaje por FJCC-ES »

¿Ha probado usando la función lockControllers()?

Código: Seleccionar todo

ThisComponent.lockControllers()
'Código que cambia la configuración del formulario
ThisComponent.unlockControllers()
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Abrir un formulario con características previas

Mensaje por Longi »

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
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Abrir un formulario con características previas

Mensaje por RMG »

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

'*****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.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Abrir un formulario con características previas

Mensaje por Longi »

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: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Abrir un formulario con características previas

Mensaje por Longi »

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
Responder