0

サーバーに更新メッセージを作成するこのコードがあります

StrMsg = "1~Server~"

For x = 0 To Combo1.ListCount - 1
    If x = Combo1.ListCount - 1 Then
        StrMsg = StrMsg & Combo1.List(x)
    Else
        StrMsg = StrMsg & Combo1.List(x) & "~"
    End If
Next x


' send it to every connected clients
For x = 0 To clientCounter - 1
    sckClients(x).SendData StrMsg
Next x

クライアントはそれを受け取り、ComboBox1 に配置します。

Private Sub sckClient_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    Dim strMsg As String, tmp() As String, i As Integer

    sckClient.GetData strMsg$, vbString
    tmp$() = Split(strMsg$, "~")

    For i% = 1 To CInt(tmp$(0)) - 1
        Combo1.AddItem tmp$(i%)
    Next i%

    sckClient.GetData strData, vbString

End Sub

しかし、実行時エラー 13 タイプの不一致が常に発生するのはなぜですか??

ここで何が間違っているようですか?-_-

4

2 に答える 2

0

Split() 関数は、String 配列ではなく、String 配列タイプの Variant を返します。それ以外では、変数の型宣言記号を削除します。これは、古いバージョンの BASIC への逆戻りです。

Private Sub sckClient_DataArrival(ByVal bytesTotal As Long)
    Dim strData    As String
    Dim strMsg     As String
    Dim vastrTmp   As Variant
    Dim i          As Integer

    sckClient.GetData strMsg, vbString
    vastrTmp = Split(strMsg, "~")

    For i = 1 To CInt(vastrTmp(0)) - 1
        Combo1.AddItem vastrTmp(i)
    Next i

    sckClient.GetData strData, vbString

End Sub
于 2013-09-09T06:44:01.263 に答える
0

いくつか質問があります。

  • jac が尋ねるように: どの行でエラーが発生しますか?

  • 投稿したコードで CInt(tmp$(0))-1 にループするのはなぜですか。送信する文字列は常に 1 ~ で始まるため、tmp$(0) は常に 1 になるため、1 から 0 (これは決してありません)

  • DataArrival の最後に GetData を再度呼び出すのはなぜですか?

split() で文字列配列を使用すると問題なく動作します。バリアントを使用するよりも気に入っています。変数宣言を使用することは常に良いことです。コードが読みやすくなり、変数が宣言されていない場合に VB が (遅い) バリアントを処理するため、コードが少し速くなります。

私が見ることができる限り、型の不一致は CInt() からのみ発生する可能性がありますが、投稿したコードでは決してそこに到達することはありません

CInt() を Val() に置き換えると、タイプの不一致が発生することはなくなりますが、数値以外の値が 0 に変換されることに注意してください。

つまり、あなたのコードでプロジェクトを作成しましたが、タイプの不一致はありませんでした

于 2013-09-10T14:25:35.773 に答える