Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Post - Cris_70

Pagine: [1]
1
Ciao vuott!

Un primo reale problema che riscontro è la sollevazione di un "Warning", e più precisamente il seguente:
gbx3 [5476]: warning: circular references detected:
gbx3:     2 DBusConnection


Si, questo è esattamente il motivo per cui si vuole evitare di usare la "Quit" nei programmi grafici.
O almeno credo, nel senso che, per quanto uno cerchi di deallocare tutto quello che ha allocato, ci sono sempre questi warning all'uscita con Quit. Io non sono mai riuscito ad evitarli, perlomeno.

Per eliminare questo avviso, ho dovuto eliminare la sub-routine:
Codice: [Seleziona]
Public Sub Form_Close()
  TrayIcon1.Delete
End
e far distruggere l'Oggetto "TrayIcon1" con la modalità - che tempo fa Gianluigi ci ha insegnato a fare per qualsiasi Oggetto si tratti - assegnandogli il valore "Null".
In questo caso più precisamente:
Codice: [Seleziona]
Public Function DoSomething(i As Integer) As Boolean

  If i = 4 Then
      TrayIcon1 = Null    <=======
    Me.close
    Return True
  Endif
  Return False

End

Mmm, si ok così funzionerà anche ma non è ottimale. Non funziona allo stesso modo se invece l'istruzione
TrayIcon1 = Null
la metti nella Form_Close()? (Non ho provato, più tardi lo faccio)

Rimane poi il problema degli altri warning.

Per ottenere un'uscita "pulita", dopo aver attivato il Componente "gb.signal", devo impostare la sub-routine come segue:
Codice: [Seleziona]
Public Function DoSomething(i As Integer) As Boolean
 
  If i = 4 Then
    Signal.Send(Application.Handle, Signal.SIGKILL)
    Return True
  Endif

  Return False

End
Tale soluzione impedirà al programma di proseguire oltre tale riga del "Signal.Send()".

Si ok, ma così stai dicendo al sistema operativo di killare il tuo stesso programma. Eviterà anche i warning, ma non lo chiamerei un'scita "pulita".

In ogni caso, il punto che qui volevo sollevare è che l'indicazione di usare la chiusura della form principale come metodo di uscita non funziona. O almeno non funziona sempre.
Credo che questa sia una mancanza piuttosto grave, a cui si dovrebbe trovare un rimedio più "architetturale" (==> Benoit?).

E poi: perché quando faccio click sul pulsante di chiusura il programma esce senza warning, mentre quando esco con Quit dopo aver chiuso la form principale ho dei warning? Alla fine, il codice di deallocazione che viene eseguito è lo stesso.

Ciao
Cris

2
Ok, mi sono preso un momento per mettere giù il programmino.
In realtà ho riutilizzato un altro esempio che avevo mandato a Benoit, che illustra un bug con i sottomenù nella tray.

Ho aggiunto la funzione DoSomething() che, quando si seleziona la voce "entry4" nel TrayMenu, tenta di chiudere il programma con me.Close.

Alcune precisazioni:
- dovete usare il menu TrayMenu nella finestra principale, se invece lo fate usando il menù contestuale della tray icon non funzionerà, per via del bug segnalato precedentemente (a meno che stiate usando una versione recente del branch 3.17)
- il codice così com'è sembra non avere senso, ma ovviamente si tratta solo di un esempio per triggerare il "bug"

Come potrete vedere, quando si sceglie la voce "entry4" il programma si chiude, ma non subito dopo la me.Close, ma solo dopo aver eseguito tutto il codice che può eseguire... in pratica dopo aver esaurito tutto lo stack delle chiamate.

Ora immaginatevi un programma che ha uno stack di chiamate profondo magari 4 o 5 livelli, al 5° livello trova un errore non recuperabile e chiede all'utente se vuole ritentare o meno. L'utente risponde "no" e quindi il programma deve terminare. Ma invece di terminare dopo la me.Close, questo va avanti ad eseguire (o cercare di eseguire) tutto il codice che c'è dopo la Button1_Click() finché ha esaurito tutto lo stack.
L'unico modo per fermarlo lì dove deve essere fermato è inserire una Quit. O almeno io non ho trovato altro modo.

Dove sbaglio?

Ciao
Cristiano

3
Ciao Gianluigi

Scusa ma non ho capito, mi stai dicendo che il progetto di esempio che ho allegato a te non funziona?
Perché a me funziona correttamente, quando esco dal programma cliccando sul Pulsante Quit della FMain si chiude anche la trayicon oltre alle finestre aperte.

No scusa non sono stato chiaro.
Intendevo solo dire che il mio problema non è risolto. Ma il mio problema è diverso, lo capirete meglio non appena riesco a trovare il tempo per produrre un piccolo programma demo.

