- PR -

MessageWindowについて

投稿者投稿内容
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2008-04-01 21:24
お世話になります。

現在Vb 2005 Pro にてプロジェクト種類をWindous CE 5.0で
デバイスアプリケーションの作成を行っています。

textBox でバーコードを読み取りした際に、
そのバーコードと一致する名称をファイルの中から検索して
表示したいです。

バーコードを読み取りした場合のイベントは、下記のクラスで取得できました。

Imports Microsoft.WindowsCE.Forms

Friend Class clsHandleWindow
Inherits Microsoft.WindowsCE.Forms.MessageWindow

Private Const WM_Bar As Int32 = &H930

Private Enum WM_Bar_DBT
DBT_Bar = &H1
End Enum

'フラグ
Private errFlg As Boolean = False

Protected Overrides Sub WndProc(ByRef m As Message)

If errFlg = True Then Exit Sub
errFlg = True

Dim msg As Integer = m.Msg

'チェック
If msg = WM_Bar Then
select Case m.WParam.ToInt32()
case WM_Bar_DBT.DBT_Bar
//イベント発生
end select
end if

MyBase.WndProc(m)

errFlg = False
End Sub
End Class

上記の//イベント発生部分で、名称を表示させる為に
textBoxのValidatedを発生させたいです。

ですが、どのようにしたら発生させる事ができるのかわかりません。
お分かりの方教えていただけないでしょうか?

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-01 23:57
引用:

ケイさんの書き込み (2008-04-01 21:24) より:

上記の//イベント発生部分で、名称を表示させる為に
textBoxのValidatedを発生させたいです。

ですが、どのようにしたら発生させる事ができるのかわかりません。
お分かりの方教えていただけないでしょうか?


 Validated イベントは、textBox に入力された値の検証ができたときに発生します。

 textBox から、CausesValidation プロパティが True である他のコントロールにフォーカスを移してやれば発生します。
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2008-04-02 10:35
返信ありがとうございます。

引用:

Jittaさんの書き込み (2008-04-01 23:57) より:

 Validated イベントは、textBox に入力された値の検証ができたときに発生します。

 textBox から、CausesValidation プロパティが True である他のコントロールにフォーカスを移してやれば発生します。



という事は、

'チェック
If msg = WM_Bar Then
select Case m.WParam.ToInt32()
case WM_Bar_DBT.DBT_Bar
//他のコントロールに移動?
Form1.textBox2.Focus()
end select
end if

上記のようにフォーカスを指定するという事でよろしいでしょうか?
プログラム的には上記でフォーカス指定していいものでしょうか?


上記で良い場合(イベントは発生します)下記について再度質問させて下さい。

バーコード読み込みを行なうFormが一つではなく複数ある為、
読み込みが行なわれたフォームを判断する必要があります。

Form1 からShowDialog() でForm2を起動。
起動したForm2のテキストボックスでもバーコード読み取りを行なう。

Form2からShowDialg()でForm3を起動。
起動したForm3のテキストボックスでもバーコード読み取りを行なう。


上記のような場合にwndProcが発生したFormの判断を行ないたいのですが、
どのような方法で判断を行なったらよろしいでしょうか?

※Public strFormName as string を作成して、Form移動毎にForm名を入力
WndProcでstrFormNameで判断した場合、確かに判断はできるのですが
このような判断方法でもよいのでしょうか?


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-02 22:16
引用:

読み込みが行なわれたフォームを判断する必要があります。


なぜ?
って、CE かぁ。。。CE はよくわからないです。
引用:
コード:
Protected Overrides Sub WndProc(ByRef m As Message)

    If errFlg = True Then Exit Sub
    errFlg = True

    Dim msg As Integer = m.Msg

    'チェック
    If msg = WM_Bar Then
        select Case m.WParam.ToInt32()
        case WM_Bar_DBT.DBT_Bar
            //イベント発生
        end select
        // m については処理したのだから、
        // ここで抜ければいいのでは?
    end if

    MyBase.WndProc(m) // WM_Bar は、ここに渡さない

    errFlg = False
End Sub



 未処理のイベントが、親に渡されているのではないかと思います。
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2008-04-03 13:49
返信ありがとうございます。

引用:

Jittaさんの書き込み (2008-04-02 22:16) より:
引用:

読み込みが行なわれたフォームを判断する必要があります。


なぜ?
って、CE かぁ。。。CE はよくわからないです。



