Newsgroup: it.comp.lang.visual-basic
Titolo: Function che non functiona

 Per controllare la completezza dei dati di un form in cui vi sono oggetti
testo e dei checkbox ho pensato di scrivere:
Function Completo(ByVal NomeForm As Object) As Boolean
Dim Obj As Object
Dim TB As Boolean, CB As Boolean
For Each Obj In NomeForm
        'Verifica che il controllo sia un CheckBox
         If TypeOf Obj Is CheckBox Then
            If Obj.Value = 0 Then
            CB = False
            Else
            CB = True
            End If
        End If
        'Verifica che il controllo sia un TextBox
         If TypeOf Obj Is TextBox Then
            If Len(Obj.Text) < 1 Then
            TB = False
            Else
            TB = True
            End If
         End If
Next
    If CB = True And TB = True Then
    Completo = True
    Else
    Completo = False
    End If
End Function
Ma funziona in parte: verifica il checkbox (in prova ne sto tenendo uno solo
nel form) dei Text presenti (in prova sono tre) non mi verifica il secondo
ed il terzo, come se il For si fosse fermato ad un solo Obj testo anzichč
per Each
Ho sbagliato qualcosa? Molto?
Grazie
--
Gulp ! Forse mi sono perso qualcosa !

 For Each Obj In NomeForm.Controls

> For Each Obj In NomeForm.Controls
ghe provo subito.


> For Each Obj In NomeForm.Controls
No, se dopo aver provato una volta cancello un oggetto text e riprovo mi
resta True


 For Each Obj In NomeForm
Se usi VB5, per un Form c'è l'insieme Controls, in VB6
è una vera Collection, non ti conviene usare quelli ?
Bye, G.

 resta True
Fermo restando che TB e CB dovrebbero partire a False (ma male non sarebbe,
per una questione di leggibilità) metterli all'inizio esplicitamente a
False,  ... nella chiamata gli passi il nome del form senza virgolette,
vero?! (essplicita anche il Next Obj) e, soprattutto, ...cos'è che ti resta
True? Il risultato della funzione? Impossibile che "resti", semmai ritorna!
Sicuro di non testare una variabile dove hai messo un ex risultato?

 resta True
Trovato: La sequenza di valutazione non è la stessa dei "numeri" dei
controlli nell'insiene Controls del Form. Quindi se l'ultimo valutato
restituisce True, tale sarà il risultato.
Devi cambiare la logica, ovvero assegnare a True all'inizio e porre a False
se un controllo non è riempito e, in tal caso, uscire da tutto.

 Impossibile che "resti", semmai ritorna!
Si,mi sono espresso male.
Ho seguito i consigli tuoi e di Paperino :
Nel form:
Option Explicit
Private Sub Command1_Click()
Unload frmProva
End Sub
Private Sub Command2_Click()
If Completo(frmProva) = True Then
Text4.Text = "completo"
Else
MsgBox "I dati non sono completi", vbCritical + vbOKOnly, "MANCANO DATI"
End If
End Sub
'Presenti nel form textbox1, 2, 3 ,4 e check1
E nel modulo:
Function Completo(ByVal NomeForm As Object) As Boolean
Dim Obj As Control
Dim TB As Boolean, CB As Boolean
TB = False
CB = False
For Each Obj In NomeForm.Controls
        'Verifica che il controllo sia un CheckBox
         If TypeOf Obj Is CheckBox Then
            If Obj.Value = 0 Then
            CB = False
            Else
            CB = True
            End If
        End If
        'Verifica che il controllo sia un TextBox
         If TypeOf Obj Is TextBox Then
            If Len(Obj.Text) < 1 Then
            TB = False
            Else
            TB = True
            End If
         End If
Next Obj
    If CB = True And TB = True Then
    Completo = True
    Else
    Completo = False
    End If
End Function
Se hai un attimo...
Non ho capito il discorso delle Collection di VB6 fatto da Paperino ...  due
parole ?
come sapete non sono un programmatore !


 False se un controllo non è riempito e, in tal caso, uscire da tutto.
Ok, per stasera sono fuso ! domani proverò la tua soluzione.
Grazie ad entrambi.


 Se hai un attimo...
Prova cosě:
Function Completo(ByVal NomeForm As Object) As Boolean
    Dim Obj As Object
    Completo = True
    Do
        For Each Obj In NomeForm.Controls
            'Verifica che il controllo sia un CheckBox
             If TypeOf Obj Is CheckBox Then
                If Obj.Value = 0 Then
                    Completo = False
                    Exit Do
                End If
            End If
            'Verifica che il controllo sia un TextBox
             If TypeOf Obj Is TextBox Then
                If Len(Obj.Text) < 1 Then
                    Completo = False
                    Exit Do
                End If
             End If
        Next Obj
        Exit Do
    Loop
End Function

 Ok, per stasera sono fuso ! domani proverň la tua soluzione.
Nooooo! La provi subito!
E rispondi pure!


Ok !!, anzi OKKKK  eiH... sei grande !
Della serie...quando si ha padronanza del linguaggio!
Molte grazie.
Buona notte.


 Buona notte.
'notte ;-)

"Lupo" ha scritto nel messaggio

ROTFLERRIMO
Bye, G.

 usare quelli ?
Infatti li usa ;)
Controls e' la proprieta' predefinita della classe Form :)
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
UGIdotNET - 
http://www.ugidotnet.org