Newsgroup: it.comp.lang.visual-basic
Titolo: Ciclare elementi di una struttura dati

Salve, č possibile poter ciclare gli elementi di una variabile di tipo
struttura?
Es. dichiaro nel seguente modo una variabile:
Type tRec
    campo_01 As String * 10
    campo_02 As String * 20
    campo_03 As String * 30
End Type
.
.
.
Dim l_tRec As tRec
E' possibile poter utilizzare un ciclo For per selezionare tutti gli
elementi?
Grazie
Tango

 elementi?
Sì, con
Type tRec
    campo(1 to 3)As String * 10
End Type
Che è anche più flessibile (metti che domani decidi di aggiungere 1 o più
campi, se usi la Ubound nei cicli non devi toccare una sola riga di codice).
Ciao

 Che è anche più flessibile...
'nzomma
campi tutti uguali, sia come nome che come tipo ;)
Se vuoi flessibilità, usa una classe, si usa dire. In omaggio ti danno pure
le property e molti altri accessori.
Come si fa ad enumerare le property di una classe? Boh! dicono si possa fare
con la "TypeLib Information" dll. (tlbinf32.dll), ma non l'ho mai usata. Su
MSDN dovrebbe esserci qualcosa, ma dubito che per le esigenze di Tango valga
la pena affrontare 'sto calvario.
Ciao, Silv:o)

 la pena affrontare 'sto calvario.
Appunto.
Le classi sono tutta un'altra cosa.
E non di certo una struttura :)
Ciao


 E non di certo una struttura :)
Perň le property si referenziano allo stesso modo dei membri delle
strutture, e la dichiarazione č quasi uguale (a parte un "as New" o
un'istruzione Set in piů).
Secondo me vale quasi sempre la pena utilizzare classi anziché strutture.
Non c'č assolutamente nessuna fatica da fare, e ti ritrovi con un oggetto di
gran lunga piů potente.
Ma magari sto consigliando di sparare ai passeri col cannone... ;)
Che tu sappia, richiedono molte piů risorse delle strutture?
Se poi ci fosse un modo facile per enumerare nomi e tipi dei membri, sarebbe
il massimo.
Silv:o)

> Ma magari sto consigliando di sparare ai passeri col cannone... ;)
LOL
Ciao
Bald0z

 il massimo.
Per enumerarli c'è come dicevi la tlbinfo32.dll.


il massimo.
Non e' poi cosi' difficile.
Sotto la firma segue un esempio di codice minimale per dare l' idea.
ciao, hal
----------------------------------------------------------------------------------------
Ingredienti: un modulo .bas ed una classe .cls
Preparazione:
1) nominare la classe come myClass e inservi il seguente codice:
------- inizio codice ------
Option Explicit
Public Property Get Pippo() As Variant
End Property
Public Property Let Pippo(ByVal vNewValue As Variant)
End Property
Public Property Get Pluto() As Variant
End Property
Public Property Let Pluto(ByVal vNewValue As Variant)
End Property
Public Property Get Paperino() As Variant
End Property
Public Property Let Paperino(ByVal vNewValue As Variant)
End Property
--------- fine codice ------
2) nei riferimenti del progetto inserire TypeLib Information (tlbinf32.dll)
3) nel .bas inserire il seguente codice:
----------- inizio codice ------
Public Sub Main()
    Dim cls As myClass
    Dim s As String
 
    Dim tlApp As TLI.TLIApplication
    Dim tlInfo As TLI.TypeInfo
    Dim tlMembers As TLI.Members
    Dim tlMember As TLI.MemberInfo
 
    Set tlApp = New TLI.TLIApplication
    Set cls = New myClass
    Set tlInfo = tlApp.InterfaceInfoFromObject(cls)
    Set tlMembers = tlInfo.Members
    For Each tlMember In tlMembers
        If (tlMember.InvokeKind = INVOKE_PROPERTYGET) Then
            s = s & vbLf & tlMember.Name
        End If
    Next tlMember
 
    MsgBox s
End Sub
---------- fine codice -----
4) premere F5 :-)