Página 1 de 1

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

Publicado: Mié Abr 17, 2019 12:43 pm
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 ?

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Mié Abr 17, 2019 7:13 pm
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

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Mié Abr 17, 2019 7:17 pm
por mauricio
Olvide mencionar, la macro abrir_formulario, se debe asociar al evento, Documento abierto del formulario, eso es todo...

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Mié Abr 17, 2019 10:00 pm
por arfgh
y en basic ?

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Mar Abr 23, 2019 4:05 am
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.

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Mar Abr 23, 2019 5:40 am
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:

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Mar Abr 23, 2019 5:42 am
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()

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Mar Abr 23, 2019 5:43 am
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

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Mar Abr 23, 2019 5:49 am
por fornelasa
Imagen

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Mar Abr 23, 2019 5:53 am
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.

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Mar Abr 23, 2019 4:33 pm
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.

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Mar Abr 23, 2019 7:04 pm
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.

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Mié Abr 24, 2019 12:38 am
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.

Re: Cómo detectar redimensionado en la ventana ?

Publicado: Jue Abr 25, 2019 10:15 pm
por arfgh
gracias fornelasa, muy buen ejemplo y en realidad se trata de añadir un escucha eventos. Era lo que precisaba, muchas gracias :)