Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    110

    [VB.NET] Usare CType dinamicamente

    Lo scopo è sfruttare una routine simile a questo esempio. Attualmente è usata per la gestione dei pulsanti ma la vorrei estendere per il menù contestuale, per non duplicare il codice di gestione.
    I parametri di input sono gli stessi, un System.Object e un System.EventArgs ma se non sistemo il CType viene generato un cast exception.
    Quello che vorrei fare è un qualcosa del genere:

    Select Case CType(sender, sender.GetType() ).Text

    come si può fare?

    Codice PHP:
    Private Sub HandleListbox(ByVal sender As System.ObjectByVal e As System.EventArgsHandles butInsert.ClickInsertToolStripMenuItem.Click

    Select 
    Case CType(senderButton).Text
    Case bla bla
    End Select

    End Sub 
    Ciao
    Marco

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Non devi usare CType, in quanto a te non interessa convertire un tipo (peraltro, dovendo pure determinare automaticamente qual è il tipo da convertire).

    Se vuoi generalizzare un evento per più controlli, puoi verificare l'appartenenza dell'oggetto Sender passato come argomento al metodo ad una determinata classe specifica, o ad una classe che sia la base dalla quale discendono i controlli agganciati in qualche modo all'evento.

    Se non ricordo male, si usa l'operatore Is.

    Fai una ricerca su MSDN per ulteriori approfondimenti.

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

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    110
    Ho letto che a runtime non si può avere il tipo dell'oggetto:
    http://www.thescripts.com/forum/thread382022.html

    Per l'ennesima volta devo cercare un' alternativa (ma quando faranno un linguaggio che fa quello che voglio io???) per cui ho utilizzato questo sistema meno elegante ma funzionale:

    Codice PHP:
    Dim myText As String
    If TypeOf sender Is Button Then
        mytext 
    CType(senderControl).Text
    ElseIf TypeOf sender Is ToolStripMenuItem Then
        myText 
    CType(senderToolStripMenuItem).Text
    Else
        
    HandleMsg("HandleListbox: Controllo non gestito.")
        Exit 
    Sub
    End 
    If

    Select Case mytext
    Case "Apply"
        
    bla bla bla
    Case "Cancel"
        
    bla bla bla
    End Select 
    Ciao
    Marco

  4. #4
    codice:
    Private Sub HandleListbox(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butInsert.Click, InsertToolStripMenuItem.Click
    
    Select Case DirectCast(sender,Control).Text
    Case bla bla
    End Select
    
    End Sub
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Il codice di MItaly è sintetico e corretto, ma assumendo che l'evento venga generato solo da controlli, è anche inutile il cast, poichè basta il late binding:
    codice:
    Select Case sender.Text
    '...
    End Select

  6. #6
    Infatti era la prima soluzione che avevo proposto, poi ho editato perché mi pareva più pulito usare l'early binding.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    110
    Vi ringrazio per essere intervenuti
    La soluzione proposta da MItaly però non funziona, il messaggio dell'exception dice che non posso fare il cast di un oggetto ToolStripItem in un controllo. Se uso solo i pulsanti ovviamente funziona ma non si poneva nemmeno il problema.

    L'ultima soluzione di il totem invece funziona alla grande, sei un guru! Non mi sarei mai aspettato che fosse così semplice, mi ha fregato il tool di sviluppo che non mi proponeva le scelte (sono alle prime armi con .net) e quella discussione trovata su internet, mannaggia a loro

    Ora cerco informazioni su late ed early binding che ignoro assolutamente il significato

    Grazie ancora ad entrambi, ciao
    Ciao
    Marco

  8. #8
    Originariamente inviato da marcomd
    La soluzione proposta da MItaly però non funziona, il messaggio dell'exception dice che non posso fare il cast di un oggetto ToolStripItem in un controllo.
    Giusto, i ToolStripItem non derivano da Control.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da marcomd
    Per l'ennesima volta devo cercare un' alternativa (ma quando faranno un linguaggio che fa quello che voglio io???) [...]
    Temo che non sia un problema di funzionalità del linguaggio, ma più una limitazione che incontri poiché vuoi utilizzare a tutti i costi un procedimento o un sistema inadatto o meno "pulito" per risolvere il tuo problema.

    Spiega magari più dettagliatamente le finalità della tua applicazione: c'è senz'altro un metodo migliore per fare quanto stai chiedendo, senza scomodare l'uso di CType o altre metodologie correlate che non sono forse così limitative, ma semplicemente inadatte alla risoluzione del problema, come dicevo prima.

    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.