Newsgroup: it.comp.lang.visual-basic
Titolo: [NET]  Cast non valido!!

Io sto .NET lo capisco sempre meno.
Ho una stringa presa da un NumericUpDown che debbo mettere in una matrice di
bytes per trasmetterla poi sulla seriale.
Da 0 a 9 va tutto bene, con "A", che fino a prova contraria è 41H, quindi in un
byte ci sta, ottengo sto errore del cavolo:
 
Cast non valido dalla stringa "A" al tipo 'Byte'.
Il codice è qui:
__________________
      Dim A$
     Dim A As String = Microsoft.VisualBasic.Right("0" & Hex$(Num), 2)
     For I As Integer = 1 To 2
         Inputs(j) = CByte(Mid$(A, I, 1)) Or &H30
       j = j + 1
___________
Come uscirne?
--
ciao
  Stefano

 ha
scritto:

Mi rispondo da solo:
con un ASC
         Inputs(j) = CByte(Asc(Mid$(A, I, 1))) Or &H30
sembra che funzioni
Sperem
--
ciao
  Stefano


Con ASC mi posso risparmiare anche l'OR
        Inputs(j) = CByte(Asc(Mid$(A, I, 1))) 
Deformazioni da vecchio programmatore ASM.
--
ciao
  Stefano

         Inputs(j) = CByte(Asc(Mid$(A, I, 1))) 
A me sa che stai usando 
VB.NET
 come se fosse VB6 :-)
Prova ad usare il metodo Substring del tuo oggetto stringa per estrarre 
i vari caratteri, e Convert.ToByte(stringa, 16) per effettuare la 
conversione.
-- 
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Saluti, VITRIOL

conversione.
mmm, proverò, anche se adesso sta trasmettendo la stringa giusta e non ho errori
strani.
Ho dato un occhiata al SubString e mi sembra un pelo incasinato, ma per
abituarsi a .NET bisogna incasinare le cose semplici, no?     :-)
--
ciao
  Stefano

 abituarsi a .NET bisogna incasinare le cose semplici, no?     :-)
Come incasinato? Basta che fai A.Substring(I, 1)
E' sempre meglio usare le funzioni native di .NET, e non quelle in 
Microsoft.VisualBasic, che sono lì solo per compatibilità, ma fanno giri 
strani :-)


strani :-)
Ho provato ma non ho trovato l'equivalente di ASC e poi ho questo errore:
 Inputs(j) = Convert.ToByte( Asc(A.Substring(I - 1, 1), 16))
Errore	1	Risoluzione dell'overload non riuscita perché nessun "Asc"
accessibile accetta questo numero di argomenti.
Comunque copio da MSDN:
{ Riferimenti del linguaggio Visual Basic - Funzioni di conversione del tipo }
"Di norma si consiglia di utilizzare le funzioni di conversione dei tipi di
Visual Basic anziché i metodi .NET Framework, ad esempio ToString(), sulla
classe Convert oppure su una singola classe o struttura di tipi. Le funzioni di
Visual Basic sono state appositamente progettate per l'interazione ottimale con
il codice Visual Basic e contribuiscono a rendere il codice sorgente più breve e
più facilmente leggibile. Inoltre, i metodi di conversione .NET Framework non
producono sempre gli stessi risultati delle funzioni di Visual Basic, ad esempio
quando vengono convertiti valori Boolean in Integer. Per ulteriori informazioni,
vedere Risoluzione dei problemi relativi ai tipi di dati."
Quindi non lo sconsigliano, almeno sembrerebbe.
--
ciao
  Stefano

 Quindi non lo sconsigliano, almeno sembrerebbe.
Guarda cosa fa la funzione Microsoft.VisualBasic.Mid() che hai usato tu, 
vista con Reflector:
Public Shared Function Mid(ByVal str As String, ByVal Start As Integer, 
ByVal Length As Integer) As String
     If (Start <= 0) Then
         Throw New 
ArgumentException(Utils.GetResourceString("Argument_GTZero1", New 
String() { "Start" }))
     End If
     If (Length < 0) Then
         Throw New 
ArgumentException(Utils.GetResourceString("Argument_GEZero1", New 
String() { "Length" }))
     End If
     If ((Length = 0) OrElse (str Is Nothing)) Then
         Return ""
     End If
     Dim length As Integer = str.Length
     If (Start > length) Then
         Return ""
     End If
     If ((Start + Length) > length) Then
         Return str.Substring((Start - 1))
     End If
     Return str.Substring((Start - 1), Length)
End Function
In pratica, alla fin fine, si riduce ad usare il metodo Substring, ma 
dopo un bel po' di altre operazioni, in modo da rendere il comportamento 
della funzione sovrapponibile a quello delle precedenti versioni di VB.
A questo punto, non è meglio usare direttamente Substring con la sua 
sintassi giusta? Tra l'altro questo facilita notevolmente una possibile 
migrazione verso altri linguaggi .NET, ad esempio C#.


 una stringa, considerandolo esadecimale?
No... Asc() ritorna il codice ASCII del carattere. Quindi vuoi i codici 
ASCII di tutti i caratteri della stringa?
Se è così, puoi utilizzare la funzione 
System.Text.Encoding.ASCII.GetBytes(), che rintronata direttamente i 
codici dei caratteri in un array di Byte.


 una stringa, considerandolo esadecimale?
