- ケイ
- 大ベテラン
- 会議室デビュー日: 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 なのかなぁ
とか思いました。
たまたまそういう書き方をしているだけで、本当はインスタンスをちゃんと
指定しているんだよとか、実際のソースと違うからこういう書き方に
なっているんだよとかであればいいのですけど。
(でも説明がないのは誤解を生むので止めてほしい)
_________________ ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
|