Páginas (2): 1 2   
Shell   15-05-2025, 12:13
#1
Buenas a tod@s!.

Estoy intentando crear un ejemplo con Trayicon para comprenderlo de la forma más sencilla.
Pero no logro que el formulario se oculte al principio.

Desde la opción de menú del Trayicon logro que el formulario se muestre o no se muestre.
Pero desde que inicia la aplicación, está activo en el escritorio.

Código:
'Problema el formulario se muestra al inicio de la ejecución

Private TrayMenu As Menu
Private MenuMostrar As Menu
Private MenuSalir As Menu
Private TrayIcon1 As TrayIcon

Public Sub Form_Open()

  'Crear el menú principal del tray icon
  TrayMenu = New Menu(Me) As "TrayMenu"

  'Crear el submenú "Mostrar"
  MenuMostrar = New Menu(TrayMenu) As "MenuMostrar"
  MenuMostrar.Text = "&Mostrar"

  'Crear el submenú "Salir"
  MenuSalir = New Menu(TrayMenu) As "MenuSalir"
  MenuSalir.Text = "&Salir"

  'Configurar el icono de la bandeja
  TrayIcon1 = New TrayIcon As "TrayIcon1"
  TrayIcon1.Icon = Stock["gambas"]
  TrayIcon1.Tooltip = "Ejemplo básico con TrayIcon"
  TrayIcon1.PopupMenu = TrayMenu.Name
  TrayIcon1.Visible = True

  'FIXME: Esto no funciona. El formulario no se ha abierto
  Me.Hide() 'Ocultar el formulario al iniciar

End

Public Sub MenuMostrar_Click()

  Me.Visible = Not Me.Visible
  If Me.Visible Then
    Me.Show()
    Me.Raise
    Me.SetFocus()
  Endif

End

Public Sub MenuSalir_Click()

  Me.Close()

End

Public Sub Form_Close()

  If TrayIcon1.Visible Then TrayIcon1.Hide
  TrayIcon1.Delete

End

Public Sub Form_Activate()

  '¿ Necesito algo aquí ?

End

Os subo el ejemplo.



Vaya como ha mejorado el mostrar el código. Chapó administrador!

Saludos
Archivos adjuntos
.gz
EjemploBaseConTrayIcon-0.0.1.tar.gz (Tamaño: 8.82 KB Descargas: 1)
Última modificación: 15-05-2025, 12:15 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   15-05-2025, 12:26
#2
Lo tenías muy acorralado. La única modificación al código es pasar la ocultación al evento _Show que se ejecuta después del open. Así:
Código:
' Gambas class file

Private TrayMenu As Menu
Private MenuMostrar As Menu
Private MenuSalir As Menu
Private TrayIcon1 As TrayIcon

Public Sub Form_Open()

  'Crear el menú principal del tray icon
  TrayMenu = New Menu(Me) As "TrayMenu"

  'Crear el submenú "Mostrar"
  MenuMostrar = New Menu(TrayMenu) As "MenuMostrar"
  MenuMostrar.Text = "&Mostrar"

  'Crear el submenú "Salir"
  MenuSalir = New Menu(TrayMenu) As "MenuSalir"
  MenuSalir.Text = "&Salir"

  'Configurar el icono de la bandeja
  TrayIcon1 = New TrayIcon As "TrayIcon1"
  TrayIcon1.Icon = Stock["gambas"]
  TrayIcon1.Tooltip = "Ejemplo básico con TrayIcon"
  TrayIcon1.PopupMenu = TrayMenu.Name
  TrayIcon1.Visible = True

End

Public Sub Form_Show()

  Me.Hide() 'Ocultar el formulario al iniciar

End
.....
Tal vez añadir un wait antes del hide era suficiente, pero así te aseguras que ya está todo hecho antes de esconcerlo. Luego te faltaba añadir algunas cosas a la definición del formulario:
fondo transparente, sin bordes, tamaño pequeño, que no aparezca en la barra del escritorio... y ya.

Te adjunto el programa corregido.

Saludos.
Archivos adjuntos
.gz
EjemploBaseConTrayIcon-0.0.3.tar.gz (Tamaño: 8.8 KB Descargas: 1)
Última modificación: 15-05-2025, 12:28 por Shordi.

No podemos regresar
Shell   15-05-2025, 14:40
#3
Ostras...que esto es como la canción de Teresa Rabal.
Me pongo de pie, me vuelve a sentaaaar...
Aquí es, me escondo una vez, me vuelvo a esconder..y el tío no sale.

No, no vale que pongas que se oculta en el form_show, entonces no se muestra
en la vida.  Acabas de crearle una depresión de caballo al formulario. Ahí lo tengo
llorando por las esquinas del escritorio. ( No lo veo, pero lo escucho llorando ).

