[RESUELTO] Obtener medida pantalla completa

Discute sobre las herramientas de la base de datos
Responder
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

[RESUELTO] Obtener medida pantalla completa

Mensaje por RMG »

Hola,

Es posible obtener las medidas al ejecutar una macro que pone un formulario en pantalla completa. Concretamente es esta macro.

Código: Seleccionar todo

Sub PantallaCompleta(Event As Object)'Evento al cargar formulario
   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
El obtener las medidas es para asignarselas a un control label, y asi evitar el evento click sobre el formulario, ya que esto no he sido capaz de hacerlo, según mi consulta anterior. Esta otra macro del amigo Mauricio es para obtener el control y asignarle las medidas, pero me da error que no encuentra la propiedad o metodo Size.

Código: Seleccionar todo

'Macro standar para cambiar el tamaño de un objeto
Sub CambiaTamanyo( Obj As Object, Ancho As Long, Alto As Long )
Dim oTam As New com.sun.star.awt.Size
	oTam.Width = Ancho
	oTam.Height = Alto
	Obj.setSize( oTam )
End Sub

Sub TamanyoEtiqueta(Evento)'Evento tras cambio de registro
Dim oCtrl As Object
Dim oEtiqueta As Object
	oCtrl = Thiscomponent.getDrawpage.getForms.getByIndex(0)
	oEtiqueta = oCtrl.getByName("Protector")'Control Label
	'Cambiamos su tamaño
	Call CambiaTamanyo( oEtiqueta, 500, 500 )
End Sub
A ver si tengo suerte y alguien me da luz.

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: Obtener medida pantalla completa

Mensaje por Longi »

Buenas!

Sigo sin tener claro el tema de cómo quieres trabajar con el tema de la pantalla completa (qué conseguir y cuando), pero con respecto a este hilo, quizá diga barbaridades como puños, pero por ahora, con lo que he conseguido ver por los foros, códigos varios, etc, creo que un control (y una etiqueta lo es) tiene dos partes, una, el control en sí, y otra la forma (Shape) en la que se dibuja el control.
En este caso, lo que tienes que modificar es el tamaño de la forma, y no el del control en sí mismo.

Prueba con esto:

Código: Seleccionar todo

Sub TamEtiqueta(Evento)

    Dim objSize as New com.sun.star.awt.Size
    Dim oCtrl, oShape

    oForm = Thiscomponent.getDrawpage.getForms.getByIndex(0)                                  ' Formulario en el que estamos trabajando
    oCtrl = oForm.getByName("lblNombre")                                                      ' Etiqueta. lblNombre es el nombre de la etiqueta
    oShape = GetControlShape(ThisComponent, oCtrl.Name)                                       ' Forma que contiene al control   
    oShape.SizeProtect = False                                                                ' No se protege el tamaño de la forma
    Objsize.Width = 3000                                                                      ' Anchura de la forma
    Objsize.Height = 800                                                                      ' Altura de la forma
    oShape.setSize(Objsize)                                                                   ' Tamaño de la forma

End sub
Similar problema sería el del formulario en ventana completa, ya que lo que se cambia es la ventana, no el formulario (por decir algo).

Ya contarás si te sirvió.

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: Obtener medida pantalla completa

Mensaje por Longi »

Buenas!

Pacomuz aportó esta minimacro para writer que igual te resulta interesante (un formulario es un writer):

Código: Seleccionar todo

Sub TamanoVentana
Dim oVentana As Object
Dim oPosTam As Object

   oVentana = ThisComponent.CurrentController.Frame.ContainerWindow
   oPosTam = oVentana.getPosSize   
   oVentana.setPosSize( 0, 50, 330, 600, com.sun.star.awt.PosSize.POSSIZE )

End Sub
Otro saludo! ;)
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: Obtener medida pantalla completa

Mensaje por RMG »

Hola Longi.

