Oppure

Loading
18/03/08 16:37
nala84
ciao a tutti!
sto provando a creare una chat utilizzando visual basic express edition 2008... ho provato ad eseguire le istruzioni site in tale sito:
vbasic.it/articoli/…


quindi ho inserito nel mio progetto Client tale codice:

Public Class Form1

Private Sub cmdConnetti_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdConnetti.Click
Static Stat As Boolean ' Variabile statica che contiene True se si è connessi e False se non
If Stat = False Then
If Len(txtIP.Text) > 0 And Len(txtPorta.Text) > 0 Then ' Se c'è sia l'IP sia la porta
TCP.Connect(txtIP, Val(txtPorta)) ' Si connette
cmdConnetti.Text = "Disconnetti"
Stat = True
lblStato.Text = "Connettendo"
Else
MsgBox("Dati mancanti!", vbExclamation)
End If
Else
TCP.Close() ' Chiude La connessione
Stat = False
lblStato.Text = "Chiudendo"
cmdConnetti.Text = "Connetti"
End If

End Sub



Private Sub TCP_ConnectEvent(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TCP.ConnectEvent
lblStato.Text = "Connesso"
End Sub
Private Sub TCP_CloseEvent(ByVal sender As Object, ByVal e As System.EventArgs) Handles TCP.CloseEvent
TCP.Close() ' Per chiudere definitivamente la socket senno rimane .State = sckClosing
lblStato.Text = "Disconnesso"
End Sub



Private Sub cmdInvia_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdInvia.Click
If Len(txtInvia) > 0 Then ' Se c'è qualcosa da spedire la spedisci
TCP.SendData(txtInvia.Text) ' Invia i dati
txtChat.Text = txtChat.Text & "locale> " & txtInvia.Text & vbCrLf
txtChat.SelectionStart= Len(txtChat.Text)
txtInvia.Text = vbNullString
lblStato.Text = "Inviando " & Len(txtInvia.Text) & "Bytes"
End If

End Sub

Private Sub TCP_SendComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles TCP.SendComplete
lblStato.Text = "Dati inviati con successo"

End Sub
Dim Description As String
Dim Scode As Long
Dim Source As String
Dim HelpFile As String
Dim HelpContext As Long
Dim CancelDisplay As Boolean

Private Sub TCP_Error(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_ErrorEvent) Handles TCP.Error
Dim Number As Integer

TCP.Close() ' Chiude la socket MsgBox "Errore TCP " & Number & vbCrLf & Description
lblStato.Text = "Errore TCP " & Number
End Sub

Private Sub TCP_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles TCP.DataArrival
Dim Data As String
Dim bytesTotal As Long
TCP.GetData(Data) ' Copia i dati del Buffer in entrata nella variabile Data e svuota il Buffer
lblStato.Text = "In arrivo " & bytesTotal & " bytes"
txtChat.Text = txtChat.Text & "remoto> " & Data & vbCrLf ' Aggiunge il Testo
' Imposta come inizio della selezione la fine, per lo scrolling automatico
txtChat.SelectionStart = Len(txtChat.Text)
End Sub
End Class

ma mi restituisce un avviso:
Variabile 'Data' passata per riferimento prima dell'assegnazione di un valore. È possibile che venga restituita un'eccezione dovuta a un riferimento con valore null in fase di esecuzione.

e mandandolo in esecuzione, infatti, mi genera 2 eccezioni:
- la prima cliccando sul bottone "invia"
- la seconda cliccando sul bottone "Connetti"

Qlc sa come aiutarmi??
aaa
21/03/08 13:00
Il Totem
Il warning che ti viene segnalato non c'entra con gli errori che si presentano a runtime. In pratica, il compilatore ti sta comunicando che la variabile Data non contiene niente (è Nothing) e che passandola ad un metodo potrebbero insorgere eccezioni. In questo caso, però, va bene che sia vuota, perchè verrà inizializzata all'interno del metodo GetData, quindi non ci devi badare.
'Qui Data = Nothing
Dim Data As String
Dim bytesTotal As Long
'Passando Nothing a un metodo si genera un warning
TCP.GetData(Data)


Il primo errore è dato dal fatto che invece di passare stringhe come parametri, passi degli oggetti TextBox. Quindi devi sostituire:
TCP.Connect(txtIP, Val(txtPorta))

con:
TCP.Connect(txtIP.Text, Val(txtPorta.Text))


Il secondo errore è dello stesso tipo:
If Len(txtInvia) > 0 Then

al posto di:
If Len(txtInvia.Text) > 0 Then


Ad ogni modo ti suggerisco di modificare quel codice, che è stato scritto in origine per VB6. Quindi dovresti sostituire cose di questo tipo:
Len(txtIP.Text) -> txtIp.Text.Length
Val(txtPorta.Text) -> CInt(txtPorta.Text)
vbNullString -> Nothing
Long -> Integer
Integer -> Short
MsgBox("Dati Mancanti!") -> MessageBox.Show("Dati Mancanti!")
aaa
21/03/08 20:50
pinguino
ho letto l' articolo segnalato da te...
poi ho scaricato il sorgente completo, i file sorgente sn per vb6 -.-
me ne sn accorto dal fatto ke i sorgenti vb.net hanno l' estensione .vbproj mentre vb6 ha .vbp
ed inoltre ci sn files .frm, file ke in vb.net sono con estensione .vb.
+ il codice ke è vb6...
Ultima modifica effettuata da pinguino 21/03/08 20:51
aaa
22/03/08 7:23
Il Totem
Non è esatto: il codice è vb.net poichè comprende classi e handler d'evento ed è compatibile con qualsiasi compilatore. Tuttavia si nota facilmente che la maggioranza delle funzioni usate derivano da VB6, il che fa pensare che sia stato scritto per VB6 e incollato modificando le parti sostanziali in un compilatore vb.net. Quindi basta modificare alcune cosette come riportato sopra per portarlo ad uno stato "normale".
aaa
22/03/08 10:28
nala84
Grazie per avermi risposto!

ho provato a modificare il codice in questo modo:

Option Strict Off
Option Explicit On
Friend Class frmClient
Inherits System.Windows.Forms.Form
' Progetto di esempio Chat VB col WinSock by HeDo 2003

Private Sub cmdConnetti_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdConnetti.Click
Static Stat As Boolean ' Variabile statica che contiene True se si è connessi e False se non
If Stat = False Then
If txtIP.Text.Length > 0 And txtPorta.Text.Length > 0 Then ' Se c'è sia l'IP sia la porta
TCP.Connect(txtIP, CInt(txtPorta.Text)) ' Si connette
cmdConnetti.Text = "Disconnetti"
Stat = True
lblStato.Text = "Connettendo"
Else
MsgBox("Dati mancanti!", MsgBoxStyle.Exclamation)
End If
Else
TCP.Close() ' Chiude La connessione
Stat = False
lblStato.Text = "Chiudendo"
cmdConnetti.Text = "Connetti"
End If
End Sub

Private Sub TCP_ConnectEvent(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles TCP.ConnectEvent
lblStato.Text = "Connesso"
End Sub

Private Sub TCP_CloseEvent(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles TCP.CloseEvent
TCP.Close() ' Per chiudere definitivamente la socket senno rimane .State = sckClosing
lblStato.Text = "Disconnesso"
End Sub

Private Sub cmdInvia_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdInvia.Click
If Len(txtInvia) > 0 Then ' Se c'è qualcosa da spedire la spedisci
TCP.SendData(txtInvia) ' Invia i dati
txtChat.Text = txtChat.Text & "locale> " & txtInvia.Text & vbCrLf
txtChat.SelectionStart = txtChat.Text.Length
txtInvia.Text = Nothing
' Elimina il testo inviato da txtInvia
'UPGRADE_ISSUE: La funzione LenB non è supportata. Fare clic per ulteriori informazioni: 'MS.VSCC.v90/dv_commoner/local/…;'
lblStato.Text = "Inviando " & txtInvia.Text.Length & "Bytes"
End If
End Sub
Dim Data As String
Dim bytesTotal As Long
'Passando Nothing a un metodo si genera un warning

Private Sub TCP_DataArrival(ByVal eventSender As System.Object, ByVal eventArgs As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles TCP.DataArrival

TCP.GetData(Data) ' Copia i dati del Buffer in entrata nella variabile Data e svuota il Buffer
lblStato.Text = "In arrivo " & eventArgs.bytesTotal & " bytes"
txtChat.Text = txtChat.Text & "remoto> " & Data & vbCrLf ' Aggiunge il Testo
txtChat.SelectionStart = txtChat.Text.Length
' Imposta come inizio della selezione la fine, x lo scrolling automatico
End Sub

Private Sub TCP_Error(ByVal eventSender As System.Object, ByVal eventArgs As AxMSWinsockLib.DMSWinsockControlEvents_ErrorEvent) Handles TCP.Error
TCP.Close() ' Chiude la socket
MsgBox("Errore TCP " & eventArgs.number & vbCrLf & eventArgs.description)
lblStato.Text = "Errore TCP " & eventArgs.number
End Sub

Private Sub TCP_SendComplete(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles TCP.SendComplete
lblStato.Text = "Dati inviati con successo"
End Sub
End Class

Ma cliccando sul pulsante "invia" si blocca alla linea di codice:

If Len(txtInvia) > 0 Then

Invalid CastException non è stata gestita
Tipo non corrispondente

ho sbagliato qlc nel modificare il codice?
aaa
23/03/08 14:38
Il Totem
Scusa ma non vedi che errore c'è? E' notevole:
If Len(txtInvia) > 0 Then

Tu stai chiedendo la lunghezza in caratteri di una casella di testo, di un oggetto TextBox, quando la funzione richiede espressamente una stringa, ossia il testo contenuto nella textbox.
aaa