Prueba el ejemplo, ha cambiado de una forma que ya no se muestra nunca

Imagina el caso que no es un formulario vacío, vamos que puede tener controles.

Saludos
Última modificación: 15-05-2025, 14:41 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   15-05-2025, 15:19
#4
Es complicado poner controles ahí. Los trayicon son muy suyos. No son controles normales, que se manejan a través de dBus y no están ligados al programa una vez en ejecución. Cosas como cerrar el formulario, terminar la aplicación, etc. A menudo dan problemas.
 Si quieres mostrar algo hazlo en otro formulario porque si no ¿Cómo lo harás en los escritorios que no tienen panel donde sacar el trayicon?

No podemos regresar
Shell   15-05-2025, 15:56
#5
Pues si que son raros.  Confused
Si el código no es del todo correcto, hacen cosas raras según el tipo de gestor de escritorio que uses.

¿ Qué te parece de esta forma ?. Me he ayudado de una bandera para saber cuando se está mostrando y cuando no.
No descarto que haya código en menuMostrar_Click() que se pueda eliminar.
Código:
' Gambas class file

Private TrayMenu As Menu
Private MenuMostrar As Menu
Private MenuSalir As Menu
Private TrayIcon1 As TrayIcon

Private muestrate As Boolean

Public Sub Form_Open()

  'Crear el menú principal del tray icon
  TrayMenu = New Menu(Me) As "TrayMenu"

  'Crear el submenú "Mostrar"
  MenuMostrar = New Menu(TrayMenu) As "MenuMostrar"
  MenuMostrar.Text = "&Mostrar"

  'Crear el submenú "Salir"
  MenuSalir = New Menu(TrayMenu) As "MenuSalir"
  MenuSalir.Text = "&Salir"

  'Configurar el icono de la bandeja
  TrayIcon1 = New TrayIcon As "TrayIcon1"
  TrayIcon1.Icon = Stock["gambas"]
  TrayIcon1.Tooltip = "Ejemplo básico con TrayIcon"
  TrayIcon1.PopupMenu = TrayMenu.Name
  TrayIcon1.Visible = True

  Me.SkipTaskbar = True
  'Me.Hide() No sé si esto merece la pena aquí

End

Public Sub MenuMostrar_Click()

  muestrate = Not muestrate

  If muestrate Then
    Me.Show()
    Me.Raise
    Me.SetFocus()
    MenuMostrar.Text = "&Ocultar"
  Else
    Me.Hide()
    MenuMostrar.Text = "&Mostrar"
  Endif

End

Public Sub MenuSalir_Click()

  Me.Close()

End

Public Sub Form_Close()

  If Not IsNull(TrayIcon1) Then
    If TrayIcon1.Visible Then TrayIcon1.Hide
    TrayIcon1.Delete
  Endif

End

Public Sub Form_Activate()

  If muestrate Then
    Me.Show()
  Else
    Me.Hide()
  Endif

End


Desde luego el trayicon no iba a funcionar en un escritorio typo Wayland.
Que rollo es eso. Sad

Habría que averiguar antes si es tipo Wayland:
Código:
If Environ["XDG_SESSION_TYPE"] = "wayland" Then
  Message.Info("El entorno Wayland puede no soportar icono de bandeja.")
Endif

Y tomar otra alternativa

Saludos
Archivos adjuntos
.gz
EjemploBaseConTrayIcon-0.0.4.tar.gz (Tamaño: 8.87 KB Descargas: 1)
Última modificación: 15-05-2025, 16:12 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   15-05-2025, 20:19
#6
Te adjunto el ejemplo con las verificaciones que yo hago en mi programa LinAmp, que tienes en el git .

Saludos
Archivos adjuntos
.gz
EjemploBaseConTrayIcon-0.0.5.tar.gz (Tamaño: 9.16 KB Descargas: 1)

No podemos regresar
Shell   16-05-2025, 10:26
#7
(15-05-2025, 20:19)Shordi escribió: Te adjunto el ejemplo con las verificaciones que yo hago en mi programa LinAmp, que tienes en el git .

Entrando un poco en offtopic.

Creía que era el gbAmp. Para entender el funcionamiento básico de Trayicon es demasiado complicado. Le añadiste hasta clases.
Estuve viendo varios por el mismo tema. Comencé con "Alarm Timer" de Charlie Ogier (tiene tres proyectos sobre este tema).

Pero son proyectos tan grandes que para ver un sencillo uso de Trayicon, se sobrepasan.

