Autore Topic: Message.xxx (o intera applicazione) sempre in primo piano  (Letto 414 volte)

Offline nino83

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Message.xxx (o intera applicazione) sempre in primo piano
« il: 15 Ottobre 2021, 17:40:58 »
Salve, ho un'applicazione che lancia via shell una mia applicazione scritta in Gambas.  Vorrei che questa applicazione lanciata venisse mostrata costantemente in primo piano.

Di fatto mi accade che, a volte, per una possibile condizione di errore, venga mostrato un messaggio (Message.Warning) prima ancora della comparsa della finestra principale.  Se per sbaglio si clicca al di fuori della finestra di messaggio, questa va in secondo piano, non si vede più, e l'utente rimane sull'ultima schermata dell'applicazione chiamante. 

Come posso ovviare a questo?

------------------------------------------------------------------------------
EDIT: penso che l'unica soluzione sia quella di riuscire a far visualizzare subito la form principale a tutto schermo prima che venga mostrata la MessageBox.
------------------------------------------------------------------------------
« Ultima modifica: 15 Ottobre 2021, 17:55:17 da nino83 »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Message.xxx (o intera applicazione) sempre in primo piano
« Risposta #1 il: 15 Ottobre 2021, 23:03:45 »
penso che l'unica soluzione sia quella di riuscire a far visualizzare subito la form principale a tutto schermo prima che venga mostrata la MessageBox.
Sono certo che Gianluigi darebbe la soluzione migliore al tuo problema, ma nel frattanto provo io.

Sì... è opportuno far visualizzare subito la finestra principale del programma lanciato con "Shell", perché questo programma potrebbe così imporre la sua finestra come quella che deve restare sempre "attiva" sulla Scrivania.
A tal proposito il programma, lanciato con "Shell", potrebbe contenere nel suo codice un Oggetto "Timer", che ogni tot tempo - sollevando l'Evento "_Timer()" - impone che la finestra "attiva" sulla Scrivania sia ancora quella principale del programma.
Per far funzionare tale soluzione è necessario attivare nel programma, che sarà lanciato da "Shell", anche il Componente "gb.desktop".

Mostro un semplice esempio:
Codice: [Seleziona]
Private tempus As Timer


Public Sub Form_Activate()

  With tempus = New Timer As "Tempus"
    .Delay = 250
    .Start
  End With

End

Public Sub Tempus_Timer()
 
  Desktop.ActiveWindow = Me.Id
 
End
« Ultima modifica: 16 Ottobre 2021, 14:42:27 da vuott »
« 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:Message.xxx (o intera applicazione) sempre in primo piano
« Risposta #2 il: 16 Ottobre 2021, 08:18:29 »
L'unica cosa che posso aggiungere è quella di dare un'occhiata alla proprietà Stacking delle form.

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Message.xxx (o intera applicazione) sempre in primo piano
« Risposta #3 il: 16 Ottobre 2021, 14:23:39 »
L'unica cosa che posso aggiungere è quella di dare un'occhiata alla proprietà Stacking delle form.
...ed è stato utilissimo.  :ok:
L'unico problema che ho rilevato è che la finestra principale, pur restando ad di sopra di ogni altra, perde il focus se viene aperta la finestra di un altro qualsiasi programma.
Quindi il mio codice, sostituito con il suggerimento migliore di Gianluigi, va integrato così:
Codice: [Seleziona]
Public Sub Form_Activate()

  Me.Stacking = Window.Above

End

Public Sub Form_LostFocus()
 
  Desktop.ActiveWindow = Me.Id
 
End

Segnalo anche:
   https://gambas-es.org/showthread.php?tid=66
« Ultima modifica: 23 Ottobre 2021, 15:43:03 da vuott »
« 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 nino83

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Re:Message.xxx (o intera applicazione) sempre in primo piano
« Risposta #4 il: 18 Ottobre 2021, 10:08:15 »
Avevo valutato la soluzione "timer", ma la ritenevo un po' uno sporco accrocchio.  Sapere che non son l'unico che pensa ste soluzioni mi rinfranca  ;D

Alla fine ho risolto "differendo" la funzione che può lanciare l'eccezione iniziale (che ha a che fare con inizializzazione di videocamere): non viene richiamata all'open, ma all'interno del tick del timer, ovviamente una sola volta.  Quantomeno la main form mi viene mostrata a tutto schermo e la finestra di errore, eventualmente, mi compare sopra di essa: essendo modale, cliccare sulla main form non ha effetti, così la finestra di errore non viene nascosta sotto altre finestre.

Grazie.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Message.xxx (o intera applicazione) sempre in primo piano
« Risposta #5 il: 18 Ottobre 2021, 15:22:40 »
Avevo valutato la soluzione "timer", ma la ritenevo un po' uno sporco accrocchio.
Quando non c'è una soluzione più specifica, più ad hoc, la soluzione del "Timer" non è malvagia, a mio avviso, permettendo fra l'altro di non far utilizzare eccessivamente risorse.
« 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. »