Esa macro ya la he usado en alguno de mis proyectos. Ahora te explico lo que pretendo hacer, es un proyecto para el foro que se ha comentado varias veces, concretamente es un acceso a la BD por usuario y cada uno de ellos tenga distintos privilegios de acceso y que no puedan acceder o visualizar más alla de su formulario inicial. Lo tengo casi todo pero me falta lo que comento en este y en otro post.

1. Abrir un formulario de inicio en pantalla completa y sin barras de herramientas o menús. Solucionado

2.No poder abandonar este formulario, que solo se dispone de tres métodos de abandonarlo. Según mi conocimiento

Método 1 con la tecla escape, esto lo tengo controlado y te remite a otro formulario con dos opciones, volver al inicio o abandonar la BD.

Método 2 con Alt+F4 que cierra la ventana del formulario de inicio, que también tengo controlado y hace lo anterior, o sea un bucle de abrir y cerrar, pero sin dejar ver la ventana con las tablas y formularios etc.

Método 3 picando en el mismo formulario con el botón derecho donde sale un menú contextual para abandonar pantalla completa, esto es lo que me falta controlar. Para ello he visto que si despliego un label ocupando toda la amplitud del formulario, esta etiqueta ya no permite picar con el botón derecho, pero sí permite picar en cualquier botón de comando. Con esto mi idea es evitar que se pueda hacer uso de este método, para ello intento capturar la medida de la pantalla completa al abrir el formulario y asignarsela al label (etiqueta).

Espero que se capte mi idea. Por cierto no se si has probado tu macro de poner ancho y alto a una etiqueta, pero a mi me da error de "Subproceso o proceso de control no definido" en esta linea

oShape = GetControlShape(ThisComponent, oCtrl.Name)

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

Re: Obtener medida pantalla completa

Mensaje por RMG »

Hola,

Algo he adelantado, la macro del libro de Mauricio es perfecta, para crear una etiqueta en tiempo de ejecución. Ahora solo me falta el tema de obtener las medidas de la pantalla para asignarselas a la etiqueta.

Código: Seleccionar todo

Sub TamanyoEtiqueta (Event as Object)
	Dim oFormulario As Object
    Dim oPaginaDibujo As Object
	Dim oNuevaEtiqueta As Object
	Dim oNuevaEtiquetaModelo As Object
	oPaginaDibujo = Thiscomponent.getDrawpage()
    oFormulario = Thiscomponent.getDrawpage.getForms.getByIndex(0)
  	'Creamos una nueva forma de control
	oNuevaEtiqueta = Thiscomponent.createInstance("com.sun.star.drawing.ControlShape")
	'Cambiamos su tamaño y posicion
	Call CambiaTam( oNuevaEtiqueta, 5000, 1000 )
	Call CambiaPos( oNuevaEtiqueta, 100, 100 )
	'Creamos una nueva etiqueta
	oNuevaEtiquetaModelo = Thiscomponent.createInstance("com.sun.star.form.component.FixedText")
	'Establecemos su nombre
	oNuevaEtiquetaModelo.Name = "lblId"
	'El texto que verá el usuario
	oNuevaEtiquetaModelo.Label = "Clave"
	'Conectamos la forma con el nuevo control
	oNuevaEtiqueta.Control = oNuevaEtiquetaModelo
	'Lo agregamos al formulario, el primer argumento, en este caso 0, es el índice que tendrá el nuevo
	'control agregado
	oFormulario.insertByIndex(0, oNuevaEtiquetaModelo)
	'Agregamos la forma a la página de dibujo para que sea visible
	oPaginaDibujo.add( oNuevaEtiqueta )
End Sub

'Macro standar para cambiar el tamaño de un objeto
Sub CambiaTam( Obj As Object, Ancho As Long, Alto As Long )
Dim oTam As New com.sun.star.awt.Size
	oTam.Width = Ancho
	oTam.Height = Alto
	Obj.setSize( oTam )
End Sub

