Newsgroup: it.comp.lang.visual-basic
Titolo: problema con una routine pubblica.

scusatemi innanzitutto se non ho trovato un nome maggiormente esplicativo da
dare al post :)
cmq ho scritto in un modulo il seguente codice :
Public Sub lockUnlock(op As Boolean, nomeForm As Form)
 For Each Control In nomeForm.Controls
  If TypeOf Control Is TextBox Then Control.Locked = op
   ElseIf TypeOf Control Is ComboBox Then Control.Locked = op
   ElseIf TypeOf Control Is CheckBox Then Control.Enabled = op
  End If
End Sub
che ho intenzione di richiamare quando ho bisogno di sbloccare o bloccare
tutti gli oggetti in questione di un form...
l'istruzione chiamante č ad esempio:
lockunlock(False, schedaTecnica)
dove schedaTecnica č il nome che ho dato ad un form del mio progetto.
Cavolicchio ho copiato pari pari l'esempio dalla guida, solo che invece di
scheda tecnica usava la parola chiava Me. Io non posso farlo perchč questa
routine mi serve in seguito ad un click su un pulsante e, almeno questa č la
spiegazione che ho tentato di darmi quando ho visto che non funzionava, dopo
il click Me non č piů il form ma il commandButton... Perň smentitemi pure.
Piuttosto, scritto cosě mi da l'errore " Previsto = "
cioč dovrei mettere = dopo la parentesi...
aiutooo :-(
Grazie mille a tutti!!!!

 End Sub
In un modulo ho inserito:
Public Sub lockUnlock(op As Boolean, nomeForm As Form)
 For Each Control In nomeForm.Controls
  If TypeOf Control Is TextBox Then Control.Visible = op
  If TypeOf Control Is ComboBox Then Control.Locked = op
   If TypeOf Control Is CheckBox Then Control.Enabled = op
  Next
End Sub
ed all'evento click di un button
Private Sub Command1_Click()
lockUnlock False, Me
End Sub
Il Me, mi sembra, è quello che ci vuole, se chiami dall'interno di una form
Ave
giuseppeD

ho provato come hai scritto tu e funziona anche con schedatecnica
(ovviamente)... ma perchè con le parentesi non funziona e senza si?
qual'è la differenza tra
lockUnlock False, Me e
lockUnlock (False, Me)

 ha scritto nel messaggio
news:W02Bb.14704$5o6....@tornado.fastwebnet.it...

Private Sub Command1_Click()
 Call lockUnlock(False, Me)
End Sub
Ave
giuseppeD

mi stai dicendo che se la routine che chiamo non appartiene al modulo o al
codice dell'istruzione chiamante devo anteporre un "call" se č cosě scusate
per la figuraccia!
Non mi sono posto il problema perchč per le sub interne al form
dell'istruzione chiamante la cosa funzionava non anteponendo il Call e
mettendo le parentesi... Pensavo fosse la medesima cosa.
Grazie mille.

 ha scritto nel messaggio
news:862Bb.14727$5o6....@tornado.fastwebnet.it...

Se non necessita perchč devi mettere il Call ?
Nella situazione in questione, anche se il metodo č in un modulo pubblico,
del Call se ne puň fare a meno.
Ho indicato il Call per spiegare l'errore dovuto alla presenza delle
parentisi.
Ave
giuseppeD

 parentisi.
putroppo, e scusatemi di questo, stasera sono un po ottuso :-). Non sono
ancora riuscito a capire perchè non mi funziona quando scrivo
lockUnlock(false, me)... Dipende dal fatto che lockunlock si trova in un
modulo?
Lo chiedo perchè se chiamo una sub da me definita nello stesso form
dell'istruzione chiamante, e la chiamo utilizzando le parentesi e i
parametri di scambio, senza la CALL, il tutto funziona... allora perchè se
la sub si trova in un'altra posizione non funziona più?
Era questa la mia domanda, può darsi tu mi abbia già risposto, ma
l'ottusaggine mi annebbia la vista :-)
saluti a tutti!

 la sub si trova in un'altra posizione non funziona più?
dove ?
giuseppeD

in un modulo invece che nel codice di un form (lo stesso dell'istruzione
chiamante però)

 chiamante però)
Vediamo se ho capito:
In un modulo pubblico:
Public Sub CallLockUnlock(op As Boolean, nomeForm As Form)
lockUnlock op, nomeForm
End Sub
Public Sub lockUnlock(op As Boolean, nomeForm As Form)
 For Each Control In nomeForm.Controls
  If TypeOf Control Is TextBox Then Control.Visible = op
  If TypeOf Control Is ComboBox Then Control.Locked = op
   If TypeOf Control Is CheckBox Then Control.Enabled = op
  Next
End Sub
In una form qualsiasi:
Private Sub Option1_Click()
Option1.Value = False
End Sub
Ave
giuseppeD

 mettendo le parentesi... Pensavo fosse la medesima cosa.
http://snurl.com/3bpe
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

ua grande!
e chi la conosceva sta cosa della forzatura del passaggio by value con le
parentesi!
Sospettavo fosse un problema del genere.
Solo mi domando:
[domande stupide: ON]
quindi non è possibile passare un form byVal vero? Cioè, concettualmente non
lo sarebbe, però non so, in pratica è possibile?
[domande stupide: OFF]
Quindi d'ora in poi userò miaSub parametro...
Grazie mille!!!

 [domande stupide: OFF]
Sì, è possibile.
Io lo faccio per leggibilità, così so che il parametro è in sola entrata.
Tanto passare un oggetto byref non ha senso poichè le modifiche 
apportate all'interno della sub non vengono mantenute (non ho mai capito 
il perchè, anche dopo che mi la si è spiegata).
Ciao

 il perchè, anche dopo che mi la si è spiegata).
Cioè, volevo dire esattamente il contrario :P
Un oggetto è sempre byref, anche se marcato byval.
Ciao

 un modulo?
[SNIP]
No, molto semplicemente e' un problema di sintassi, nient'altro.
Quando la chiamata di funzione/sub e' a destra di un "=" oppure e' preceduta
dall'istruzione Call devi racchiudere i parametri tra (), quando e'
utilizzata come singola istruzione invece no.
Quello citato da Zanna e' un caso di ambiguita' particolare che si verifica
quando il parametro e' uno solo, e dove le parentesi vengono accettate non
come parte della funzione (infatti a te che nei hai due da errore) ma come
delimitatore di parametro, con gli effetti, spesso indesiderati, descritti.
Se vuoi toglierti il pensiero usa sempre Call e le parentesi, altrimenti
dopo un po' ci farai "l'occhio" e le userai solo quando servono
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown


Non e' proprio cosi', perche' con ByRef passi un riferimento al puntatore,
con ByVal una copia del puntatore; se lavori solo sui membri dell'oggetto ha
poca importanza, perche' comunque copia e originale puntano alla stessa
cosa, ma se lavori sul puntatore stesso invece le due varianti si
comportano, correttamente, in modo diverso.
Per esempio:
Sub CallByRef(ByRef o As Object)
    Set o = Nothing
End Sub
Sub CallByVal(ByVal o As Object)
    Set o = Nothing
End Sub
Private Sub Command1_Click()
    Dim c As Collection
    Set c = New Collection
    CallByVal c
    Debug.Print c Is Nothing
    CallByRef c
    Debug.Print c Is Nothing
End Sub
