[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/07/20(Wed) 20:13
投稿者名:チロル
Eメール:
URL :
タイトル:
型を一致させたい
先日も質問させて頂いた者ですが、よろしくお願いします。
通信プログラム・VB6.0を同時進行で勉強中の身です。
課題内容は、フォーム上のテキストボックスへ手入力します。手入力する値は ”12 2A 6F A8”と16
進数が前提です。
このテキストデータを拾いDEL・SEL・DEL・UA・DEL・HA・DLE・STX・DLE・LNGH・DLE・LNGL+テキスト
データ とヘッダを複合しバイナリーデータとして送信することです。
それを現在私は以下のようなプログラムで表現しました。
下から三行目の Buffer(i) = MidB(Text1.Text, i - 11, 1) の箇所で
”実行エラー13番 型が一致しません。”
とエラーが出てしまいます。
型が一致しないとのことで色々調べたのですが、どうしても解決できず質問しようと思いました。
初歩的な内容であると思うのですが、どなたか原因を教えてください。

Private Sub Command1_Click()
    Dim txtLen As Integer
    Dim conTxtLen As String
    Dim Buffer(0 To 2100) As Byte

    ' テキストのバイト数取得
    txtLen = LenB(Text1.Text)
    
    ' DLNGH・DLNGL設定
    conTxtLen = Hex(txtLen)
    COMM_CODE.DLNGH = "&H" & Left(conTxtLen, 2)   'LenのHigh
    COMM_CODE.DLNGL = "&H" & Right(conTxtLen, 2)  'LenのLow
    
    For i = 0 To 10 Step 2
        Buffer(i) = COMM_CODE.DLE
    Next i
    Buffer(1) = COMM_CODE.POL
    Buffer(3) = COMM_CODE.UA
    Buffer(5) = COMM_CODE.HA
    Buffer(7) = COMM_CODE.STX
    Buffer(9) = COMM_CODE.DLNGH
    Buffer(11) = COMM_CODE.DLNGL
    
    For i = 12 To (txtLen + 12)
        Buffer(i) = MidB(Text1.Text, i - 11, 1)
    Next i
End Sub

投稿時間:2005/07/20(Wed) 20:40
投稿者名:ガッ
Eメール:
URL :
タイトル:
Re: 型を一致させたい
とりあえず→Val()メソッドを見ると嬉しくなるかも。
文字列を添え字にしたいとき→Collection…かな?

※少し気になるところ→なんでMidB()を使っているの?

投稿時間:2005/07/20(Wed) 21:01
投稿者名:チロル
Eメール:
URL :
タイトル:
Re^2: 型を一致させたい
ガッさん返信有難うございます。

Val関数に関して調べてみたところ・・・すみません、Val関数の内容は理解できるのですが、ここでど
う応用するか見出せないでいます。

MadBを使った理由は、私の頭の中のイメージとして
例えばテキストへ手入力で ”12 2A 6F A8”と入力されたとき
Buffer(12) へ 12 を格納
Buffer(13) へ 2A を格納
Buffer(14) へ 6F を格納
Buffer(15) へ A8 を格納
と1バイトづつ代入すれば良いのかと考え Text1.Text から1バイト格納し1バイト進んでまた、1バ
イト格納するようなイメージがあり
それを私の知識で表現すると、こういった形になってしまいました。
知識不足で申し訳ありません。

上記のようなイメージがあるのでVal関数を使ってしまうと ”12 2A 6F A8”が ”12268”と取れてし
まうのではないか?と考えてしまいます。
素人で申し訳ないのですが、どこの認識を誤っているのかアドバイスください。

投稿時間:2005/07/20(Wed) 20:42
投稿者名:いな
Eメール:
URL :
タイトル:
Re: 型を一致させたい
Byte型にキャストしましょ

Buffer(i) = MidB(Text1.Text, i - 11, 1)
 ↓
Buffer(i) = CByte(MidB(Text1.Text, i - 11, 1))

#激しく誤爆...

>※少し気になるところ→なんでMidB()を使っているの?
おそらくByte型の値域を超えるから?

投稿時間:2005/07/20(Wed) 21:21
投稿者名:ガッ
Eメール:
URL :
タイトル:
Re^2: 型を一致させたい
> Byte型にキャストしましょ
>
> Buffer(i) = MidB(Text1.Text, i - 11, 1)
>  ↓
> Buffer(i) = CByte(MidB(Text1.Text, i - 11, 1))
>
> #激しく誤爆...
(・∀・)ニヤ
でも、運がよければ例外起こりませんからねぇ…
というわけで、質問内容で隠されてる部分が結構重要だったりw

> >※少し気になるところ→なんでMidB()を使っているの?
> おそらくByte型の値域を超えるから?
かなぁ…MidB()はStringの一部を切り出してStringを返すから、B
yte型の値域を越えるとも考えられるけど、そもそも型が…
( ゜д゜)ハッ!
 ココで「型が一致しない」という疑問になって、
 「じゃぁ型を一致させればいいじゃん♪」
となったのかな…?(orz
→「信号赤じゃん進めないよー…」、「緑に塗っちゃえ♪」的なw;

> チロルさん
前も型の不一致で苦労なされているようですね。
ココは一つ出血大サービスを |ω・`) ?

-Module1.bas-
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As Any, Source As Any, ByVal Length As Long)

'buf()のLBound(buf)+offset位置にvを書き込む
'例外処理はしていないので良く見て運転してください(?
Public Sub WriteBytes(ByRef buf() As Byte, ByRef v() As Byte, Optional ByRef offset As Long)
    '※注意:bufにvの全てを書き込みます。
    Dim cnt             As Long
    cnt = UBound(v) - LBound(v) + 1
    CopyMemory buf(LBound(buf) + offset), v(LBound(v)), cnt
    offset = offset + cnt
End Sub
Public Sub WriteInteger(ByRef buf() As Byte, ByVal v As Integer, Optional ByRef offset As
Long)
    CopyMemory buf(LBound(buf) + offset), v, 2
    offset = offset + 2
End Sub
Public Sub WriteLong(ByRef buf() As Byte, ByVal v As Long, Optional ByRef offset As Long)
    CopyMemory buf(LBound(buf) + offset), v, 4
    offset = offset + 4
End Sub
'他は略。

'16進数で書かれたString→Byte()
Public Function HexTOBytes(ByRef INstring As String) As Byte()
    
    'INStringは"00 01 02 ff"などという文字列
    'その文字列を" "で区切り、
    '各々の元を16進数として評価して、配列として返す
    
    Dim v               As Variant
    Dim cnt             As Long
    Dim spl()           As String
    Dim ret()           As Byte
    
    '代入していく
    spl = Split(INstring, " ")
    ReDim ret(1 To UBound(spl) - LBound(spl) + 1)
    cnt = 0
    For Each v In spl
        cnt = cnt + 1
        ret(cnt) = Val("&h" & v)
    Next
    
    '戻る
    HexTOBytes = ret
    
End Function

※動くかな…長くなってすみません;
 ノシ

投稿時間:2005/07/20(Wed) 21:45
投稿者名:チロル
Eメール:
URL :
タイトル:
Re^3: 型を一致させたい
こんなに丁寧に書いて頂いて恐縮です。有難うございます。
ですが、直ぐには理解できそうになく、もう少し悩ませてください。
個人的な理由で申し訳ないのですが、帰宅時間が迫っているのと自宅に開発環境がないのとで
また明日見直し報告させて頂きます。

投稿時間:2005/07/20(Wed) 22:25
投稿者名:いな
Eメール:
URL :
タイトル:
Re^3: 型を一致させたい
> > #激しく誤爆...
> (・∀・)ニヤ
> でも、運がよければ例外起こりませんからねぇ…

ですです。

> > >※少し気になるところ→なんでMidB()を使っているの?
> > おそらくByte型の値域を超えるから?
> かなぁ…MidB()はStringの一部を切り出してStringを返すから、B
> yte型の値域を越えるとも考えられるけど、そもそも型が…
> ( ゜д゜)ハッ!
>  ココで「型が一致しない」という疑問になって、
>  「じゃぁ型を一致させればいいじゃん♪」
> となったのかな…?(orz
> →「信号赤じゃん進めないよー…」、「緑に塗っちゃえ♪」的なw;

まったくその通り、「型さえ合えば文句ないの?」的な(orz

> > チロルさん
> 前も型の不一致で苦労なされているようですね。
> ココは一つ出血大サービスを |ω・`) ?

私メは大出血する前に、帰ります。
#二徹後、昨日も結局帰って寝れたのAM3時なので・・・。

でわでわ

投稿時間:2005/07/20(Wed) 21:27
投稿者名:チロル
Eメール:
URL :
タイトル:
Re^2: 型を一致させたい
いなさん返答有難うございます。
早速試してみました。
テキストへは”123456”と入力し、コマンドを実行しました。
デバックの結果 Buffer(12)へは”1”が格納されましたが
Buffer(13) で同じエラーが出てしまいます。

投稿時間:2005/07/21(Thu) 16:49
投稿者名:チロル
Eメール:
URL :
タイトル:
Re^3: 型を一致させたい
ガッさん本当に有り難いのですが、同時に本当に本当に申し訳ありません。
散々検討した結果、今の私にはどうしてもハードルが高く扱うことができませんでした。
ですが、無駄にはしたくないので、理解できそうな知識を得た段階で再度挑戦したいと思います。

仕事の都合もあり、今回はいなさんに頂いた方法を元に、少し強引なやり方で解決させていただきまし
た。
ガッさん いなさん有難うございました。

    ' 文字列から空白削除
    strData = Replace(txtOutPutSel.Text, " ", "")
    ' バイト数取得
    txtLen = Len(strData) / 2
    ' DLNGH・DLNGL設定
    COMM_CODE.DLNGH = Hex(Left(Format(txtLen / 2, "0000"), 2))
    COMM_CODE.DLNGL = Hex(Right(Format(txtLen / 2, "0000"), 2))
      
    ' 送信バッファへ代入
    Buffer(0) = COMM_CODE.DLE
    Buffer(1) = COMM_CODE.POL
    Buffer(2) = COMM_CODE.DLE
    Buffer(3) = COMM_CODE.UA
    Buffer(4) = COMM_CODE.DLE
    Buffer(5) = COMM_CODE.HA
    Buffer(6) = COMM_CODE.DLE
    Buffer(7) = COMM_CODE.STX
    Buffer(8) = COMM_CODE.DLE
    Buffer(9) = COMM_CODE.DLNGH
    Buffer(10) = COMM_CODE.DLE
    Buffer(11) = COMM_CODE.DLNGL
    
    j = 0
    For i = 0 To txtLen - 1 Step 1
        strTxtData = Mid(strData, (i * 2) + 1, 2)
        bytBuf = CByte("&H" & strTxtData)
        Buffer(i + j + 12) = bytBuf
        
        If bytBuf = &H10 Then
            j = j + 1
            Buffer(i + j + 12) = bytBuf
        End If
    Next i