Estos días he estado experimentando con las notificación es de Windows10 para aplicarlas a mis programas, ya que me parece que aportan un toque de modernidad evitando abusar de los messagebox.
Lo primero que tengo que agradecer es a Chris Pollach que ha publicado un ejemplo con su Framework en el cual me he basado.
Os dejo aquí el enlace al proyecto Windows Notification Utility:
sourceforge.net/projects/stdfndclass/files/Applications/PowerBuilder/Notification
Bien, lo primero que he hecho ha sido separar la clase nc_systemtray_master de su framework.
Para ello he creado un objeto no visual llamado n_cst_systemtray en el que he copiado toda la lógica de nc_systemtray_master. Ha sido bastante sencillo, sólo he tenido que crear la variable ib_rc que se encuentra en el ancestro de nc_systemtray_master (nc_master) y he eliminado el evento oe_documentation. Con esto ya he podido usar sólo la clase sin nada mas del framework.
Para mi he ejemplo he añadido una variable llamada ib_HideWindow, ya que no quiero que la ventana que llama a la noficacióon se vuelva invisible, así he modificado las funciones of_add_to_systemtray() añadiendo la condición IF ib_HideWindow THEN ao_window.Hide().
He tenido que crear una función llamada of_get_systemtray_active() para saber cuando hemos enviado la ventana al SystemTray, simplemente nos devuelve la variable privada ib_systemtray_active, podria haber puesto esta variable pública pero he optado por respetar la clase original al máximo.
Como última modificación de la clase he añadido que se guarde el estado en la variable privada ib_systemtray_active dentro de la función of_delete_from_systemtray(). Así sabré cuando se ha eliminado la notificación del Systemtray.
Una vez he tenido la clase preparada, he tenido varios quebraderos de cabeza para hacer que las notificaciones sean independientes de la aplicación y se eliminen solas pasados unos segundos.
Después de varia pruebas, he recordado un ejemplo de programación en MultiHilo o MultiThead y he intentado aplicar esos conceptos en este ejemplo.
Para ello he tenido que crear la clase n_cst_systemtray_shared y la clase n_cst_systemtray_callback para ayudarme a conseguirlo.
En resumen hay que crear un objeto que sea el que se ejecute en otro hilo, en este caso el objeto n_cst_systemtray_shared. Este es el responsable de esperar unos segundos antes de llamar al otro objeto n_cst_systemtray_callback que será quien elimine la notificación.
La explicación resumida de porque hay que usar dos objetos es porque el objeto compartido que se usa para el Multihilo no puede invocar ningún objeto que sea visual, eso lo ha de hacer el segundo objeto...
Como no me quiero enrollar mucho mas os dejo un enlace a un interesante artículo que habla sobre el tema:
Community.appeon.com/.../339-free-my-gui-multi-threading-in-powerbuilder
Os Pongo un pantallazo de la función que he creado en la ventana principal para llamar las notificaciones. Ahí se puede ver como hacemos la llamada multihilo:
El Objeto n_cst_systemtray_shared, simplemente espera los segundos que le indiquemos y llama al objeto n_cst_systemtry_callback:Finalmente el Objeto n_cst_systemtry_callback, que esta instanciado en w_main, es el encargado de eliminar la notificación
En el evento closequery de w_main he puesto un control, para saber si hay una notifiación, eliminarla si se cierra la aplicación:
Por comentar también, en el evento open he Instanciado la clase n_cst_sistemtray y la la clase n_cst_systemtray_callback. En esta última registramos la ventana con la función of_register para poder usar el objeto n_cst_sistemtray instanciado en w_main desde la clase n_cst_sistemtray_callback.
Comentarios
Publicar un comentario