No... Asc() ritorna il codice ASCII del carattere. Quindi vuoi i codici
ASCII di tutti i caratteri della stringa?
Se è così, puoi utilizzare la funzione
System.Text.Encoding.ASCII.GetBytes(), che ritorna direttamente i
codici dei caratteri in un array di Byte.
-- 


System.Text.Encoding.ASCII.GetBytes()
Sarebbe bello se funzionasse.
Ho provato tutte le combinazioni che mi sono ventute ma questa è quella che  mi
da meno errori.
      Dim A As String = Microsoft.VisualBasic.Right("0" & Hex$(k), 2)
     	 Dim bytes As Byte()
	 ReDim bytes(Len(A))
         System.Text.Encoding.ASCII.GetBytes(A, 0, Len(A), bytes())
Errore	1	Risoluzione dell'overload non riuscita perché nessun "GetBytes"
accessibile accetta questo numero di argomenti.
Comincio a provare repulsione per questo sistema di incasinamento artificioso
delle cose semplici che ha .NET.
--
ciao
  Stefano

 delle cose semplici che ha .NET.
Io sono niubbo cronico, ma comincio ad avere il dubbio che sia tu che lo 
incasini artificiosamente :-P


incasini artificiosamente :-P
Io semplicemente non ne capisco la logica di fondo, mentre mi è chiara quella
del VB classico.
Ma ho lo stesso tipo di problemi con il C++, quando mi tocca di adoperarlo
stresso sempre via Skype un 'guru' per mia fortuna pazientissimo, probabilmente
sono i miei 2 neuroni che sono particolari     :-(
A proposito, ho un altro problema, se non ti sei già stancato
Creo una matrice di controlli a runtime con una sub.
Quando cerco di accedere alle proprietà del controllo stesso mi da errore perchè
dice che è nothing.
Se vado a vedere con il debug nell'insieme delle label premendo il + mi fa
vedere tutti i controlli da 0 a n-1 come nothing escluso l'ultimo.
Come faccio a cambiare il .text della label se la vede nothing?
--
ciao
  Stefano

 dice che è nothing.
Ma tu hai istanziato l'oggetto Label usando la parola chiave New?
Es:
         Dim myLbl As New Label
         myLbl.Text = "Sono una label"


         myLbl.Text = "Sono una label"
Se faccio così:
      Dim Lb As New Label
      Dim a As String  = "SCARICO FILTRO"
       Lb = Me.Labels( 7)
       Lb.Text = a
Si incazza perchè è nothing, sembrerebbe che degli oggetti creati a runtime
tenga solo l'ultimo.
Boh
--
ciao
  Stefano

 Boh
Non capisco cosa vuoi fare... non riesco a seguire i tui pezzi di codice :-)
Io ho provato così, che è quello che farei io se volessi manipolare un 
gruppo di Label create a runtime:
	'Creo una collezione di Label
         Dim Labels As New Collections.Generic.List(Of Label)
	'Istanzio due Label a runtime
         Dim miaPrimaLabel As New Label
         Dim miaSecondaLabel As New Label
	'Le aggiungo alla collezione
         With Labels
             .Add(miaPrimaLabel)
             .Add(miaSecondaLabel)
         End With
	'Accedo alle proprietà tramite indice
         Labels(0).Text = "Io sono la prima"
         Labels(1).Text = "Io sono la seconda"
Vedi se puoi fare una cosa del genere anche nel tuo caso.


Boh
Difatti se lo faccio con 48 (l'ultimo) va bene e non da errori.
Se faccio invece
      Dim Lb As New Label
      Dim a$ = "SCARICO FILTRO"
      Lb.Text = a$
      Me.Labels(4) = Lb
non da errore ma non visualizza la scritta.    :-(((
--
ciao
  Stefano

Vedi se puoi fare una cosa del genere anche nel tuo caso.
Sigh
--
ciao
  Stefano

 non sia l'ultima dell'insieme.
Ti posto il codice completo della mia prova. A me sembra che funziona:
Public Class Form1
     Dim Labels As New Collections.Generic.List(Of Label)
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
         Dim miaPrimaLabel As New Label
         Dim miaSecondaLabel As New Label
         With Labels
             .Add(miaPrimaLabel)
             .Add(miaSecondaLabel)
         End With
         With Labels(0)
             .Text = "Io sono la prima"
             .Location = New Point(10, 10)
         End With
         With Labels(1)
             .Text = "Io sono la seconda"
             .Location = New Point(10, 30)
         End With
         For Each lb As Label In Labels
             Me.Controls.Add(lb)
         Next
     End Sub
     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button2.Click
         Labels(0).Text = "Ciao"
         Labels(1).Text = "Mondo"
     End Sub
End Class


         Next
Io creavo una label e la assegnavo direttamente ai controlli con .Add
Riuscivo a vederle ma poi restava disponibile solo l'ultima.
Solo l'oracolo poteva capire il perchč, non io.
Aggiungendo l'assegnazione alla fine adesso funziona tutto.
1000 grazie, ti sei meritato una VirtualBeerŽ.
Te ne offrirei volentieri anche una reale, se tu fossi nelle vicinanze.
--
ciao
  Stefano