Páginas (2): 1 2   
Shell   12-12-2022, 13:53
#1
Buenas a todos/as!.

He hecho un ejemplo que me dice los días que quedan para navidad.
Quizás no es la forma más recomendable o no entiendo el problema adecuadamente.

Es una aplicación que se va a ejecutar una vez entremos en el escritorio. Siempre, todos los días.

Tengo una fecha estimada, el día de navidad y la fecha actual. Resto la diferencia y me dice los días que quedan. Hasta ahí bien. ( fue un rollo el tema de fechas ).
A la hora de representar esto, me surgen dudas, probablemente de no entender el comportamiento de la clase.

Si fuera un icono en la bandeja de entrada o panel superior, momentáneamente al mostrarse el escritorio, me gustaría mostrar el icono y
un mensaje en el icono que puede ser un globo, "Quedan x's días para navidad", luego el mensaje desaparece y el icono se queda en la bandeja.

¿ Es esto el funcionamiento "normal" de un icono en la bandeja de entrada ?.  ( Por si debo cambiar la forma de presentar el mensaje )
- Algunos muestran valores como es valores de temperaturas
- Otros simplemente actúan cuando haces clic en ellos

Sigo.

El icono aparece "pegado" al selector de áreas de trabajo, a su izquierda no detrás de este, claro el selector del área de trabajo es otro icono a su manera.
Si hago clic en el (esto no es lo que quiero) el mensaje aparece en el formulario ( que es un control ), ya que por lo que parece un trayicon no es un control.

Puedo hacer el proyecto con formulario o sin este (no es realmente necesario), haciendo un proyecto de consola y añadiendo componentes.

Os muestro el código:

Código:
Const FECHANAVIDAD As String = "25/12/2022"

Private fechaestimada As Date
Private icono As TrayIcon

Public Sub Form_Open()
 
  'Quiero pasarla en el formato "dd/mm/yyyy"
  fechaestimada = CadenaConvAFecha(FECHANAVIDAD)
 
  icono = New TrayIcon As "Manejador"  
  With icono  
    .Picture = Stock["18/clock"]
    .Show    
  End With
 
End

''Convierte la cadena a un tipo fecha
Public Function CadenaConvAFecha(sfecha As String) As Date
 
  Dim fechatemp As Date
  Dim asfecha As String[]
 
  'Fecha como cadena se convierte a un array
  asfecha = Split(sfecha, "/")
 
  'asfecha[0] = día , asfecha[1] = mes , asfecha[2] = año  
  'Convierto a tipo fecha
  fechatemp = Date(asfecha[2], asfecha[1], asfecha[0])
 
  Return fechatemp
 
End

Public Sub Manejador_Click()
 
  'FIXME:Esto no se muestra en el icono, se muestra en el formulario, que es un control.
  With Balloon
    .Delay = 5000
    .Font = Font["Arial, 8, Bold, italic"]
    .Info("Quedán " & DateDiff(Now, fechaestimada, gb.Day) & " días para Navidad", Me)    
  End With
 
End
Recomendaciones. Wink
Realmente no quiero hacer clic en el icono, solo quiero que me muestre un mensaje y desparezca este.
He pensado hasta en un timer, pero es que trayicon tiene algo parecido a un reloj.

Subo el proyecto.

Saludos
Archivos adjuntos
.gz
MostrarGloboEnIconoBarra-0.0.1.tar.gz (Tamaño: 12.11 KB Descargas: 3)

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tincho   12-12-2022, 14:44
#2
A ver si comprendo bien, lo que querés que suceda es que al entrar a la sesión unos segundos después aparezca un cartelito que diga "Te faltan ...." una sola vez y ya esta.

En ese caso propongo esta solución.
Código:
Public Sub Main()

  Dim iDif As Integer

  iDif = DateDiff(Now(), Date(2022, 12, 24), gb.Day)
  Exec ["notify-send", "-t", "2000", ("System"), ("Number of days to Christmas") & ":" & CStr(iDif)]

End
Última modificación: 12-12-2022, 15:05 por tincho.

1 Saludo.
Shell   12-12-2022, 15:42
#3
(12-12-2022, 14:44)tincho escribió: A ver si comprendo bien, lo que querés que suceda es que al entrar a la sesión unos segundos después aparezca un cartelito que diga "Te faltan ...." una sola vez y ya esta.

Eso es. Wink

¿ Y no crees que se pueda hacer sin usar un comando externo ?. Que me parece bien, pero claro, es que es Gambas con lo
que me gusta hacer las cosas "mientras se pueda".

Tampoco conocía esa utilidad. Claro, me puse hacerlo directamente con comandos del propio Gambas.No utilicé los comandos de ayudas de la terminal
para recavar información.

En principio hace eso por ahora, pero quiero ampliar el ejemplo. Gracias por la ayuda.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tincho   12-12-2022, 16:12
#4
(12-12-2022, 15:42)Shell escribió: ¿ Y no crees que se pueda hacer sin usar un comando externo ?

Seguramente se pueda hacer, pero no se como, lo siento.

(12-12-2022, 15:42)Shell escribió: Gracias por la ayuda.
De nada.
Última modificación: 12-12-2022, 16:13 por tincho.

