したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

デリゲートについて(VB2005)

1こじら:2009/04/21(火) 22:18:44
今晩は。以前はRS-232Cの件有難う御座いました。頂いたコード元に
新たなソフト作成しているのですが、デリゲートでつまってます。
 わかりやすい資料ないでしょうか。現在 複数のボタンにRS232C
コマンドを登録し、それぞれのボタンの結果を異なるtextboxへ表示、
ボタンAの結果はboxA、ボタンBの結果はboxB、
ボタンCの結果はboxC1,C2,C3(3byte)というように、
(ボタンAの時、boxB,Cは変化なし、同様にBの時boxA,Cは変化なし)
以前頂いたプログラムは 1ボタンに1textboxで、これを真似て
みたのですが根本分かってないからエラーになります。
 また VBで値をシフトをする
(10進7=2進0111これを左シフトすると2進1110=10進14)
は、2倍する事で実現するものなのでしょうか?コマンドあるので
しょうか
 それから 現在の値に対し2進にしたあるbitだけを1にしたり0
にしたり、またはbitの値をチェックするコマンドなどもあります
でしょか
 5=b0101 1bit目を1にセット→ b0111=7
 5=b0101 2bit目を0にセット→ b0011=3
 5=b0101 0bit目が1かどうか→ 1ならtrue
 5=b0101 3bit目が0かどうか→ 0ならtrue 
(PICのレジスタを操作したいため) すみません初歩的な質問
ばかりで。

2igoten:2009/04/22(水) 09:51:49
こんにちは、
デリゲートがわからないと言う質問が圧倒的に多いですね。
長くなりますので分けて書きます。

まず基本的に次のことを抑えておきましょう。
マルチスレッドの場合(RS-232Cの受信はマルチスレッド
で行われます。)はメインスレッドのTextBoxにセカンドスレッド
から書き込めません、なぜならその様なルールにしてあるからです。
ではメインスレッドのサブルーチン(メソド)を呼び出すことは出来るのでしょうか?
もしこれが出来れば、そのサブルーチンの中にTextBoxに書き込む動作を
埋め込んでおけば良いと言うことになります。
答えは条件付きでYesです。
条件は2つあります1つはサブルーチンをアドレスで呼び出すこと、
2つ目はサブルーチンをセカンドスレッドではなくてメインスレッドから
呼び出すことです。
サブルーチンをアドレスで呼び出す方法がデリゲートです。

'メインスレッドに書き込むデリゲート
Delegate Sub dlgAddText(ByVal str As String)

これは引数に1つのStringを取って、アドレスでサブルーチンを
呼び出しますよと言う宣言です。
このように宣言すると戻り値がなくStringの引数を一つとるサブルーチン
なら何でも呼び出すことが出来ます。

3igoten:2009/04/22(水) 09:52:41
2番目のサブルーチンをセカンドスレッドから呼び出す方法ですが、
Invokeメソドを使用します。
Me.Invoke(デリゲート)とする、メインスレッドでデリゲートが実行されます。

さて私が書いた下のコードですが、言葉で説明してみます。
まずアドレスで呼び出されるサブルーチンAddTextを書いてあります。
これは引数をテキストボックスに書き込むサブルーチンです。

'メインスレッドのテキストに追加する
Me.Invoke(New dlgAddText(AddressOf AddText), New Object() {strIn})

AddTextというサブルーチンをstrInというString型の引数を1つつけて
メインスレッドから(Me.Invoke)アドレス(AddressOf AddText)で
呼び出しなさい、と言うことになります。

これでわからない場合は具体的に何をしたいかを書いていただければ
アドバイス出来ると思います。

4igoten:2009/04/22(水) 09:55:49
VB.NETの場合はビット演算が簡単に使えます。
先ずSiftですが左Siftは<<、右Siftは>>です。
>10進7=2進0111これを左シフトすると2進1110=10進14は
Dim i As Integer = (7 << 1) 又は
Dim i As Integer = 7
i = i << 1 又は
i <<= 1
となります、2つシフトしたければ i<<2とします。

ある数のあるビットが立っているかいないか調べることをビットテストと言います。
ビットテストにはAnd演算子を使います。
これはテストしたいビットだけが立った数値とテストしたい数値のAndで実現します。
1100100 (10進 100)
And 0000100 (10進   4)
-------------------------
    0000100
ANDの結果が0ならビットが立っていません。
コードは
Dim i As Integer = 100
Dim j As Integer = 2 '番目のビット
Dim k = i And 2 ^ j
If (i And 2 ^ j) > 0 Then
MessageBox.Show((j + 1).ToString + "番目のビットが立っています")
Else
MessageBox.Show((j + 1).ToString + "番目のビットが立っていません")
End If


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板