Newsgroup: it.comp.lang.visual-basic
Titolo: Passare variabili a form con GET/LET

Ciao a tutti,
devo farmi una finestrina di input in stile input box e volevo provare ad
usare le property Let e Get.
In pratica propongo una descrizione e mi aspetto l'input
Nella form di input:
Public Property Get GetDescMovim() As String
  GetDescMovim = txtMov.Text
End Property
In una sub in un modulo:
  Load frmDescMovim
  frmDescMovim.txtMov.Text = DescMovB
  frmDescMovim.Show vbModal
  DescMovB = frmDescMovim.GetDescMovim
Solo che ovviamente mi da "" perchè la form è scarica dopo il vbmodal.
Avete idea di come fare? Non mi piaceva una variabile global a livello di
modulo, ne ho già a iosa :)
Tnx!

 modulo, ne ho già a iosa :)
Ne dichiari una a livello di form:
Private m_DescMovim As String
.... un po' di codice in mezzo ....
Sub Form_Unload()
	m_DescMovim = Trim$(txtMov.Text)
End Sub
Public Property Get GetDescMovim() As String
	GetDescMovim = m_DescMovim
End Property
-- 
ciao, hal

 modulo, ne ho già a iosa :)
Perchè bisognerebbe razionalizzare un po' il codice e non riversarlo nei 
moduli come se fosse immondizia :)
Ciao 

 In pratica propongo una descrizione e mi aspetto l'input
[...CUT...]
Ciao. C'è una piccola ma fondamentale differenza tra dichiarare una
variabile pubblica nella Form2 per poi impostarla da Form1, e utilizzare una
Property, che imposta una variabile privata a livello di modulo, come
giustamente ti suggerisce hal, in Form2 per poi impostarne il valore da
Form1.
La differenza è che nel primo caso iul valore della variabile è accessibile
subito, nel secondo il valore della variabile privata è accessibile soltanto
dopo che il Load di Form2 è completo.
Cioè:
Primo caso:
' ==== [in Form2] ====
Dim MiaVar As Long
' ==== [in Form1] ====
Private Sub btnApriForm2_Click()
    Form2.MIaVar = 3
    Form2.Show
End Sub
In questo caso, se leggi il valore di MiaVar durante l'evento Form_Load di
Form2, ottieni 3.
Secondo caso:
' ==== [in Form2] ====
Dim mMiaVar As Long
Public Property Let MiaVar(ByVal newValue As Long)
     mMiaVar = newValue
End Property
' ==== [in Form1] ====
Private Sub btnApriForm2_Click()
    Form2.MIaVar = 3
    Form2.Show