'Macro para cambiar la posición de un objeto
Sub CambiaPos( Obj As Object, X As Long, Y As Long )
Dim oPos As New com.sun.star.awt.Point
oPos.X = X
oPos.Y = Y
Obj.setPosition( oPos )
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: Obtener medida pantalla completa

Mensaje por Longi »

Buenas de nuevo.
La verdad es que soy bastante desastre como ya has podido comprobar.
La macro daba error porque no le había puesto la llamada a la librería de herramientas.
Te pongo un ejemplo que había por ahí de otra cosa y lo utilicé para hacer dos formularios (Tabla1 y Tabla2)
El primero lo que hace es, para una etiqueta ya presente (pero puede combinarse con una de nueva creación), le cambia el tamaño, según lo modules en la macro, y actuaría cada vez que cambias de registro.
El Tabla2 tiene la macro de hacer pantalla completa, y le coge el tamaño, y se lo asignamos a la etiqueta que estaba por allí (pero se podrá hacer con una etiqueta generada por macro, como la que has hecho en el último post).
Tengo un problema con el tamaño, y es que las unidades de medida de la ventana no son las mismas que las de la etiqueta, así que he multiplicado por 100 cada dimensión, pero creo que se pasa , y quizá no te sea válido.

Ya dirás!

Otro saludo! ;)
Adjuntos
Dialogo.7z
(32.41 KiB) Descargado 252 veces
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Obtener medida pantalla completa

Mensaje por fornelasa »

Ahora solo me falta el tema de obtener las medidas de la pantalla para asignarselas a la etiqueta.
Para obtener las medidas de la pantalla completa ¿no será así?

Código: Seleccionar todo

Dim oFrame As Object
Sub PantallaCompleta(Event As Object)'Evento al cargar formulario  
   Dim oDispatchHelper
   oFrame=Event.Source.Parent.Parent.CurrentController.Frame
   oDispatchHelper=CreateUnoService("com.sun.star.frame.DispatchHelper")    
   oDispatchHelper.ExecuteDispatch(oFrame,".uno:FullScreen","",0,Array()
   Call medidas
End Sub
Sub medidas()
   msgbox "Alto " & oFrame.ComponentWindow.PosSize.Height
   msgbox "Ancho " & oFrame.ComponentWindow.PosSize.Width
   msgbox "Posición X Valor " & oFrame.ComponentWindow.PosSize.X
   msgbox "Posición Y Valor " & oFrame.ComponentWindow.PosSize.Y  
End Sub
que obviamente X y Y en este caso siempre serán cero
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Obtener medida pantalla completa

Mensaje por RMG »

Hola,

Gracias Longi, gracias Federico, paso a hacer pruebas y os comento.

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

Re: Obtener medida pantalla completa

Mensaje por RMG »

Hola,

He realizado las pruebas y los dos ejemplos perfectos. Ahora tengo un problema en este formulario INICIO_ADM que adjunto con la BD de Longi y que soy incapaz de encontrar el error.

Por más vueltas que le he dado y eliminado todos los controles, no veo donde puede estar la diferencia con respecto al formulario Tabla2 de Longi.

Podrías dar una mirada 6 ojos ven más que 2.

Longi como me tiraba el error a la biblioteca Global, para no tener que ir volviendo a la de la BD, he copiado la función directamente en las macros de la BD y he dejado la linea Global sin uso, eso mientras intento solucionar el error. El formulario Tabla1 funciona con la macro de Federico.

Saludos
Adjuntos
Dialogo1.7z
(1.98 MiB) Descargado 277 veces
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: Obtener medida pantalla completa

Mensaje por Longi »

Ramón, le estoy dando vueltas y no termino de arreglar, pero mi problema es que no estoy acostumbrado a usar funciones, y me está costando adaptar tu macro, seguramente tiraré por la calle del medio y la haré todo de una atacada, pero el problema está otra vez en la dualidad Control-Shape.
Las 'Shape' o formas no tienen nombre, sino que se accede a ellas por índice, el que tiene nombre es el control, y lo que hay que hacer es igualar el control que tiene el nombre que queremos con el índice de su propia forma.
Seguiré intentándolo, pero seguro que teniendo esto en cuenta ya lo vas a poder ir enfilando.

Otro saludo! ;)

