Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[VB6] Array come proprietà di una classe

39 views
Skip to first unread message

Alice Casa

unread,
Mar 13, 2010, 9:59:23 AM3/13/10
to
Volevo chiedrvi cortesemente un aiuto , giusto per mettermi nella giusta
direzione.
Devo realizzare una specie di agenda per il mio lavoro (sono un macchinista
fs).
Dunque vorrei modellare un classe che mi permetta di accedere ai dati di
ogni giornata di lavoro di ogni giorno dell'anno.

Quindi se la 43° giornata ho fatto 3 treni , e voglio sapere la stazione di
partenza del secondo treno con la seguente istruzione vorrei estrarre il
dato:

MsgBox Anno2010(43).Treno(2).StazPart

oppure se voglio sapere il numero di locomotore sempre della stessa giornata
ma del 3° treno :

MsgBox Anno2010(43).Treno(3).NumLoco

Tutto questo lo so fare creandomi due tipi e due array WorkDay(365) =
giorni in un anno e Treno(10) = numero di treni effettuati in giornata.

********************************************
Public Type tpTreno
NumLoco As String
NumTreno As String
StazPart As String
StazArr As String
End Type

Public Type tpLavoro
Treno(1 To 10) As tpTreno
Chiave As String
Condotta As Integer
Impegno As Integer
End Type

Public Workday(365) As tpLavoro

L'esecuzione è corretta :
********************************************
MsgBox Workday(1).Treno(1).NumTreno
********************************************
Provando con le classi:
Creo 2 classi : CLavoro e CTreno ; all' interno della classe CLavoro
come faccio a creare una proprietà di tipo CTreno che mi gestisca l'array
Treno(10) e che mi permette di ottenere il risultato visto più sopra con le
strutture tpTreno e tpLavoro ?
Grazie .... sono benvenuti anche degli esempi ;-))

Daniele


Luca D

unread,
Mar 13, 2010, 10:47:34 AM3/13/10
to

Non ho VB6 sottomano, non mi ricordo esattamente se era possibile
rendere direttamente pubblici gli array; mi pare che quelli a
dimensione fissa non si possa, ma quelli a dimensione variabile si...
se davvero è così, allora è sufficente che tu lo dichiari dinamico e
lo inizializzi a 10 nel class_initialize

Se invece ricordo male, allora hai comunque alternative che
sicuramente funzionano:

a) Se non devi essere strettamente legato al tipo array per altri
motivi, usa una semplice collection, che è molto più flessibile

Private mTreno As Collection

Sub Class_Initialize
dim i as integer

Set mTreno = New Colelction
For i = 1 to 10
mTreno.Add New CTreno
Next
End Sub

Public Property Get Treno() As Collection
Set Treno = mTreno
End Property

b) Dichiari un array privato, e lo rendi accessibile tramite una
Publci Property Get opportuna; un po' più scomodo rispetto al caso a)
se per caso le dimensioni della lista cambiano a runtime, ma se 10 è
un tuo limite fisso di design, allora probabilmente questa alternativa
è migliore perchè più controllata rispetto alla prima (l'array/
collection non è direttamente accessibile dall'esterno, e quindi, ad
esempio, non può essere ridimensionata o svuotata per errore)

'In CLavoro
Private arrayTreni(1 to 10) As CTreno

Sub Class_Initialize
dim i as integer

For i = 1 to 10
arrayTreni(i) = New CTreno
Next
End Sub

Public Property Get Treno(ByVal Index as Long) As CTreno

'TODO: controlli di correttezza dell'indice
Treno = arrayTreni(Index)
End Property

In entrambi i casi, il codice esterno si può riferire al singolo treno
con la sintassi "lavoro.treno(indice)"

Alice Casa

unread,
Mar 13, 2010, 2:46:00 PM3/13/10
to
Ciao Luca ,
grazie della risposta.

Ora però dopo aver dichiarato la variabile WorkDay (Dim WorkDay As CLavoro)
nella sezione dichiarazioni generali del form , e nella routine Form_Load
aver creato l'oggetto (Set WorkDay = New CLavoro),

appena avvio il progetto mi appare l'errore :

"Variabile oggetto o variabile del blocco With non impostata (errore 91)"
con la riga selezionata sulla routine che mi hai consigliato

Private Sub Class_Initialize()
Dim i As Integer

For i = 1 To 10
arrayTreni(i) = New CTreno <===== [RIGA SELEZIONATA DAL DEBUG]
Next

End Sub

Che posso fare?

Ti ringrazio ancora
ciao
Daniele

"Luca D" <antan...@yahoo.it> ha scritto nel messaggio
news:11384000-a511-40bd...@j27g2000yqn.googlegroups.com...

Alice Casa

unread,
Mar 13, 2010, 4:48:54 PM3/13/10
to
WorkDay sarebbe la variabile Lavoro (come l'hai chiamata tu)

ciao

"Alice Casa" <indelicat...@alice.it> ha scritto nel messaggio
news:4b9beb8f$0$1113$4faf...@reader2.news.tin.it...

Alice Casa

unread,
Mar 13, 2010, 6:56:42 PM3/13/10
to
Sembra funzionare!!!

Ho risolto modificando ciò che mi hai scritto :

In pratica ho aggiunto le due istruzioni "SET".

Public Property Get Treno(ByVal Index As Long) As CTreno
Set Treno = arrayTreni(Index)
End Property

Private Sub Class_Initialize()


Dim i As Integer
For i = 1 To 10

Set arrayTreni(i) = New CTreno
Next
End Sub
==============================================================


"Alice Casa" <indelicat...@alice.it> ha scritto nel messaggio

news:4b9c085d$0$817$4faf...@reader5.news.tin.it...

0 new messages