Autore Topic: Come verificare se un form è attivo  (Letto 6175 volte)

Offline claudio

  • Gambero
  • **
  • Post: 57
    • Mostra profilo
Come verificare se un form è attivo
« il: 08 Maggio 2009, 23:51:39 »
Qual'è il modo per verificare se un form è attivo?

In vb6 utilizzavo questa funzione:

   Public Function VerificaFormAperto(ByVal nomeForm As String) As Boolean
      Dim f As Form
      For Each f In Application.OpenForms
         If f.Name = nomeForm Then
            Return True
         End If
      Next
      Return False
   End Function

Nella documentazione in rete non sono riuscito a trovare nulla a riguardo.

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: Come verificare se un form è attivo
« Risposta #1 il: 09 Maggio 2009, 01:06:07 »
Dovrebbe essere:

PRINT Application.ActiveWindow

anche se qualche volta non risponde, per esempio se la metti
dentro Form_Open.

Altro modo è creare una variabile globale e in ogni form
gestire l'evento GotFocus per impostare la variabile globale
con il nome della Form che viene attivata. Comunque
Application.ActiveWindow dovrebbe risolvere. Ciao.

Offline claudio

  • Gambero
  • **
  • Post: 57
    • Mostra profilo
Re: Come verificare se un form è attivo
« Risposta #2 il: 09 Maggio 2009, 01:19:21 »
Per il momento l'ho risolta in questo modo:

Ho creato in una classe una matrice:
STATIC PUBLIC MatriceForm AS String[100]

All'evento OPEN del form:
classe.MatriceForm.Add("nomeform", 0)

All'evento CLOSE del form
classe.MatriceForm.Remove(0)

Così in qualsiasi punto dell'applicazione ho la cronologia delle form aperte.

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: Come verificare se un form è attivo
« Risposta #3 il: 09 Maggio 2009, 01:26:15 »
Oh, bene. Avevo capito male. Pensavo che parlando di form attive
tu pensassi alla form che aveva il focus e non alle form aperte o visibili,
anche se non attive. Ciao.

Offline claudio

  • Gambero
  • **
  • Post: 57
    • Mostra profilo
Re: Come verificare se un form è attivo
« Risposta #4 il: 09 Maggio 2009, 01:28:52 »
Devo precisare che la soluzione che ho trovato funziona solo se c'è un unico form con il focus attivo.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Come verificare se un form è attivo
« Risposta #5 il: 09 Maggio 2009, 06:44:11 »
Non so se fate bene a gestire la cosa nell'evento Form_Open. Forse sarebbe più corretto farlo in Form_Activate. Form_Open gestisce l'apertura del form ma ciò non toglie che il form possa comunque essere aperto ma non attivo, mi spiego?

http://gambasdoc.org/help/doc/window-activate
Visita il mio sito personale: http://www.leonardomiliani.com

Offline claudio

  • Gambero
  • **
  • Post: 57
    • Mostra profilo
Re: Come verificare se un form è attivo
« Risposta #6 il: 09 Maggio 2009, 12:48:02 »
Per l'ora tarda ho fatto un po di confusione e adesso mi spiego meglio.
La domanda esatta era: Come verificare se un form è aperto.

Io voglio l'elenco di tutti i form aperti (sia visibili che nascosti).

Chiarisco con un esempio:
1) ho 4 form (a,b,c,d)
2) da ciascuno dei form a,b,c posso aprire il form d
3) nell'evento Form_Close del form d, devo stabilire quale dei form a,b,c  è il form chiamante.

Lavorando sempre con un unico form con il focus, con la soluzione seguente ho la cronologia dei form aperti, in cui quello con indice 0 è l'ultimo aperto.

Ho creato in una classe una matrice:
STATIC PUBLIC MatriceForm AS String[100]

All'evento OPEN del form:
classe.MatriceForm.Add("nomeform", 0)

All'evento CLOSE del form
classe.MatriceForm.Remove(0)

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Come verificare se un form è attivo
« Risposta #7 il: 09 Maggio 2009, 22:14:09 »
La prima soluzione, molto semplice, che mi viene in mente è quella di creare una variabile globale in cui memorizzare il nome del form chiamante e poi aprire il form d in modalità modale, così che, finché non viene chiuso, detiene in esclusiva il focus dell'applicazione.
Alla chiusura di d, basterà dare un'occhiata alla variabile globale suddetta per rendere il focus al form che aveva chiamato d.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline claudio

  • Gambero
  • **
  • Post: 57
    • Mostra profilo
Re: Come verificare se un form è attivo
« Risposta #8 il: 09 Maggio 2009, 22:42:19 »
@ leo72

avevo pensato anche io a utilizzare una variabile globale con il nome del form chiamante, però utilizzando una matrice posso avere l'elenco completo di tutti i form aperti e simulare la proprietà utilizzata in vb6.

E ho pure l'ordine di apertura dei form.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Come verificare se un form è attivo
« Risposta #9 il: 10 Maggio 2009, 10:50:58 »
Beh, ovviamente dipende sempre da cosa uno deve fare. Se hai necessità di avere anche l'ordine di attivazione dei form, allora sicuramente la tua soluzione è quella più completa ;-)
Visita il mio sito personale: http://www.leonardomiliani.com

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Come verificare se un form è attivo
« Risposta #10 il: 26 Novembre 2013, 02:24:11 »
Dovrebbe essere:

PRINT Application.ActiveWindow

anche se qualche volta non risponde, per esempio se la metti
dentro Form_Open.

E' sufficiente imporre preliminarmente l'apertura del Form e un breve Wait anche di un solo decimo di secondo:
Codice: gambas [Seleziona]

Public Sub Form_Open()

   Me.Show
 
   Wait 0.1
  
     Print Application.ActiveWindow.Name

End



oppure anche così:
Codice: gambas [Seleziona]
Public Sub Form_Open()

  Me.Show
 
  Do
    Wait 0.1
  Loop Until Application.ActiveWindow.Name = "FMain"

  Print Application.ActiveWindow.Name

End




Per la verifica di un Form o comunque di una finestra si può anche pensare ad una soluzione che ne accerti l'esistenza partendo dal suo nome visibile mediante la classe DesktopWindow. E' necessario attivare i componenti gb.desktop e gb.desktop.x11 .
Poniamo il caso che il Form da verificare si chiami "alibaba":
Codice: gambas [Seleziona]
Public Sub Button1_Click()

 Dim dw As DesktopWindow
  
' Di ogni finestra aperta sul desktop...
  For Each dw In Desktop.Windows
  '...cerca il nome. Se il nome visibile è uguale al nome del Form che cerchiamo,
' allora lo rileva:
    If dw.VisibleName = "alibaba" then Print "Il Form è attivo !"
  Next

End
« Ultima modifica: 12 Maggio 2015, 13:53:10 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. »