Seguiremos mirando
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: Obtener medida pantalla completa

Mensaje por Longi »

Ya me costó!!!

Después de darle muchas vueltas, encontré que si le preguntas a tu formulario que te indique el número de controles (msgbox oForm.count), te da dos, aunque si miras el navegador de formulario solamente aparece la etiqueta, y si miras en ver-navegador, tampoco hay ningún objeto de dibujo, etc. ¿¿??
Sin embarbo, hice una selección de toda la pantalla, y además de la etiqueta aparece 'una presencia' rectangular que se enmarca entre ocho cuadraditos (sus marcadores), como si de un control se tratase, pero no sé cual ni de qué tipo, como si fuese otra etiqueta sin marco, pero que está ahi.
Si la eliminas, entonces todo empieza a funcionar como es debido.
Ya nos contarás si sabes de qué va esa 'presencia', aunque quizá sea un resto de hacer pruebas con la macro para generar etiqueta, en la que se hizo la forma, pero quedó sin asignarle ningún control (no se remató el proceso)....Lo dicho!, ya contarás.

Un saludo! ;)
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: Obtener medida pantalla completa

Mensaje por RMG »

Hola

Gracias Longi, pero hago el count de controles y a mi me aparece solo 1 y no encuentro lo que mencionas. De todas formas voy a dar esto como resuelto , pues lo que preguntaba se me ha contestado y bien, pero es que esto me tenía intrigado.

Cuando acabe el proyecto, que más que eso, es una pequeña utilidad la pondré en el foro de los proyectos por si lo necesita alguien que lo tenga.

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: [RESUELTO]Obtener medida pantalla completa

Mensaje por Longi »

Tienes razón, y una vez más vuelvo a equivocarme en algunas de las indicaciones.
No es en el 'Form.Count' (que sí que da uno), sino en la función que habías copiado, en la que hice un 'oContainer.DrawPage.Count' (y da 2, es decir, hay dos formas y un solo control):

Código: Seleccionar todo

Function GetControlShape(oContainer as Object,CName as String)
Dim i as integer
Dim aShape as Object
msgbox "Las formas existentes en el formulario son " & oContainer.DrawPage.Count
Exit function
	For i = 0 to oContainer.DrawPage.Count-1
		aShape = oContainer.DrawPage(i)
		If HasUnoInterfaces(aShape, "com.sun.star.drawing.XControlShape") then
			If aShape.Control.Name = CName then
				GetControlShape = aShape
				exit Function
			End If
		End If
	Next
End Function
En imágenes, para que se vea:
La primera sería el aviso y la segunda la 'Presencia'
Adjuntos
Aviso.PNG
Aviso.PNG (6.74 KiB) Visto 6268 veces
Aviso.PNG
Aviso.PNG (3.11 KiB) Visto 6268 veces
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: [RESUELTO]Obtener medida pantalla completa

Mensaje por RMG »

¡¡¡¡ ahora sí !!!!!

Gracias por todo. La verdad es que no se como se ha podido crear eso, pero bueno por lo menos me quedo tranquilo al encontrar la causa del error de la macro.

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: [RESUELTO]Obtener medida pantalla completa

Mensaje por Longi »

Sugerencias para la macro (si callo reviento....)

Código: Seleccionar todo