Por cierto linAmp parece hecho para QT6. No ha sido complicado pero he tenido que entretener un poco elegir los 
componentes.Han quedado así:

[Imagen: jrO0Ticl.png]

Tiene una variable que no se usa: sto, se encuentra en cut_Click() se encuentra en fDivisor.
Ya gbAmp era grande. Es un gran proyecto en todos los sentidos.

Me he encontrado con un problema. He intentado reproducir un sonido que tenía en ogg y aunque lo ha cargado
no la ha reproducido.  Este funciona desde el administrador de archivos, es más lo estoy usando en otro ejemplo.  Huh
La aplicación tiene acceso a la carpeta del usuario. Pero imagina que quieres acceder a otros discos. No accede
al directorio de /. Supongo que por seguridad.

Y gracias por el soporte. Smile

Saludos
Última modificación: 16-05-2025, 11:03 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Grandamakulo   16-05-2025, 12:33
#8
Mi «Tomatito» es mucho más pequeño y es un poco chapuza. No sé si te valdrá, pero bueno, por si acaso.
Archivos adjuntos
.gz
Tomatito_Barra.tar.gz (Tamaño: 140.67 KB Descargas: 1)
Última modificación: 16-05-2025, 12:33 por Grandamakulo.

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
Shell   16-05-2025, 15:31
#9
(16-05-2025, 12:33)Grandamakulo escribió: Mi «Tomatito» es mucho más pequeño y es un poco chapuza. No sé si te valdrá, pero bueno, por si acaso.


Me suena a guitarrista flamenquito. Rolleyes

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   17-05-2025, 06:42
#10
Cita:Me he encontrado con un problema. He intentado reproducir un sonido que tenía en ogg y aunque lo ha cargado
no la ha reproducido.  Este funciona desde el administrador de archivos, es más lo estoy usando en otro ejemplo.  Huh
La aplicación tiene acceso a la carpeta del usuario. Pero imagina que quieres acceder a otros discos. No accede
al directorio de /. Supongo que por seguridad.

Y gracias por el soporte. Smile

Saludos

¿Veis como es necesario tener "pilotos de prueba"? La mayoría de los programas que tengo en el gitlab adolecen de esa carencia, es decir, yo los hago lo mejor que sé en cada momento hasta que "razonablemente" funcionan para mí. El problema es que al saber cómo funcionan nunca se me ocurre hacer cosas distintas y se quedan llenos de bugs y de huecos que por falta de otros ojos más limpios nunca salen a la luz.

En principio en el treeview de la izquierda (en realidad es un viewChooser, clase propia del programa que hereda de treeview), sólo se mostraban las carpetas y a la derecha los archivos. Creo que fue Tincho quien hace mucho tiempo señaló que sería bueno que también se pudiesen ver los archivos en el treeView y así lo hice, pero sólo como información, es decir si haces doble click sobre un archivo en la lista de la izquierda no se reproduce ni se muestra en la de la derecha.,. y ocurre que para que un archivo se reproduzca ha de estar en la lista de la derecha y ser lanzado desde ahí. Apostaría que has hecho doble click sobre un .ogg que se veía en el treeView y no ha ocurrido nada. A lo más se ha vaciado la lista de archivos de la derecha.
Lo he modificado y ahora si haces doble click sobre un archivo en el treeView, se carga en el gridview la carpeta donde resida y se puede reproducir desde el gridview. Es decir si despliegas el Escritorio en el treeView y allí tienes un archivo.ogg, con doble click sobre éste se cargarán en el triview todos los archivos de audio que contenga el Escritorio y desde ahí podrás reproducirlo.

El tema de que no puedas buscar fuera del home del usuario es configurable. Abre las preferencias y ahí puedes indicar cual es el tope de búsquedas y la carpeta de música por defecto, si cambias ahí /home/usuario por / a secas, ya está: podrás buscar por todo el ordenador.

De paso en esta investigación he podido corregir un error de división por cero que ocurría al intentar reproducir un archivo con duración 00:00:00 (hay archivos que informan mal de su duración o que duran tan poco que no se llega a calcular bien).

Como cosa mala he constatado que Youtube ha endurecido sus políticas y ahora no funciona bien el yt-dlp que es en lo que se basa LinAmp para descargar los archivos de sonido de los videos. Creo que ahora eso ya no funciona... pero no he tenido ganas de investigarlo a fondo. Lo dejo para otro día.

He subido a gitlab la versión corregida.
Es decir, una carencia y un bug solucionados gracias a tus observaciones. Supongo que esa es la vida cotidiana de Benoît... Big Grin Big Grin

Saludos
Última modificación: 17-05-2025, 06:45 por Shordi.

No podemos regresar
Páginas (2): 1 2   
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.