PDA

View Full Version : [VB6] Potreste spiegarmi queste poche righe per favore?


robnet77
11-07-2003, 14:03
Si tratta di implementare una funzione write-once/read-many, utilizzando una variabile statica, in una classe.


Private m_ID As Long ' all'interno del modulo di classe



Property Get ID() As Long
ID = m_ID
End Property

Public Property Let ID(ByVal newValue As Long)
Static InitDone As Boolean
If InitDone Then Err.Raise 1002, , "Write-once property"
InitDone = True
m_ID = newValue
End Property



quando creo una variabile di tipo boolean, per impostazione predefinita questa è True o False (immagino la 2a ipotesi)?
Quando è che viene creata questa variabile InitDone? Forse quando si fa riferimento per la prima volta alla proprietà ID (in runtime)?

Se così fosse, la variabile, essendo statica, provoca sempre un errore dopo la prima "chiamata" essendo sempre True?

Grazie mille... :)

tas
11-07-2003, 14:25
Hai capito perfettamente. In VB6, le variabili numeriche (comprese quelle boolean) vengono inizializzate sempre sul valore 0, che corrisponde a False per il tipo Boolean (0=False, -1=True). Nell'esempio che hai riportato, si sfrutta il fatto che la variabile InitDone, dichiarata Static, non perde il valore contenuto una volta terminata la Property Let. In questo modo, ad un successivo tentativo di accesso alla proprietà, InitDone risulta True e viene generato un errore di runtime.

robnet77
11-07-2003, 14:33
grazie mille, il discorso di 0 = False e -1 = True mi era sfuggito :)

robnet77
11-07-2003, 14:53
ok, passiamo oltre: :p


Property Get CompleteName() As String
CompleteName = FirstName & " " & LastName
End Property

Property Let CompleteName(ByVal newValue As String)
Dim items() As String
items() = Split(newValue)
If UBound(items) <> 1 Then Err.Raise 5
FirstName = items(0): LastName = items(1)
End Property


siamo sempre nella stessa classe, quello che non capisco è la funzione Split :confused: (che dovrebbe dividere)

Questo codice dovrebbe servire per assegnare le proprietà FirstName e LastName in base a una terza proprietà CompleteName, ma non capisco chi è che assegna un valore al parametro newValue e come i due elementi dell'array vengano divisi... :muro:

tas
11-07-2003, 17:01
La Property Let CompleteName viene richiamata quando il client (cioè quella porzione di codice che usa la proprietà di questa classe) fa una cosa tipo questa:
Dim c As QuestaClasse
c.CompleteName = "Mario Rossi"
cioè assegna un valore alla proprietà CompleteName.
Questa azione richiama la Property Let, la quale in sostanza cerca di dividere il nome dal cognome per memorizzarli nei due campi separati FirstName e LastName.
Viene per prima cosa dichiarato un array dinamico items(), senza specificarne la dimensione. La funzione Split tenta di spezzettare il valore passato alla proprietà ("Mario Rossi") memorizzato temporaneamente nella variabile newValue. Split spezza la stringa e mette i risultati in items() in questo modo:
items(0) = "Mario"
items(1) = "Rossi"
L'istruzione If si accerta che l'array sia composto da soli due elementi, l'ultima riga assegna ai campi FirstName e LastName i valori così ottenuti.

Per capire meglio la funzione Split guardati l'help in linea di VB oppure in MSDN (se ce l'hai).

robnet77
11-07-2003, 17:17
grazie, ho già guardato l'MSDN, ho i due cd di VB6 Learning Edition.

Ho ancora questi due dubbi:

1) in quale modo la stringa viene memorizzata in newValue? Intendo quale istruzione fa ciò?

2) La funzione Split quali separatori utilizza per dividere una stringa?

Ciao e grazie ancora! :)

tas
11-07-2003, 18:26
Originally posted by "robnet77"

1) in quale modo la stringa viene memorizzata in newValue? Intendo quale istruzione fa ciò?
2) La funzione Split quali separatori utilizza per dividere una stringa?


1) c.CompleteName = "Monica Bellucci" :)

2) la funzione Split ha un parametro opzionale per specificare il carattere separatore, guardati la documentazione

robnet77
12-07-2003, 09:02
Originally posted by "tas"



1) c.CompleteName = "Monica Bellucci" :)

2) la funzione Split ha un parametro opzionale per specificare il carattere separatore, guardati la documentazione

grazie mille ancora! :)