Sub PantallaCompleta2(Event As Object)                                                        ' Evento al cargar formulario
    Dim oFrame As Object
    Dim oDispatchHelper
    Dim objSize as New com.sun.star.awt.Size
    Dim oCtrl, oShape
    Dim oForm As Object
	 Dim oVentana As Object
	 Dim oPosTam As Object
    Dim FF,ComponentW,Desktop,pixpercmx,pixpercmy

    oFrame=Event.Source.Parent.Parent.CurrentController.Frame                                  ' Ventana en la que está el formulario
    oDispatchHelper=CreateUnoService("com.sun.star.frame.DispatchHelper")                      ' Despachador
    oDispatchHelper.ExecuteDispatch(oFrame,".uno:FullScreen","",0,Array())                     ' Ventana completa
    oVentana = ThisComponent.CurrentController.Frame.ContainerWindow                           ' Ventana del formulario
    oPosTam = oVentana.getPosSize                                                              ' Tamaño actual de la ventana 

    GlobalScope.BasicLibraries.LoadLibrary("Tools")                                            ' Llamamos a la librería de herramientas
    oForm = Thiscomponent.getDrawpage.getForms.getByIndex(0)                                   ' Formulario en el que estamos trabajando
    oCtrl = oForm.getByName("lblNombre")                                                       ' Etiqueta. lblNombre es el nombre de la etiqueta

    oCtrl.BackgroundColor = RGB(51,255,153)                                                    ' Color que le ponemos a la etiqueta 

    oShape = GetControlShape(ThisComponent, oCtrl.Name)                                        ' Forma que contiene al control   

   Desktop = createUnoService("com.sun.star.frame.Desktop")                                    ' Escritorio
   FF = Desktop.getActiveFrame()                                                               ' Recogemos el marco activo
   ComponentW = FF.getComponentWindow()                                                        ' El componente 'Ventana' del marco activo
   pixpercmx =ComponentW.getInfo().PixelPerMeterX/100                                          ' Píxeles por centímetro de la ventana en X
   pixpercmy =ComponentW.getInfo().PixelPerMeterY/100                                          ' Píxeles por centímetro en la ventana en Y

    Dim oPos as new com.sun.star.awt.Point                                                     ' El punto en el que vamos a tener la forma
    oPos.X = 0                                                                                 ' La posición X
    oPos.Y = 0                                                                                 ' La posición Y
    oShape.setPosition( oPos )                                                                 ' La posición final

    oShape.SizeProtect = False                                                                 ' No se protege el tamaño de la forma
    Objsize.Width = oPosTam.Width *pixpercmx                                                   ' Anchura de la forma= a anchura de la ventana (sale en centímetros y le multiplicamos por píxeles)
    Objsize.Height = oPosTam.Height*pixpercmy'                                                 ' Altura de la forma= a la altura de la ventana (sale en centímetros y le multiplicamos por píxeles)
    oShape.setSize(Objsize)                                                                    ' Tamaño de la forma
   
    oShape.LayerID = 1                                                                         ' Ponemos la forma al fondo

End Sub
Hemos hallado el tamaño de la pantalla completa en píxeles (macro del usuario Je Je, de los foros en Inglés). Esto vendría bien, si es que no meto la pata, y suponiendo que el tamaño original de ventana nos lo da en centímetros. Puedes tener equipos con distintas resoluciones y tamaños de pantalla. Con esto (al menos es la intención), tendríamos cubiertos todos los casos posibles (en función de la medida, se actúa)
Hemos puesto la etiqueta en el fondo, de tal manera que no tape ningún botón. Espero que sí que impida el funcionamiento del botón derecho del ratón (También parece que se oculta el 'diálogo' que te sugiere cómo salir del modo de pantalla completa, con lo que tendrías resuelto otro de los items que ya tenías solucionado)
Hemos cambiado el color de la etiqueta para que se vea que sí que ocupa todo el formulario, aunque en el trabajo normal supongo que ha de eliminarse este efecto, incluso el borde.
Supongo que con un rectángulo, sin necesidad de ser etiqueta valdría igualmente.

Otro saludo! ;)
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: [RESUELTO]Obtener medida pantalla completa

Mensaje por RMG »

Todas las sugerencias son bien recibidas, cuando lo pruebe te digo algo. La verdad es que como lo tengo funciona bien, pero a nadie le amarga un dulce.

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)
Responder