tempo fa in una discussione è venuto fuori questo codice
Public Struct strutturaModello
prB As Byte
prI As Integer
End Struct
Private prima As New StrutturaModello[]
Public Sub Form_Open()
Dim a As Byte
Dim seconda As StrutturaModello
For a = 0 To 9
seconda = New StrutturaModello
With seconda
.prB = a
.prI = 1000 + a
End With
prima.Add(seconda)
Next
End
si definisce un array dinamico di una struttura e funziona bene
Il mio problema è che la definizione della struttura e dell'array
Public Struct strutturaModello
prB As Byte
prI As Integer
End Struct
Private(public) prima As New StrutturaModello[]
le voglio mettere in in modulo, ma così facendo non funziona più
dove sbaglio?
ho provato a riferrirmi alla struttura con nomemodulo.StrutturaModello
ma nisba....
vediamo se ho capito
in questo caso avviene un passaggio di una classe in un altra
quello che vorrei fare io è costruire una struttura e creare un array dinamico con la stessa
questo in un modulo così da poterla vedere in tutti i form del progetto
' Gambas module file
Public Struct strutturaModello
prB As Byte
prI As Integer
End Struct
Public prima As New StrutturaModello[]
inoltre vorrei aggiungere e togliere elementi a questo array dentro i form stessi
in un altro progetto avevo creato una classe ( e funzionava) , ma ora vorrei provare con una struttura
in questo caso avviene un passaggio di una classe in un altra
Più precisamente avviene un passaggio dei valori, contenuti in una variabile di tipo Struttura, da una Classe ad un'altra.... ma con il Modulo è sostanzialmente uguale.
Ti passo, infatti, un semplicissimo esempio.
Nella Classe principale avremo questo codice:
Public Module1 As New Module1 ' Istanziamo il Modulo
Public Struct strutturaModello
prB As Byte
prI As Integer
End Struct
' Dichiariamo la variabile della Struttura come array con numero di elementi indefinito:
Private prima As New StrutturaModello[]
Public Sub Form_Open()
Dim a As Byte
' Dichiariamo un'altra variabile del tipo della Struttura modello:
Dim seconda As StrutturaModello
' Assegnamo i valori agli elementi della variabile normale di tipo Struttura:
For a = 0 To 9
seconda = New StrutturaModello
With seconda
.prB = a
.prI = 1000 + a
End With
' La variabile Struttura array vuole una variabile Struttura - non array - del tipo "StrutturaModello":
prima.Add(seconda)
Next
' Passiamo i valori contenuti dalla variabile array di tipo Struttura al Modulo:
Module1.prova(prima)
End
Nel Modulo avremo:
' Dichiariamo una "Struttura" avente medesimi campi della "Struttura"
' presente nella Classe principale, e medesimo nome.
' Anche i nomi degli elementi della Struttura saranno uguali
' a quelli della Struttura dichiarata nella Classe principale:
Public Struct strutturaModello
prB As Byte
prI As Integer
End Struct
' La routine, che viene richiamata dalla funzione chiamante presente nella Classe principale,
' riceve la variabile dalla Classe principale e l'assegna alla variabile di tipo "Struttura" del corrente Modulo:
Public Sub prova(var2 As StrutturaModello[])
Dim j As Byte
For j = 0 To 9
With var2[j]
Print .prB, .prI
End With
Next
End
Provalo un po'.
quello che vorrei fare io è costruire una struttura e creare un array dinamico con la stessa
questo in un modulo così da poterla vedere in tutti i form del progetto
L'esempio, sopra esposto, funziona regolarmente anche se la Struttura principale è dichiarata ed istanziata all'interno di un Modulo_1, e se i valori contenuti dalla relativa variabile vengono passati ad una variabile, di quel analogo tipo di Struttura, dichiarata in un Modulo_2. Quindi, appunto, passaggio di valori fra due Moduli (e non più fra Classe principale e Modulo).
ok
provato funziona
Domanda:
in un form secondario per vedere la struttura appena creata
devo scrivere
label1.text=ClassePrincipale.Prima[0].prB
naturalmente se ho dichiarato Prima Public
ma se dal form secondario volessi aggiungere un altro item all'array come devo fare?
in sostanza la mia struttura dati viene gestita in più form nei quali viene letta e aggiornata
Il progetto parte dal form principale, anche se sto pensando che potrebbe essere utile farlo partire dal Main()
Con una classe sarebbe più semplice?
Non so se può essre correto ma ho provato così
nel modulo Variabili
Public Struct Ricetta
nome As String
End Struct
public struttura as new Ricetta
Public array As New Ricetta[]
nel form
' Gambas class file
Public Sub Form_Open()
dim a as object
a = variabili.struttura
a.nome = "Pippo"
Variabili.array.Add(a)
end
così riesco a vederlo in tutto il progetto
Non so però se è corretto dal punto di vista formale
ps
come si fa a postare il codice come sopra?
Non so se può essre correto ma ho provato così
Non avevo mai fatto la prova al contrario: da un modulo alla classe principale. Il risultato dà esito negativo; suppongo perché il Modulo, appunto, non è una Classe con proprie proprietà ed elementi anche utilizzabili altrove, bensì esso ha il compito meramente di svolgere una o più funzioni gestendo dati ricevuti da altrove.
La cosa si può fare, se invece dichiari ed utilizzi una Classe secondaria anziché un Modulo.
Esempio:
Nella Classe principale va comunque dichiarata la Struttura in modo identico a quella dichiarata nella Classe secondaria:
Public class1 As New Class1
Public Struct Ricetta
nome As String
End Struct
Public ricettina As New Ricetta
Public Sub Form_Open()
ricettina.nome = "prova"
' Ecco: chiamo ed utilizzo una variabile, di tipo Struttura,
' dichiarata ed istanziata nella Classe secondaria:
class1.struttura.nome = " + prova"
ricettina.nome &= class1.struttura.nome
' Ecco: chiamo ed utilizzo l'altra variabile, di tipo Struttura,
' dichiarata ed istanziata nella Classe secondaria:
class1.array.Add(ricettina)
Print Class1.array[0].nome
End
Nella Classe secondaria (al posto del Modulo):
Public Struct Ricetta
nome As String
End Struct
Public struttura As New Ricetta
Public array As New Ricetta[]