Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    451

    [VB2010] Spiegazione funzionamento DirectCast

    Su internet ho trovato questo codice:

    codice:
    Private Class cMyItem
            Public Sub New(ByVal sMyVisibleTag As String, ByVal iMyIDTag As Integer)
                MyVisibleTag = sMyVisibleTag
                MyIDTag = iMyIDTag
            End Sub
    
    
            Public MyVisibleTag As String           'il tag visibile 
            Public MyIDTag As Integer               'il tag nascosto
    
            'Ovveride della funzione ToString
            Public Overrides Function Tostring() As String
                Return MyVisibleTag
            End Function
    
        
        End Class
    per aggiungere un valore lo si usa in questo modo

    codice:
    ListBox1.Items.Add(New cMyItem("tag visibile", "tag invisibile"))
    per richiamare un dato

    codice:
    With DirectCast(ListBox1.SelectedItem, cMyItem)
                Me.TextBox1.Text = .MyIDTag
    End With
    come mai succede questo??? io pensavo che ci volesse un array per fare questo, come fa esattamente a sapere quale dato recuperare???

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Ciao. Leggi qui

    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    451
    ok ho capito a cosa serve il DirectCast ma quì sembra che venga usato per fare tutto un altro tipo di operazione, quì cerca una string per sostituirne con un altra ... ma come funziona visto che non vedo un array che salva i dati?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    451
    anche se uso lo stesso codice su più listbox riesce sempre a sapere cosa richiamare... nessuno mi sa spiegare il funzionamento di questo codice?

    Grazie.

  5. #5
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Con quel codice, tu aggiungi alla ListBox elementi di tipo cMyItem.

    ListBox1.SelectedItem restituisce un oggetto di tipo Object, che tu converti (tramite DirectCast) in un oggetto di tipo cMyItem. Dopo di che, chiedi il valore di MyIDTag dell'istanza di cMyItem, che è il "campo nascosto", e lo setti come testo della TextBox.
    Spero di esserti stato utile

    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    451
    ok ora ho capito meglio come avviene al sostituzione ma continuo a non capire come avviene la memorizzazione dei dati visto che manca un array, dopo quello che mi hai detto io penso che dipenda da:

    codice:
    Public Sub New(ByVal sMyVisibleTag As String, ByVal iMyIDTag As String)
    visto che c'è New crea ogni volta una nuova class con l'Object di chi la invoca, così che poi DirectCast andrà a richiamare la class con l'Object che gli passo come se fosse il nome della classe e poi richiama i valori come se fosse una normale class.

    Giusto?

    Quindi su listbox troppo grandi e che cambiano sempre a lungo a dare vado a saturare tutta la ram... o sbaglio?

  7. #7
    Provo a fare un po' di chiarezza.

    Non c'è un array ma c'è una collection, che gestisci attraverso la proprietà Items della ListBox.

    Il metodo Add si aspetta un testo oppure un qualsiasi oggetto che abbia definito il metodo ToString. Appena aggiungi l'oggetto cMyItem la ListBox invoca il metodo ToString e lo fa apparire a video, mentre in memoria mantiene l'oggetto cMyItem vero e proprio, dentro la collection.

    Il metodo New così come lo hai riportato non è necessario, ma è utile perché riesci ad assegnare le due proprietà contestualmente alla creazione dell'oggetto. Senza quel metodo New avresti dovuto scrivere:
    codice:
    Dim obj As cMyItem
    
    obj = New cMyItem
    obj.MyVisibleTag = "tag visibile"
    obj.MyIDTag = 1
    
    ListBox1.Items.Add(obj)
    Essendo che la proprietà SelectedItem non è tipizzata (restituisce cioè un object generico), per estrarre una qualsiasi proprietà dell'oggetto originale (nel tuo esempio cMyItem) devi fare un cast.

    Se tu avessi scritto:
    codice:
    Me.TextBox1.Text = ListBox1.SelectedItem.MyIDTag
    avresti ricevuto un errore da parte del compilatore, in quanto la classe Object non ha nessuna proprietà o metodo chiamati MyIDTag.

    Chi non cerca trova.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    451
    ora si che ho capito tutto, grazie per la spiegazione ora mi è tutto più chiaro ecco perchè fa l'overrides sul Tostring(). Ci stavo uscendo pazzo per questa cosa!

    Grazie 1000

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.