Newsgroup: it.comp.lang.visual-basic
Titolo: E' caricato il Form?

Come posso rilevare se un Form secondario appartenente ad un Progetto MDI in
VB6 e caricato indipendentemente se il suo stato č Attivo, Visibile oppure
Nascosto ?
Grazie !

 Grazie !
non so se ci siano soluzioni piu' sveglie:
io normalmente creo un boolean pubblico col nome del form, lo metto vero
quando carico il form e falso quando lo scarico.
'modulo
public bPippo
'frmPippo
-- load --> bPippo=true
-- unload --> bPippo=false
poi a necessita' guardo che aria tira in bPippo

 Grazie !

 Come posso rilevare se un Form secondario appartenente ad un
Progetto MDI in VB6 e caricato indipendentemente se il suo
stato è Attivo, Visibile oppure Nascosto ?
Indipendentemente da MDI o non MDI, fai questo esperimento con
due form:
' Form1
'
Option Explicit
Public IsLoaded As Boolean
Private Sub Command1_Click()
  If Form2.IsLoaded Then
    MsgBox "Form2 e` caricato."
  Else
    MsgBox "Form2 non e` caricato."
  End If
End Sub
Private Sub Command2_Click()
  Form2.Show
End Sub
Private Sub Form_Load()
  IsLoaded = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
  IsLoaded = False
End Sub
' Form2
'
Option Explicit
Public IsLoaded As Boolean
Private Sub Command1_Click()
  If Form1.IsLoaded Then
    MsgBox "Form1 e` caricato."
  Else
    MsgBox "Form1 non e` caricato."
  End If
End Sub
Private Sub Form_Load()
  IsLoaded = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
  IsLoaded = False
End Sub
--
Ciao.
Maurizio
--------
?SPQR(C)
 X

End Sub
Sarebbe bello... :)
Il fatto è che se fai
    If Form2.IsLoaded Then
VB per guardare cosa vale IsLoaded si carica Form2!
Quindi ti darebbe sempre true...
Ciao

 Quindi ti darebbe sempre true...
Hai provato?


 Quindi ti darebbe sempre true...
Mi pare di ricordare che questo problema c'è solo se richiami una proprietà
"visuale" del form (tipo top,  width,  Caption, Visible, o robe simili).
Se chiedi solo il valore di una variabile pubblica, non dovrebbe scattare il
Form Load.
Piuttosto mi sono sempre chiesto cosa controlli VB quando gli fai il ciclo
standard per vedere se una form è qualla che ti interessa:
 For r = 0 To Forms.Count - 1
     If Forms(r) Is FrmMiaForm Then
            [... etc...]
Quando VB si chiede se "Forms(r) is FrmMiaForm" cosa controlla? Gli handle
no, perchè dovrebbe avere caricato anche FrmMiaForm per associargli un
handle. E allora?
Ciao
*Roby*

 handle. E allora?
non c'entra col soggetto, quanto con l'ultimo ciclo qui su:
un piccolo vbp, con un mdi (form0, caption MDIForm1) e 5 children (nome e
caption: form1-form5).
nell'mdi una matrice di 5 cmd (0-4) e un listbox.
Private Sub Form_Load()
    Dim j As Integer
    For j = 0 To 4
        Command1(j).Caption = "Form" & j + 1
    Next
End Sub
Private Sub Command1_Click(Index As Integer)
    Dim j As Integer
    For j = 0 To Forms.Count - 1
        Debug.Print Forms(j).Caption
        If Forms(j).Caption = Command1(Index).Caption Then
            Forms(j).Show
            Exit Sub
        End If
    Next
End Sub
avrei sperato che cliccando cmd(0), con caption "Form1", saltasse fuori il
form in questione.
nulla.
il debug, molto parco, si limita a visualizzare "MDIForm1"
al che ho incollato nel load, dopo il for-next, il codice dell'help:
'codice ms:
    Dim I   ' Declare variable.
    lstForms.Clear  ' Clear list box.
    For I = 0 To Forms.Count - 1
        lstForms.AddItem Forms(I).Caption
    Next I