申し訳ありません。

clsHandleWindowをクラスファイルで作成し、

下記のように各FormのLoadでclsHandleWindowを指定していましたので、
clsHandleWindowの中で呼び出されたFormが分からないと
移動するフォーカスの指定ができないと思っておりました。

コード:
------------------------------------------Form1
Imports System.Windows.Forms
Imports Microsoft.WindowsCE.Forms

Public Class Form1
    Friend WithEvents msgWindow As clsHandleWindow

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.msgWindow = New clsHandleWindow
    End Sub
	//他イベント処理
End Class

------------------------------------------Form2
Imports System.Windows.Forms
Imports Microsoft.WindowsCE.Forms

Public Class Form1
    Friend WithEvents msgWindow As clsHandleWindow

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.msgWindow = New clsHandleWindow
    End Sub
	//他イベント処理
End Class




clsHandleWindowを別名で作成しておけば、それぞれのForm用の
処理は作成できるようでした。

ありがとうございます。

Form1用、Form2用でWndProcを作成しました

コード:
--------------------Form1のWndProc
	'チェック
    If msg = WM_Bar Then
        select Case m.WParam.ToInt32()
        case WM_Bar_DBT.DBT_Bar
            Form1.textbox2.Focus()
        end select
    end if
----------------------------------------

--------------------Form2のWndProc
	'チェック
    If msg = WM_Bar Then
        select Case m.WParam.ToInt32()
        case WM_Bar_DBT.DBT_Bar
            Form2.Button1.Focus()
        end select
    end if
----------------------------------------



Form1からForm2をShowDialg()で開いているのですが、

Form1では、バーコード読み取り時にフォーカス移動しましたが、
Form2では画面が非アクティブになりフォーカスの
移動はしていません。

どうしてでしょうか?

何かお分かりの方教えていただけないでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-03 21:43
え〜〜っと、ごめんなさい。
「処理したイベントを MyBase.WndProc に処理させない」という処理を行っても、期待した動きにならなかった、という事でしょうか?
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2008-04-04 10:46
返信ありがとうございます。

引用:

Jittaさんの書き込み (2008-04-03 21:43) より:
え〜〜っと、ごめんなさい。
「処理したイベントを MyBase.WndProc に処理させない」という処理を行っても、期待した動きにならなかった、という事でしょうか?



そうなんですよね。

ちなみに「処理したイベントを MyBase.WndProc に処理させない」というのは、
下記のようなWndProcでよろしいでしょうか?

コード:
Protected Overrides Sub WndProc(ByRef m As Message)

    If errFlg = True Then Exit Sub
    errFlg = True

    Dim msg As Integer = m.Msg

    'チェック
    If msg = WM_Bar Then
        select Case m.WParam.ToInt32()
        case WM_Bar_DBT.DBT_Bar
            Form2.TextBox2.Focus()
        end select
        exit sub //ここでぬける?
    end if

    MyBase.WndProc(m) // WM_Bar は、渡されていない?

    errFlg = False
End Sub




上記でおこなっているのですが、Form1からShowDialg()でForm2を
表示しているのですがフォーカスは移動しませんでした。
※Form1では移動するのですが・・・・

色々と試してみてはいるのですが、上手くいかなくて・・・・


ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2008-04-04 10:59
ずっと気になってみているのですけれど
コード:

Protected Overrides Sub WndProc(ByRef m As Message)

    If errFlg = True Then Exit Sub
    errFlg = True

    Dim msg As Integer = m.Msg

    'チェック
    If msg = WM_Bar Then
        select Case m.WParam.ToInt32()
        case WM_Bar_DBT.DBT_Bar
            Form2.TextBox2.Focus()
        end select
        exit sub //ここでぬける?
    end if

    MyBase.WndProc(m) // WM_Bar は、渡されていない?

    errFlg = False
End Sub


この Form2 って「クラス」ですか?それとも「インスタンス」ですか?
上の方のリストを見てると、どうも「クラス」に対して処理をしている
ように見えて仕方がなく、それでも通ってしまうのが VB なのかなぁ
とか思いました。

たまたまそういう書き方をしているだけで、本当はインスタンスをちゃんと
指定しているんだよとか、実際のソースと違うからこういう書き方に
なっているんだよとかであればいいのですけど。
(でも説明がないのは誤解を生むので止めてほしい)
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

スキルアップ/キャリアアップ(JOB@IT)