1 Saludo.
Shell   12-12-2022, 16:35
#5
(12-12-2022, 16:12)tincho escribió: Seguramente se pueda hacer, pero no se como, lo siento.

Ojala quedase tan bien el globo de Gambas como da este comando.

Encontré este vídeo, en este caso crea un script en bash , el lanzador.



Y buscando rápidamente ( que todo es cuestión de usar palabras en inglés...ejemplo: "gambas notify message desktop" )..sin el inglés no te comes nada,
encontré esto:

[Gambas-user] Desktop notification

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
cogier   13-12-2022, 14:39
#6
Esta es mi versión.

Código:
Label1 As Label
Timer1 As Timer

Public Sub Form_Open()

  With Me
    .Show
    .Border = False
    .Height = 50
    .Width = 250
    .Arrangement = Arrange.Vertical
    .x = Desktop.Width - .Width
    .Y = Desktop.Height - .Height
  End With

  With Label1 = New Label(Me) As "Label1"
    .Expand = True
    .Background = Color.Yellow
    .Foreground = Color.Red
    .Font.Bold = True
    .Alignment = Align.Center
    .Text = "Faltan " & Str(DateDiff(Now(), Date(2022, 12, 25), gb.Day)) & " días para Navidad"
  End With

  With Timer1 = New Timer As "Timer1"
    .Delay = 3000
    .Enabled = True
  End With

End

Public Sub Timer1_Timer()

  Timer1.Stop
  Me.Close

End
Shordi   13-12-2022, 21:39
#7
Bueno, pues ahí tienes mi versión. Tiene esta pinta y se cierra al hacer click sobre la bola.

[Imagen: aA87wr9.png]

Utiliza la propiedad mask del formulario fmain. No es lo que propones, pero no creo que un trayicon sea apropiado para ésto. Puedes cambiar el mouseDown por un Timer, por supuesto.
Podría haber buscado una fuente más happy... pero sólo es un ejemplo.

Saludos
Archivos adjuntos
.gz
Navidad-0.0.1.tar.gz (Tamaño: 127.07 KB Descargas: 1)
Última modificación: 13-12-2022, 21:42 por Shordi.

No podemos regresar
Shordi   14-12-2022, 14:17
#8
Le he puesto una fuente chula. No adjunto el proyecto porque es lo mismo excepto la fuente y el color de la etiqueta. Queda así:
[Imagen: VAY1lKJ.png]

Ahora mola más. Cool

Saludos

No podemos regresar
Shell   14-12-2022, 20:52
#9
Gracias a todos!. Big Grin

(13-12-2022, 14:39)cogier escribió: Esta es mi versión.

Es una buena opción. Quizás la única por ahora. Formulario sin bordes y uso de la propiedad Mask.

Esto es para todos.
Entonces cuando la variable es global o común a la clase, en este caso al formulario, no es necesario tener que usar
"Private" ( declarar el alcance, se da por entendido ).

Así escribimos menos.  Rolleyes
Había visto las declaraciones de variables locales, declaraciones automáticas, esto es distinto.

Existe un problema con esta posibilidad. Se puede hacer, pero si no usamos Private siendo de alcance a toda esa clase.
Supongamos el caso del objeto Timer1, tenemos que escribir sus propiedades letra a letra y si nos confundimos podemos
crear un código erróneo. Vamos que tienes que conocer muy bien cada letra de sus propiedades. Será más sencillo
escribir Private y usar el autocompletado del editor.

Shordi:

Ya veras cuando lo vean tus nietas. ( Si son pequeñas ).

Saludos
Última modificación: 15-12-2022, 00:19 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   15-12-2022, 01:25
#10
Hice una pequeña modificación al código de Cogier.

Uso el tipo Font, averiguo el ancho y el alto del texto y con esto aumento el ancho y el alto del formulario en un porcentaje.
De paso decir que ahora me entero que las fuentes que son monoespaciadas no tienen negrita.

Código:
Private Label1 As Label
Private Timer1 As Timer

Public Sub Form_Open()
 
  Dim fuente As Font
  Dim stexto As String
  Dim ianchotexto As Integer
  Dim ialtotexto As Integer
 
  fuente = Font["Noto,10,Bold"]
  stexto = "Faltan " & Str(DateDiff(Now(), Date(2022, 12, 25), gb.Day)) & " días para Navidad"
 
  ianchotexto = fuente.TextWidth(stexto)
  ialtotexto = fuente.TextHeight(stexto)
 
  With Me
    .Show
    .Border = False    
    .Height = ialtotexto * 1.4 '% más de altura que el alto del texto
    .Width = ianchotexto * 1.1 '% más de anchura que el ancho del texto
    .Arrangement = Arrange.Vertical
    .x = Desktop.Width - .Width
    .Y = Desktop.Height - .Height
  End With
 
  With Label1 = New Label(Me) As "Label1"
    .Expand = True
    .Background = Color.Green
    .Foreground = Color.Black
    .Font = fuente    
    .Alignment = Align.Center
    .Text = stexto    
  End With
 
  With Timer1 = New Timer As "Timer1"
    .Delay = 3000
    .Enabled = True    
  End With
 
End

Public Sub Timer1_Timer()
 
  Timer1.Stop
  Me.Close
 
End

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Páginas (2): 1 2   
  
Usuarios navegando en este tema: 7 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.