[RESUELTO] Cómo detectar redimensionado en la ventana ?

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
arfgh
Mensajes: 25
Registrado: Mar Mar 05, 2013 4:40 pm

[RESUELTO] Cómo detectar redimensionado en la ventana ?

Mensaje por arfgh »

Hola de nuevo amigos !

Me gustaría saber si conocéis de alguna forma de detectar el redimensionado de la ventana en formularios o en informes dentro de base, bien porque el usuario le da al botón de pantalla completa o bien porque redimensionamos a mano los bordes. Me parece que no hay ningún evento que nos ayude en esto, lo cual a priori implicaría tener una subrutina corriendo de manera permanente de fondo detectando el tamaño de la ventana y actuando cuando fuese preciso...
Pero esto nos generaría otro problema. Mientras esa subrutina este funcionando de fondo, los otros eventos no serán procesados y se atascarán hasta que salgamos de esa subrutina en bucle de fondo... Con vb6 esto se solucionaba con el clásico 'doevents' dentro del bucle, pero desconozco si la UNO API tiene algo parecido...

Por lo tanto estoy buscando una forma de poder hacerlo pero sin tener una subrutina corriendo de fondo en bucle....

alguna idea al respecto ?
OpenOffice última versión | Windows XP X64 | Windows 8.1 X64 | Mageia Linux x64 | Java 1.8.0_231
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por mauricio »

Si que lo hay, con Python es trivial...

Código: Seleccionar todo

import uno
import unohelper
from com.sun.star.awt import XWindowListener

class EventsWindow(unohelper.Base, XWindowListener):

    def __init__(self, controller):
        super().__init__()
        self._controller = controller

    def disposing(self, event):
        pass

    def windowResized(self, event):
        event_name = 'window_resized'
        if hasattr(self._controller, event_name):
            getattr(self._controller, event_name)(event)
        return

    def windowMoved(self, event):
        pass

    def windowShown(self, event):
        pass

    def windowHidden(self, event):
        pass


class Eventos(object):

    def __init__(self):
        pass

    def window_resized(self, event):
        ps = event.Source.PosSize

        msg = f'Pos X: {ps.X}\tPos Y: {ps.Y}\tAncho: {ps.Width}\tAlto: {ps.Height}'
        print(msg)

        return


def abrir_formulario(event=None):
    e = Eventos()
    w = event.Source.CurrentController.ComponentWindow
    w.addWindowListener(EventsWindow(e))
    return
Que produce la siguiente salida cada vez que redimencionas la ventana.
foro.png
No le veo caso para un informe, pero es "casi" el mismo proceso.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por mauricio »

Olvide mencionar, la macro abrir_formulario, se debe asociar al evento, Documento abierto del formulario, eso es todo...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
arfgh
Mensajes: 25
Registrado: Mar Mar 05, 2013 4:40 pm

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por arfgh »

y en basic ?
OpenOffice última versión | Windows XP X64 | Windows 8.1 X64 | Mageia Linux x64 | Java 1.8.0_231
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por fornelasa »

Hola,
Siempre que he tocado el tema de Python con otras personas no he tenido buenas experiencias porque me he encontrado con gente muy sensible que se incomoda cuando uno les dice que Python no es la gran maravilla que dicen, al menos no en Calc o Base.

Paso al ejemplo concreto:
Trivial es trivial.
Yo copié el código, lo guardé de la manera correcta y lo asigné a la ruta y formulario correcto y evento correcto.
Resultado: simplemente no funciona.
Siguiente paso: ahora a investigar el porque no funciona y aquí te puedes llevar una hora dos días tres días una semana y todo eso le quita lo trivial. No tengo ninguna duda que puedo investigar porque no funciona y dar con "el porque" pero no es tan trivial, estoy seguro que no lo es. :D :D


Imagen

Saludos, Federico.
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!
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por fornelasa »

Después de hacer circo maroma y teatro se logra mas o menos hacer que funcione (nada trivial) pero al final ... no no funciona.
Imagen :crazy:
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!
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por fornelasa »

Este es el código que he utilizado:

Código: Seleccionar todo

import uno
import unohelper
from com.sun.star.awt import XWindowListener
class EventsWindow(unohelper.Base, XWindowListener):

    def __init__(self, controller):
        super().__init__()
        self._controller = controller

    def disposing(self, event):
       pass

    def windowResized(self, event):
        event_name = 'window_resized'
        if hasattr(self._controller, event_name):
            getattr(self._controller, event_name)(event)
        return

    def windowMoved(self, event):
        pass

    def windowShown(self, event):
        pass

    def windowHidden(self, event):
        pass