End Sub
In questo caso, se leggi il valore di mMiaVar durante l'evento Form_Load di
Form2, ottieni 0.
Non intendo dire se un metodo sia migliore di un altro, ognuno ha i suoi
campi di applicazione e le sue ragioni per essere scelto, ma questa
differenza di comportamento dovrebbe essere tenuta a mente prima di
scegliere un metodo piuttosto che un altro.
Spero ti sia utile. Ciao.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 scegliere un metodo piuttosto che un altro.
La vera convenienza a scegliere la variabile privata con dichiarazione
esplicita di proprieta` pubblica e` che:
1. si possono in tal modo creare proprieta` anche in sola scrittura od
in sola lettura;
2. si possono validare i valori ricevuti in assegnazione;
3. possono essere restituiti valori calcolati;
4. possono essere gestite situazioni anomale che potrebbero generare
eccezioni.
Considera che quando si dichiara una variabile Public in un Form o in
un Class visual basic si crea internamente i metodi Let e Get.
-- 
ciao, hal

 End Property
Il problema č che io devo leggere da una sub di un MODULO non una form.
Se ho capito dovrei allora dalla form settare la variabile del modulo.
Cioč all'unload della form dovrei fare una Let della property del modulo.
Altrimenti l'unica cosa č non scaricare la form e scaricarla dal modulo.
Ora vedo perň se con la vbmodal mi va avanti o rimane lě :)

 Ah, trova un nome decente anche per il form ;)
Bhe diciamo che nel contesto si capisce meglio con quel nome.
Trall'altro in questo programma ci sono pochi form, una decina, quindi è
abbastanza intuitivo.
Poi essendo un inputbox spero di non doverci mettere le mani spesso.
Grazie :D

 sistemo :)
Forse non mi va bene.
Nel senso io devo poter accedere ad una let nella formDescMov.
Perchè se premo OK devo settare il valore, altrimenti no.
Ora il problema è fare la Property Let per un modulo, e non credo sia
possibile :\
Grazie comunque.

 possibile :\
Credo di non capire i contesto.
'sto modulo adeso da dove salta fuori?
E perchè dovresti avere delle property per un modulo?
Ciao 

 E perchè dovresti avere delle property per un modulo?
Beh c'è dall'inizio (> In una sub in un modulo:) :D
Allora in un modulo ho una sub che fa un calcolo, e va a memorizzare dati
in una tabella.
Ad un certo punto propone all'utente una descrizione di un campo, se va
bene l'utente da OK e memorizza quella predefinita. Se non va bene l'utente
scrive quel che vuole e da OK.
Il problema è che l'utente può scrivere quel che vuole e premere ANNULLA
per lasciare la scritta di default.
Quindi dal modulo non posso sapere se sono uscito con OK o ANNULLA, e
quindi fare SEMPRE la get non mi va bene.
Per questo l'unica cosa sarebbe che da frmDescMov se premo OK vado a fare
una Let, altrimenti no.
Essendo richiamata da una SUB, non mi pare di poter definire una property
Let per un modulo.
QUindi farei una 
frmdDescMov.show vbmodal
e poi da qui dovrei fare
if OK then
  Modulo1.LetDescMov=txtDescMov.text
endif
unload me
Apparte non credo si possa fare, ma in ogni caso mi merita definire una
variabile global e accederci dal modulo e dalla form
[MODULO1]
Public RetDescMovB as strin
    RetDescMovB = DescMovB 'Descrizione di input predefinita
    Load frmDescMovim
    frmDescMovim.Show vbModal
    DescMovB = RetDescMovB
[FRMDESCMOVIM]
alla LOAD:
txtDescMov.Text = RetDescMovB
All'uscita
if OK then
  RetDescMovB = txtDescMov.Text
endif
unload me
Grazie :D

 variabile global e accederci dal modulo e dalla form
E basta con queste variabili globali!!!
Nel 99% dei casi quello che puoi fare con una var globale può essere fatto 
più razionalmente e più OOP con una proprietà nella classe giusta.
Nel form ci metti (sarebbe meglio fare una property readonly, ma per 
semplicità facciamo così)
Public ModalResult As VbMsgBoxResult
Nel Form_Load
ModalResult = vbCancel
Nel cmdOk_Click
ModalResult = vbOk
Quando richiami il form
frmDescMovim.Show vbModal
if frmDescMovim.ModalResult = vbOk Then
    Modulo1.LetDescMov = frmDescMovim.Descrizione ' E NON txtDescMov.text
end if
Unload frmDescMovim
Set frmDescMovim = Nothing
Ciao 

 end if
Chiamatemi stupido ma non sapevo di poter accedere ad una variabile in quel
modo :)
Ho messo una booleana che setto a True o False (dato che non c'era una
msgbox e quindi mi bastava quello)
Grazie infinitamente :)
[per google]Nel modulo ho messo questo
    Load frmDescMovim
    frmDescMovim.LetDescMovim = DescMovB
    frmDescMovim.Show vbModal
    If frmDescMovim.BoolResult = True Then
      DescMovB = frmDescMovim.GetDescMovim
    End If


 Grazie infinitamente :)
Avevo il problema che al query unload non chiudeva mai quindi ho risolto
(nel form come generale)
Public Chiudi As Boolean
Alla Load
  Chiudi=false
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If Not Chiudi Then
  Me.Hide
  Cancel = True
End If
End Sub
E nel modulo:
    Load frmDescMovim
    frmDescMovim.LetDescMovim = DescMovB
    frmDescMovim.Show vbModal
    If frmDescMovim.BoolResult = True Then
      DescMovB = frmDescMovim.GetDescMovim
    End If
*    frmDescMovim.Chiudi = True


 *    frmDescMovim.Chiudi = True
Ovviamente sostitutita con una Property Let, e ora cambio anche la booleana
che mi dice OK/Annulla con una property (per esercizio diciamo :D)

 Spero ti sia utile. Ciao.
La prima volta chce l'ho letto ci ho capito molto poco, soprattuto non
sapevo che si potesse fare
form1.miaVariabile (avevo usato solo oggetti tipo form1.text1.text)
Ora però mi è chiaro, e ho usato tutte property.
Poi se mi dovesse ricapitare vedrò cosa mi merita :D
Tnx

 (nel form come generale)
Sì, hai ragione.
No, togli la Chiudi e togli tutto nella QueryUnload
Nei bottoni Ok e Annulla metti oltre a quello che già c'è
Me.Hide
Ciao 

 Me.Hide
Hai ragione, e io che mi ero messo a fare Let e Get a tutto spiano ;)