Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [VB.NET] usare una structure come membro di una classe

    Sono un nuovo utente di questo bel forum e voglio proporre al vostro giudizio un problema che non riesco a risolvere da autodidata.
    Sviluppo un software per la gestione delle escursioni di un piccolo gruppo speleologico di cui faccio parte.
    Ho sviluppato la seguente classe:

    codice:
    Imports Microsoft.VisualBasic
    
    Public Structure strctEscursionista
    
        'Campi della Structure
        Private _strNome As String
        Private _strGruppo As String
    
        'Proprietà della Structure
        Public Property Nome() As String
            Get
                Return _strNome
            End Get
            Set(ByVal value As String)
                _strNome = value
            End Set
        End Property
    
        Public Property Gruppo() As String
            Get
                Return _strGruppo
            End Get
            Set(ByVal value As String)
                _strGruppo = value
            End Set
        End Property
    End Structure
    
    Public Class ClsGestioneEscursioni
    
        'Campi della classe
        Private _dtaData As Date = Nothing
        Private _strLocalita As String = ""
        Private _strCavita As String = ""
        Private _strctEscursionisti() As strctEscursionista = Nothing
        Private _strRelazione As String = ""
    
    
        'Proprietà della classe
        Public Property Data() As Date
            Get
                Return _dtaData
            End Get
            Set(ByVal value As Date)
                _dtaData = value
            End Set
        End Property
    
        Public Property Localita() As String
            Get
                Return _strLocalita
            End Get
            Set(ByVal value As String)
                _strLocalita = value
            End Set
        End Property
    
        Public Property Cavita() As String
            Get
                Return _strCavita
            End Get
            Set(ByVal value As String)
                _strCavita = value
            End Set
        End Property
    
        Public Property Escursionisti(ByVal Indice As Integer) As strctEscursionista
            Get
                Return _strctEscursionisti(Indice)
            End Get
            Set(ByVal value As strctEscursionista)
                _strctEscursionisti(Indice) = value
            End Set
        End Property
    
        Public Property Relazione As String
            Get
                Return _strRelazione
            End Get
            Set(ByVal value As String)
                _strRelazione = value
            End Set
        End Property
    
    End Class
    in realtà la classe è più complessa, ma questo basta per esporvi il problema
    bene vengo al dunque, istanzio l'oggetto relativo alla classe e cerco di riempire i campi tramite le relative proprietà

    codice:
    	Dim escursione As New ClsGestioneEscursioni()
    
    	Dim strData = "#12/24/2010#"
    	escursione.Data = Date.Parse(strData)
    	escursione.Localita = "Teletotes"
    	escursione.Cavita = "Su Palu"
    	escursione.Escursionisti(0).Nome = "Nome1"
    	escursione.Escursionisti(0).Gruppo = "Gruppo1"
    	escursione.Escursionisti(1).Nome = "Nome2"
    	escursione.Escursionisti(1).Gruppo = "Gruppo2"
    	escursione.Escursionisti(2).Nome = "Nome3"
    	escursione.Escursionisti(2).Gruppo = "Gruppo3"
    	escursione.Relazione = "fatto un bel giro e trovati nuovi rami da esplorare ulteriormente in prossime escursioni"
    nelle 6 righe relative ai campi escursione.Escursionisti().Nome e escursione.Escursionisti().Gruppo mi viene segnalato questo errore

    Errore L'espressione è un valore, quindi non può essere la destinazione di un'assegnazione.

    sapete dirmi dove sbaglio?? Perché non posso riempire questi campi come gli altri??
    Grazie per la vostra pazienza

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da adhryan
    [...]
    nelle 6 righe relative ai campi escursione.Escursionisti().Nome e escursione.Escursionisti().Gruppo mi viene segnalato questo errore

    Errore L'espressione è un valore, quindi non può essere la destinazione di un'assegnazione.

    sapete dirmi dove sbaglio?? Perché non posso riempire questi campi come gli altri??
    Il motivo è indicato nel messaggio di errore: trattandosi di una struttura, quando la proprietà ritorna un valore, cioè quando il "getter" lo restituisce, ti viene "consegnata" una struttura già inizializzata con i valori attualmente impostati; all'interno dell'oggetto hai la possibilità di variare i valori dei campi del membro privato che appartiene al tipo di struttura, ma non puoi utilizzarlo nella proprietà restituendolo come se fosse un "riferimento", essendo le strutture un tipo "valore".

    Converti la Struct in una Class, creane un'istanza nell'oggetto e sei a posto.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    grazie alka per il tuo aiuto, posso chiederti per favore, se puoi digitare due righe di codice per aiutarmi a capire meglio...
    Inoltre, non esiste proprio un modo per farlo con una structure??

    Grazie ancora

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da adhryan
    grazie alka per il tuo aiuto, posso chiederti per favore, se puoi digitare due righe di codice per aiutarmi a capire meglio...
    Il codice di esempio per evidenziare il problema l'hai già scritto tu.
    Che cosa dovrei scrivere io di diverso?

    Originariamente inviato da adhryan
    Inoltre, non esiste proprio un modo per farlo con una structure??
    Dovresti creare delle proprietà che vadano a restituire/impostare i campi specifici della struttura, ma non è chiaro che vantaggio ci sia né che senso abbia.

    Riassumendo, non capisco questo accanimento nell'usare una Struct: nel contesto in cui viene utilizzato, da solo problemi e nessun vantaggio visibile.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Grazie ancora alka, e scusa se ti scrivo delle cose senza senso
    sono nuovo nella oop e purtroppo qualche concetto non l'ho ancora bene assimilato.
    Allora ho seguito il tuo prezioso consiglio, ho modificato il codice così:

    codice:
    Imports Microsoft.VisualBasic
    
    Public Class clsEscursionista
    
        'Campi della classe
        Private _strNome As String
        Private _strGruppo As String
    
        'Proprietà della classe
        Public Property Nome() As String
            Get
                Return _strNome
            End Get
            Set(ByVal value As String)
                _strNome = value
            End Set
        End Property
    
        Public Property Gruppo() As String
            Get
                Return _strGruppo
            End Get
            Set(ByVal value As String)
                _strGruppo = value
            End Set
        End Property
    End Structure
    
    Public Class ClsGestioneEscursioni
    
        'Campi della classe
        Private _dtaData As Date = Nothing
        Private _strLocalita As String = ""
        Private _strCavita As String = ""
        Private _clsEscursionisti() As clsEscursionista = Nothing
        Private _strRelazione As String = ""
    
    
        'Proprietà della classe
        Public Property Data() As Date
            Get
                Return _dtaData
            End Get
            Set(ByVal value As Date)
                _dtaData = value
            End Set
        End Property
    
        Public Property Localita() As String
            Get
                Return _strLocalita
            End Get
            Set(ByVal value As String)
                _strLocalita = value
            End Set
        End Property
    
        Public Property Cavita() As String
            Get
                Return _strCavita
            End Get
            Set(ByVal value As String)
                _strCavita = value
            End Set
        End Property
    
        Public Property Escursionisti(ByVal Indice As Integer) As clsEscursionista
            Get
                Return _clsEscursionisti(Indice)
            End Get
            Set(ByVal value As clsEscursionista)
                _clsEscursionisti(Indice) = value
            End Set
        End Property
    
        Public Property Relazione As String
            Get
                Return _strRelazione
            End Get
            Set(ByVal value As String)
                _strRelazione = value
            End Set
        End Property
    
    End Class
    e lo uso così:

    codice:
    	Dim escursione As New ClsGestioneEscursioni()
    
    	Dim strData = "#12/24/2010#"
    	escursione.Data = Date.Parse(strData)
    	escursione.Localita = "Località"
    	escursione.Cavita = "Cavità"
    	escursione.Escursionisti(0).Nome = "Nome1"
    	escursione.Escursionisti(0).Gruppo = "Gruppo1"
    	escursione.Escursionisti(1).Nome = "Nome2"
    	escursione.Escursionisti(1).Gruppo = "Gruppo2"
    	escursione.Escursionisti(2).Nome = "Nome3"
    	escursione.Escursionisti(2).Gruppo = "Gruppo3"
    	escursione.Relazione = "fatto un bel giro e trovati nuovi rami da esplorare ulteriormente in prossime escursioni"
    ora mi viene restituito questo errore:

    Riferimento a un oggetto non impostato su un'istanza di oggetto.
    Riga 106: Public Property Escursionisti(ByVal Indice As Integer) As clsEscursionista
    Riga 107: Get
    Riga 108: Return _clsEscursionisti(Indice) <--- l'errore è in questa riga
    Riga 109: End Get
    Riga 110: Set(ByVal value As clsEscursionista)


    invece se uso la classe in questo modo:

    codice:
            Dim objEscursionista As New clsEscursionista()
    	Dim escursione As New ClsGestioneEscursioni()
    	
    	Dim strData = "#12/24/2010#"
    	escursione.Data = Date.Parse(strData)
    	escursione.Localita = "Località"
    	escursione.Cavita = "Cavità"
    	objEscursionista.Nome = k & "Nome1"
    	objEscursionista.Gruppo = k & "Gruppo1"
    	escursione.Escursionisti(0) = objEscursionista
    	objEscursionista.Nome = k & "Nome2"
    	objEscursionista.Gruppo = k & "Gruppo2"
    	escursione.Escursionisti(1) = objEscursionista
    	objEscursionista.Nome = k & "Nome3"
    	objEscursionista.Gruppo = k & "Gruppo3"
    	escursione.Escursionisti(2) = objEscursionista
    	escursione.Relazione = "fatto un bel giro e trovati nuovi rami da esplorare ulteriormente in prossime escursioni"
    mi restituisce questo errore:

    Riferimento a un oggetto non impostato su un'istanza di oggetto.
    Riga 109: End Get
    Riga 110: Set(ByVal value As clsEscursionista)
    Riga 111: _clsEscursionisti(Indice) = value <--- l'errore è in questa riga
    Riga 112: End Set
    Riga 113: End Property

    sai dirmi dove sbaglio??
    Grazie per la tua pazienza

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Nel tuo codice tu specifichi un indice per Escursionisti, ma non crei una lista di escursionisti da nessuna parte...

    Manca un pezzo di codice o mi è sfuggito qualcosa?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Caro alka grazie come sempre per la tua risposta.
    Allora, prima di tutto devo dire che una parte di codice è rimasta dal copia e incolla, il codice giusto (sbagliato ) è questo:

    codice:
            Dim objEscursionista As New clsEscursionista()
     	Dim escursione As New ClsGestioneEscursioni()
    
     	Dim strData = "#12/24/2010#"
     	escursione.Data = Date.Parse(strData)
     	escursione.Localita = "Località"
     	escursione.Cavita = "Cavità"
     	objEscursionista.Nome = "Nome1"
     	objEscursionista.Gruppo = "Gruppo1"
     	escursione.Escursionisti(0) = objEscursionista
     	objEscursionista.Nome = "Nome2"
     	objEscursionista.Gruppo = "Gruppo2"
     	escursione.Escursionisti(1) = objEscursionista
     	objEscursionista.Nome = "Nome3"
     	objEscursionista.Gruppo = "Gruppo3"
     	escursione.Escursionisti(2) = objEscursionista
     	escursione.Relazione = "fatto un bel giro e trovati nuovi rami da esplorare ulteriormente in prossime escursioni"
    ora tu mi chiedi
    Nel tuo codice tu specifichi un indice per Escursionisti, ma non crei una lista di escursionisti da nessuna parte...
    ma la lista è membro della classe ClsGestioneEscursioni, il problema è che se io la popolo con uno dei due modi che ho segnalato nel precedente post mi restituisce gli errori che ho segnalato.

    A me serve riuscire a popolare la scheda dell'escursione, ora il numero degli escursionisti varia da escursione ad escursione per questo ho usato un vettore di tipo clsEscursionista.
    Forse è meglio usare una lista, ma il problema è che non riesco a popolare il vettore perchè mi restituisce l'errore che ho segnalato

    Ti sarei veramente gratto se potessi farmi un semplice esempio di come popolare un membro di una classe di tipo classe come quella che serve a me
    Sono sicuro che due righe di codice sono molto più esplicative di mille post

    In ogni caso di ringrazio per la tua pazienza e disponibilità sin qui accordatami

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da adhryan
    ma la lista è membro della classe ClsGestioneEscursioni, il problema è che se io la popolo con uno dei due modi che ho segnalato nel precedente post mi restituisce gli errori che ho segnalato.
    Quella non è una lista, ma un array, pertanto deve essere "dimensionato" prima di poterlo utilizzare, allocando spazio per tanti elementi quanti sono quelli che vanno inseriti nell'array.

    Io suggerisco invece di utilizzare una vera e propria lista, sfruttando i Generics, cioè
    List(Of T).

    Nel link che fa riferimento alla documentazione MSDN, troverai esempi di utilizzo.

    Scrivere codice in questo contesto, secondo me, non è utile poiché quello che manca sono alcuni concetti base da approfondire usando la relativa documentazione, altrimenti a ogni ostacolo leggermente diverso dal precedente ci si ferma di nuovo subito, mentre è più proficuo chiarire il concetto di base.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.