class Eventos(object):
    def __init__(self):
        pass
def window_resized(self, event):
    ps = event.Source.PosSize
    msg = 'Pos X: {ps.X}\tPos Y: {ps.Y}\tAncho: {ps.Width}\tAlto: {ps.Height}'
    msgbox(msg)
    return


def abrir_formulario(event=None):
    e = Eventos()
    w = event.Source.CurrentController.ComponentWindow
    w.addWindowListener(EventsWindow(e))
    return

def prueba():
    msgbox('hola federico')
    return


def msgbox(message):
    CTX = uno.getComponentContext()
    SM = CTX.getServiceManager()
    toolkit = SM.createInstance('com.sun.star.awt.Toolkit')
    parent = toolkit.getDesktopWindow()
    mb = toolkit.createMessageBox(parent, 'infobox', 0, 'PyUNO', str(message))
    return mb.execute()
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!
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por mauricio »

de acuerdo, no es trivial, pero es necesario saber como hacerlo, esto incluye la depuración, que en Python es muy completa, no hay que estar adivinando nada, si, entonces no es trivial, pero reitero, hay que saber hacerlo.

En lo personal no entiendo como se ofende la gente con casi cualquier cosa, la gente es muy sensible (aquí hemos tenido varios casos), en "mi experiencia", el gran descubrimiento para mí, reitero para mi, fue Python, y tengo claro que no tiene por que ser lo mismo para todos, hacer esto en Basic, me parece tan aburrido de solo pensarlo. Hubo un momento en mi transición que claro, dominada más Basic y no era nada trivial en Python, ahora es completamente al revés. La diferencia, es que ahora podemos ayudar con una transición más suave en este foro, pero si se dan por vencidos a las primeras de cambio, apaga y vamonos, como dicen mis queridos amigos en España.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por fornelasa »

Imagen
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!
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por fornelasa »

de acuerdo, no es trivial,
Ok me quedo con eso, ahora si estamos de acuerdo.

Según yo, ya hice todo lo necesario para que funcione y no funciona ¿que será?
Ahí están las capturas de pantalla.
Saludos, Federico.
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!
arfgh
Mensajes: 25
Registrado: Mar Mar 05, 2013 4:40 pm

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por arfgh »

yo no puedo hablar de python, pero lo poco que sé no me gusta nada. Para mi un lenguaje de programación tiene que ser sí o sí con declaración explícita. Y sé que el basic también puede ser usar de manera implícita, pero esa forma es realmente asquerosa. Supongo que habrá quien le guste. Yo prefiero mantenerme alejado de ese tipo de código.

De todas maneras volviendo al tema, no es posible hacer lo que comento en basic ? evidentemente me refiero a hacerlo sin tener que mantener una subrutina de fondo en loop continuo. Ya sé que esto tal vez no sea muy común, pero en caso de necesidad, cómo lo haríamos ? el problema es cuando el usuario tira de los bordes de la ventana, y entonces se nos destroza el diseño de un formulario, es un ejemplo.
OpenOffice última versión | Windows XP X64 | Windows 8.1 X64 | Mageia Linux x64 | Java 1.8.0_231
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por fornelasa »

Te envío un ejemplo en Basic.
El mensaje que muestra las dimensiones del formulario es solo eso, un mensaje innecesario, que puede desactivarse pulsando la tecla Esc una o dos veces (dos veces si el usuario redimensiona el formulario a mano)

Saludos, Federico.
Adjuntos
baseParaEjemplos.zip
Dimensión formulario.
(11.93 KiB) Descargado 236 veces
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!
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por fornelasa »

A favor de Basic, ya hasta fui al cine ...... :D :D

y Python después de circo maroma y teatro pues no, no funciona al 100

Imagen

Si este programa se quiere usar en OpenOffice ........ uff menos.

Entre más conozco a Python más quiero a Basic (a nivel Calc) . :mrgreen:

Me hubiera gustado ser parte de los que hablan maravillas de Python (nivel Calc) pero hasta ahorita no veo lo maravilloso que es.

Saludos, Federico.
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!
arfgh
Mensajes: 25
Registrado: Mar Mar 05, 2013 4:40 pm

Re: Cómo detectar redimensionado en la ventana ?

Mensaje por arfgh »

gracias fornelasa, muy buen ejemplo y en realidad se trata de añadir un escucha eventos. Era lo que precisaba, muchas gracias :)
OpenOffice última versión | Windows XP X64 | Windows 8.1 X64 | Mageia Linux x64 | Java 1.8.0_231
Responder