Autore Topic: Come si esce correttamente da un programma grafico?  (Letto 2178 volte)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Come si esce correttamente da un programma grafico?
« il: 27 Novembre 2018, 16:21:32 »
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ì:
Codice: [Seleziona]
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.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #1 il: 27 Novembre 2018, 16:57:03 »
...infatti, come precisa la documentazione ufficiale di Gambas:

" This instruction is not very successful in freeing things with GUI programs. So you should use it only with console applications. "
http://gambaswiki.org/wiki/lang/quit

" ...la memoria utilizzata sarà liberata nel miglior modo possibile pur non essendo questa operazione garantita. Infatti l'istruzione nasce principalmente per la linea di comando...  "
http://gambaswiki.org/wiki/lang/quit?l=it
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #2 il: 03 Dicembre 2018, 17:27:09 »
con buona pace del garbage collector :D

comunque utile precisazione ... si evita di saturare la memoria di aree non liberate (penso)
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #3 il: 03 Dicembre 2018, 22:43:34 »
(penso)

In che senso... "penso" ?

 
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #4 il: 04 Dicembre 2018, 11:56:06 »
che non so come funziona il garbage collector di linux / gambas .. se la pulizia la fa comunque in background
se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #5 il: 04 Dicembre 2018, 15:33:50 »
che non so come funziona il garbage collector di linux / gambas .. se la pulizia la fa comunque in background

Leggi qui
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #6 il: 04 Dicembre 2018, 16:00:54 »
ooooo kkkey :D
se corri, morirai stanco (motto degli sniper)

Offline Cris_70

  • Gamberetto
  • *
  • Post: 12
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #7 il: 18 Novembre 2021, 12:13:23 »
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
« Ultima modifica: 18 Novembre 2021, 12:39:33 da Cris_70 »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #8 il: 18 Novembre 2021, 12:26:48 »
Ciao,
dopo la esplicita invocazione  nmQuit_Click() prova a porre un Return:

Codice: [Seleziona]
......

  nmQuit_Click()

  Return

......
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Cris_70

  • Gamberetto
  • *
  • Post: 12
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #9 il: 18 Novembre 2021, 12:37:35 »
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  :'(

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #10 il: 18 Novembre 2021, 12:49:54 »
Ciao Vuott

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

Codice: [Seleziona]
......

  nmQuit_Click()

  Return

......

... ritornare al chiamante, il quale prosegue come se nulla fosse
Non riesco a capire, scusami.
Nel mio breve esempio di sopra "nmQuit_Click()" è il chiamante della sottoprocedura-Evento...
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #11 il: 18 Novembre 2021, 14:48:24 »
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

Per provare ho creato un piccolo esempio e mi sono accorto che, come purtroppo succede ciclicamente, La TrayIcon con Ubuntu non funziona a dovere.
Probabilmente si tratta di un bug, l'ennesimo che affligge questo componente.
Ho segnalato il malfunzionamento sul bugtracker, e penso che lo dovrai fare anche tu.

Per essere sicuro che non sia un tuo errore potresti postare un piccolo esempio che riproduce il malfunzionamento, così possiamo testarlo...

 :ciao:

« Ultima modifica: 18 Novembre 2021, 18:44:00 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #12 il: 19 Novembre 2021, 15:40:45 »
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
« Ultima modifica: 21 Novembre 2021, 10:17:01 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #13 il: 21 Novembre 2021, 10:22:50 »
...
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

Ho modificato l'applicazione allegata al mio post precedente del 19 per adattarla a quanto hai scritto.
Per poterla scaricare occorre collegarsi

 :ciao:
« Ultima modifica: 21 Novembre 2021, 10:24:10 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Cris_70

  • Gamberetto
  • *
  • Post: 12
    • Mostra profilo
Re:Come si esce correttamente da un programma grafico?
« Risposta #14 il: 22 Novembre 2021, 11:39:13 »
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