Scusate la lungaggine, ma il fatto è che il programma in questione lo posso testare solo in ambiente di lavoro e generalmente durante le ore di lavoro non ho molto tempo libero per dedicarmi a produrre il programma che dimostri il problema.

Ciao
Cris

4
Purtroppo anche con l'ultima master non funziona. E poi il mio problema non è legato alla TrayIcon, infatti il comando Quit dal menù della TrayIcon funziona.
Facciamo che appena ho tempo provo a produrre un programmino che illustri il comportamento anomalo.

Ciao
Cris

6
Programmazione / [RISOLTO] Sapere se esecuzione dall'IDE?
« il: 22 Novembre 2021, 12:18:07 »
Ciao a tutti,
è possibile capire se il programma è in esecuzione dall'IDE oppure "stand alone"?
Mi piacerebbe poter diversificare la lettura del file di configurazione del programma a seconda che sia in esecuzione dall'IDE o no.
Non ho trovato né documentazione né altri post che mi aiutassero.

Ciao
Cris

7
Ora che, malgrado sia febbricitante, Benoit Minisini ha corretto uno dei bug che affliggono la trayicon il progetto allegato su Ubuntu 20.04 con Gambas ultimo Master funziona

Grazie Gianluigi, mi sai dire che versione contiene la fix per la trayicon?

Ciao
Cris

8
Programmazione / Re:Evento ColumnSize in GridView?
« il: 22 Novembre 2021, 11:36:06 »
Ho aggiornato la pagina in inglese, solo per QT però. Ho il dubbio che in GTK funzioni in modo un po' diverso.
Appena posso testo anche GTK. Adesso aggiorno anche la pagina in italiano.

9
Programmazione / Re:Evento ColumnSize in GridView?
« il: 19 Novembre 2021, 12:21:32 »
Grazie a tutti per l'interessante approfondimento!!
Credo che sarebbe utile aggiungere queste informazioni alla pagina di documentazione di questo evento, che ne dite?

Ciao
Cris

10
Ciao Vuott

Ciao,
dopo la esplicita invocazione  nmQuit_Click() prova a porre un Return:

Codice: [Seleziona]
......

  nmQuit_Click()

  Return

......

Già provato. Ottengo solo di uscire dalla funzione e ritornare al chiamante, il quale prosegue come se nulla fosse  :'(

11
Programmazione / Evento ColumnSize in GridView?
« il: 18 Novembre 2021, 12:30:56 »
Ciao a tutti,
sto cercando di capire a cosa serve l'evento ColumnSize di una gridview.
Esistono due eventi apparentemente simili: ColumnResize e ColumnSize.
ColumnResize viene chiamato in tempo reale mentre l'utente sta esrguendo il resize di una colonna... sostanzialmente ogni volta che la proprietà Width di una colonna cambia, l'evento viene chiamato.
Mi aspettavo, in base alla documentazione, che l'evento ColumnSize venisse richiamato alla fine dell'operazione di resize. Cioè quando l'utente ha terminato il resize e la colonna assume la sua nuova Width definitiva. La documentazione infatti dice "Viene sollevato quando una colonna specifica è stata ridimensionata."
Peccato che invece l'evento non venga sollevato mai. Non riesco a triggerarlo in nessun caso.
Qualcuno sa a cosa serve questo evento?

Grazie, ciao
Cris

12
Ciao a tutti, so che è un topic vecchio, ma io non riesco a far funzionare correttamente questa cosa.
Ho aggiunto "Application.MainWindow = Me" nell'evento Form_Open() della form principale della mia applicazione. La form è di tipo persistent.
La mia applicazione installa un'icona nella tray, con un menù contestuale agganciato.
Se io clicco sulla voce "quit" del menù contestuale della tray icon, viene invocato l'evento mnQuit_Click() il quale dealloca varie risorse, imposta la form principale come NON persistent, rimuove l'icona nella tray e infine chiude la form principale. Questo chiude correttamente l'applicazione.
Se però devo uscire dall'applicazione da un punto diverso del codice, la cosa più pulita mi sembrava quella di invocare esplicitamente mnQuit_Click(). Ma questo non funziona: dopo aver eseguito il codice di mnQuit_Click() e il codice di Form_Close(), l'esecuzione ritorna nel punto in cui avevo chiamato la mnQuit_Click() e continua.

Come devo fare?
Fin'ora, l'unico modo che ho trovato è aggiungere "Quit" sotto "mnQuit_Clic()", ma questo ha tutta una serie di inconvenienti che ben conosciamo.

Ciao
Cris

Pagine: [1]