Newsgroup: it.comp.lang.visual-basic
Titolo: VB e oggetti: le form

proveniendo da una programmazione ad oggetti imparata con Java, ho
qualche problema ad adattarmi alla gestione oggetti del VB.
In particolare, come faccio a passare ad un form un oggetto in maniera
tale che questo ne possa modificare le proprietà e poi restituirlo in
fase di chiusura?
So che ci sono i moduli, ma dal punto di vista della programmazione OO
non mi sembrano il massimo


Le form sono a tutti gli effetti degli oggetti come gli altri; hanno
alcune particolarità, ma puoi trattarle tranquillamente allo stesso
modo del resto delle classi supportate da VB6.
Appurato che in VB6 non puoi intervenire sul costruttore di una
classe, per aggiungere dei parametri, quali sono le alternative OO per
passare una variabile oggetto ad un altro? Definire metodi o property
*pubbliche* a cui passare e/o da cui rileggere indietro il valore
richiesto.
Ci sono tante variazioni sul tema (property pubblica in lettura/
scrittura, metodo + property sola lettura ecc..), un esempio su tutti:
'nella sezione (generale), membro privato
'che mantiene il riferimento
Private mParametro As Classe1
Public Sub InitForm (ByVal a As Classe1)
  Set mParametro = a
End Sub
Public Property Get Result() As Classe1
  Set Result = mParametro
End Property
Nota Bene: una delle "stranezze" degli oggetti form in VB è quella di
esporre sempre una variabile autoistanziante, che ha lo stesso nome
della classe (cioè quando disegni una form stai creando la classe
'Form1', ma in realtà, implicitamente, stai definendo anche una
variabile oggetto globale 'Form1' di tipo 'Form1').
Quindi quando usi la classica sintassi "Form1.Show", il runtime in
realtà sta facendo, dietro le quinte, questo:
Dim Form1 As New Form1
Form1.Show
siccome la variabile nascosta Form1 ha scope globale, non viene mai
distrutta fintanto che il programma è in esecuzione; anche quando fai
Unload Form1, stai scaricando la parte "grafica" della form ma non
stai distruggendo l'istanza. Questo comportamento lo ottiene invece
con Unload Form1 seguito da Set Form1 = Nothing
Nota anche che il fatto che abbia usato "Dim As New" sopra non è
casuale, perchè questo innesca un altro comportamento implicito della
variabile globale Form1, ovvero il fatto che, anche dopo averla
impostato a Nothing, puoi subito riutilizzare la variabile, che verrà
di nuovo auto-istanziata.
Cosa vuol dire questo?
Per l'uso classico delle form non ha grande importanza, ma se
implementi una cosa come quella vista sopra allora è da tenere in
considerazione perchè comporta che:
- Il metodo InitForm è accessibile anche *prima* di caricare la Form
- La property Result è accessibile anche *dopo* aver scaricato la Form
- Il valore di mParametro non viene resettato dall'Unload della form,
per cui se la ricarichi senza averla impostata a Nothing, la variabile
è ancora valorizzata.
Spero di non averti confuso le idee con tutto questo discorso ma
questa è un aspetto delle form che non sempre viene accennato nei
manuali, e prima o poi ci sbattono le corna tutti quando cominciano
con membri pubblici.
Ci sarebbero altre considerazioni da fare, tipo che sarebbe in effetti
meglio smettere di usare la variabile implicita Form1 e dichiarare
esplicitamente le istanze di form ogni volta che servono, ma andiamo
troppo per le lunghe.... prova intanto così