il listbox resta vuoto.
quello che non capisco e' perche' invece, per quanto bruttino, mi funzioni
tranquillamente in un altro progetto questo codice, che toglie da un listbox
il nome di un form scaricato:
    With frmMain
        For J = 0 To .lstLongFiles.ListCount - 1
            .lstLongFiles.ListIndex = J
            If .lstLongFiles.List(.lstLongFiles.ListIndex) = OldCaption Then
                .lstLongFiles.RemoveItem J
                If .lstLongFiles.ListCount > 0 Then
                    .lstLongFiles.Selected(.lstLongFiles.ListCount - 1) =
True
                    For JJ = 0 To Forms.Count - 1
                        If Forms(JJ).Caption = _
                            .lstLongFiles.List(.lstLongFiles.ListCount - 1)
Then _
                            Forms(JJ).ZOrder
                    Next JJ
                End If
                Exit For
            End If
        Next J
    End With
qual e' il punto nel primo progetto ?
grazie, a.


Funziona... Ma non dovrebbe.
Nel senso: come fa a controllare una variabile senza caricare il relativo
proprietario? Che variabile controlla? Perche' se Form2 non e' in memoria
allora nemmeno la variabile IsLoaded lo e', quindi cosa va a cercare (e
returnare) VB?
Mistero della fede...
Ciaotutti,
Alessandro

 qual e' il punto nel primo progetto ?
Forse non ho capito bene, ma mi pare che nel primo progetto tu cicli
sull'insieme Forms e ti aspetti di trovarci anche delle form che non hai
caricato. E' vero?
Se le form non sono a video non fanno parte dell'insieme Forms, anche se
stanno nel progetto..
ciao
*Roby*

 returnare) VB?
Ho controllato. Se da Form1 interroghi From2.VariabilePubblica, non viene
generato l'evento Form2_Load, ma viene invece generato From2_Inizialize.
Come dire che un qualche caricamento di Form2 lo fa.
Ciao
*Roby*

 returnare) VB?
Cito dalla Guida di VB
Area di validità dei moduli:
[cut]
Le variabili a livello di modulo sono sempre di tipo Static , ovvero sono
sempre visibili se il modulo di appartenenza fa parte di un programma in
esecuzione.
[cut]
nota: dice "se il modulo fa parte di un prog in esecuzione", non se è
caricato!
Il perchè proprio non lo so, ma è così!
Ciao.
--
Princi, 
princ...@programmer.net
--------------------------------------------------------------------------
"Tutti sanno che una cosa è impossibile da realizzare,
finché arriva uno sprovveduto che non lo sa e la inventa." A.E.

 
Verissimo, altrimenti non funzionerebbe la routine del mio precedente messaggio
che invece se la cava molto bene...  (anche se sostituirei "a video" con "Loaded").
Ciao.
Franco

            [... etc...]
In questo caso credo che VB faccia una vera e propria porcata: l'operatore
"Is" controlla Forms(r) con il riferimento implicito a FrmMiaForm che in VB
è ironicamente (con grande felicità per la chiarezza) uguale al nome della
classe.
Infatti non è necessario dichiarare una variabile di tipo FrmMiaForm, in
quanto VB se ne crea una con lo stesso nome automaticamente.
In realtà tu aggiungendo al progetto FrmMiaForm definisci solo la classe
FrmMiaForm, infatti puoi benissimo fare
Dim f1 as FrmMiaForm
Dim f2 as FrmMiaForm
f1.Show
f2.Show
ed ecco che hai due form di tipo FrmMiaForm e nessuna istanza di FrmMiaForm
pur avendone un riferimento.
Tutto chiaro no?

...
Dim f1 as New FrmMiaForm
Dim f2 as New FrmMiaForm

 Tutto chiaro no?
Illuminante, direi.
Incomincio anche a capire che cosa ha generato alcuni bachi del Service Pack
4 che riguardano per l'appunto (tra l'altro) il settare a Nothing una form
durante l'unload.
Grazie
*Roby*