Vedo che ancora tanti postano programmi che per chiudersi usano Quit.
Questa non è affatto buona programmazione.
Un programma grafico va chiuso usando la routine Me.Close della finestra principale e scrivendo nella routine pubblica Form_Close() il codice atto a terminare correttamente il programma.
Impostando la finestra principale così:
Application.MainWindow = Me
otterremo che tutte le finestre del programma attualmente aperte si chiudano insieme alla finestra principale.
Ricapitolando:
All'apertura della finestra principale noi la impostiamo come tale per l'applicativo.
Nella routine Form_Close teniamo conto di tutto quanto il programma ha coinvolto per rilasciarlo correttamente.
In caso di errori sopraggiunti anche all'esterno della finestra principale, se ingestibili altrimenti, invieremo un FMain.Close dopo aver avvisato l'utilizzatore.
Rimango in attesa di vs. gradite precisazioni.
Ciao,
dopo la esplicita invocazione nmQuit_Click() prova a porre un Return:
......
nmQuit_Click()
Return
......
quando si sceglie la voce "entry4" il programma si chiude
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
Per eliminare questo avviso, ho dovuto eliminare la sub-routine:
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:
Public Function DoSomething(i As Integer) As Boolean
If i = 4 Then
TrayIcon1 = Null <=======
Me.close
Return True
Endif
Return False
End
L'unico modo per fermarlo lì dove deve essere fermato è inserire una Quit. O almeno io non ho trovato altro modo.
Se io pongo l'istruzione "Quit" dopo quella "Me.Close", ottengo almeno due Warning:
gbx3 [8155]: warning: circular references detected:
gbx3: 1 DBusStatusIconMenu
gbx3: 1 DBusStatusIcon
gbx3: 2 DBusConnection
gbx3: 4 DBusObject
gbx3 [8155]: warning: 5 allocation(s) non freed.
Se pongo la sola istruzione "Quit" (quindi senza "Me.Close"), ottengo i medesimi due Warning.
Per ottenere un'uscita "pulita", dopo aver attivato il Componente "gb.signal", devo impostare la sub-routine come segue:
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()".
Al riguardo e più in generale si veda il paragrafo presente in questa pagina della nostra wiki:
https://www.gambas-it.org/wiki/index.php?title=Chiudere_programmi_esterni#mediante_le_risorse_della_Classe_.22Signal.22_di_Gambas
Non funziona allo stesso modo se invece l'istruzione TrayIcon1 = Null
la metti nella Form_Close()?
Dunque funziona ugualmente se quell'istruzione la metti nella routine del Metodo nascosto "_free()":
Public Sub _free()
TrayIcon1 = Null
End
Puoi usare anche quest'altra istruzione:
Free(Object.Address(TrayIcon1))