- PR -

VB.NET2003/スマートデバイスアプリケーションについて

1
投稿者投稿内容
徹夜
会議室デビュー日: 2004/03/22
投稿数: 11
投稿日時: 2004-03-22 22:45
初めまして。
VB 約1ヶ月。VB.NET三週間のド素人です。(最近やっと就職出来た〜)
今、仕事でPDA用アプリ開発やっています。
VB6.0で作成されているアプリをVB.NET2003に載せ変えしているのですが、
一点問題があり、対処出来ない状況です。(下記が問題になっている部分のソースです)

Form側
Private Sub txtPress_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles txtPress.TextChanged
Call ErrChk(txtPress, "P1", 7)
End Sub

Private Sub txtPress_LostFocus(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles txtPress.LostFocus
On Error GoTo ErrPress

'0埋め処理
txtPress.Text = Format(Val(txtPress.Text), "#0.0")
'ワークの値と取得した値が違う場合
If pGasOt(UBound(pGasOt)).strPress <> txtPress.Text Then
pintChgFlg = COnFlg 'フラグ = ON
End If
Exit Sub
ErrPress:
txtPress.Text = ""
End Sub

標準モジュール側
Public Function ErrChk(ByRef objTxtNm As System.Windows.Forms.TextBox, _
ByVal strType As String, _
ByVal intMaxLength As Integer)

Dim intKeka As Integer '調査結果に値が入っているか判定する関数の戻り値
Dim i As Integer '配列用変数
Dim intPoint As Integer '小数点の数
Dim intIti As Integer '小数点の位置
Dim intRet As Integer 'AS桁数チェックの戻り値
Dim intFu As Integer 'マイナス符合の有無
Dim intPeriod As Integer 'ピリオド符合の有無
Dim strWork As String '数字のスペース抜いたの入れるようワーク

ErrChk=0
If strType = "P1" Then '小数点以下第1位の入力チェック
intPoint = 0 '小数点の数クリア
intIti = Len(strWork) '小数点の位置のクリア
'1桁目のチェック
If strWork <> "" Then
If Mid(strWork, 1, 1) = "-" Then '−の場合
intFu = True
'整数値の場合
ElseIf Asc(Mid(strWork, 1, 1)) >= 48 And Asc(Mid(strWork, 1, 1)) <= 57 Then
intFu = False
'ピリオドの場合
ElseIf Asc(Mid(strWork, 1, 1)) = 46 Then
intFu = False
intPeriod = True
'符号でも数値でもない場合
Else
MsgBox("入力エラー1")
ErrChk = 1
Exit Function
End If
End If

'2桁目以降のチェック
i = 2
If intFu = True Then 'マイナス値の場合
Do While i <= Len(strWork) '文字列分だけまわす
If Asc(Mid(strWork, i, 1)) = 46 Then '小数点に出くわした場合
intPoint = intPoint + 1 '小数点の数のカウント
intIti = i '小数点の位置

End If

'桁数が多いか、小数点の数が多いか、小数点と0〜9以外か、
'整数桁が多すぎるか、小数点以下が多すぎるかの場合
If Len(strWork) > intMaxLength Or intPoint > 1 _
Or (Asc(Mid(strWork, i, 1)) <> 46 _
And Asc(Mid(strWork, i, 1)) < 48 _
Or Asc(Mid(strWork, i, 1)) > 57) _
Or (intPoint = 0 _
And i >= intMaxLength - 1) _
Or Len(strWork) - intIti > 1 Then
MsgBox("入力エラー2")
objTxtNm.Text = Nothing
ErrChk = 1
Exit Function
End If
i = i + 1
Loop
Else 'プラス値の場合
If intPeriod Then
intPoint = 1
intIti = 1
End If

Do While i <= Len(strWork) '文字列分だけまわす
If Asc(Mid(strWork, i, 1)) = 46 Then '小数点に出くわした場合
intPoint = intPoint + 1 '小数点の数のカウント
intIti = i '小数点の位置

End If

'桁数が多いか、小数点の数が多いか、小数点以外か、0〜9以外か、
'整数桁が多すぎるか、小数点以下が多すぎるかの場合
If Len(strWork) > intMaxLength - 1 _
Or intPoint > 1 Or (Asc(Mid(strWork, i, 1)) <> 46 _
And Asc(Mid(strWork, i, 1)) < 48 Or Asc(Mid(strWork, i, 1)) > 57) _
Or (intPoint = 0 _
And i >= intMaxLength - 2) _
Or Len(strWork) - intIti > 1 Then
MsgBox("入力エラー3")
objTxtNm.Text = Nothing
ErrChk = 1
Exit Function
End If
i = i + 1
Loop

objTxtNm.Text = strWork

End If
End If

VB6.0ではエラーが発生した時、一回だけしかメッセージが表示されないのに、
VB.NET2003では二回呼ばれる所があります。
Msgbox("入力エラー3")が二回呼ばれます。
前後にフラグやカウントを取って一回メッセージが呼ばれたらExit functionをして見ましたが
今度は何もエラーメッセージが表示されませんでした。
用はエラーメッセージ表示を一回だけにして処理を抜けるようにしたいのですが、
うまい具合に処理が出来ません。
宜しければ、皆様方のお知恵をお貸しください。
宜しくお願いします。


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-23 09:12
 ざっとしか見ていませんが・・・

 ターゲットになるOSは何でしょうか?NT系であれば、おそらく98でも、このソースでは動かないでしょう。理由は、ざっと見ただけなので違っていたらごめんなさい、文字コードが違うためにバイト単位ではとれないからです。

 されている処理は、桁数指定の数値入力チェックのようですが、単純に数値化するとか、正規表現でチェックできるのではないでしょうか。また、Validatingイベントで処理するのが妥当でしょう。


正規表現例:
"[-+]?[0-9]*\.[0-9]{1,7}"…符号有無、整数部0桁以上、小数部1〜7桁
小数部の桁数が変わるなら、
fmt As String = String.Format("[-+]?[0-9]*\.[0-9]{{1,{0}}}", 桁数)
で、マッチング用の文字列を作る
#「\d」だったかで、「数値」なんだけど。。。

正規表現を使ったコード例:
コード:
<System.ComponentModel.Description( _
"数値と、小数部の桁数をチェックする;True=数値で小数部の桁数が指定以下")> _
Public Function ErrChk( _
    <Description("?")> ByRef objTxtNm As System.Windows.Forms.TextBox, _ 
    <Description("チェックタイプ")> ByVal strType As String, _
    <Description("小数部の最大桁数")>ByVal intMaxLength As Integer) _
    As Boolean
  Dim fmt As String

  If strType = "P1" Then '小数点以下第1位の入力チェック
    ' 整数部の桁数チェックも必要なら"*"を置き換える
    fmt = String.Fromat("[-+]?[0-9]*\.[0-9]{{1,{0}}}", intMaxLength)

  Else If 他のパターン〜
  End If

  Dim r As New System.Text.RegularExpression.Regex(fmt)
  ErrChk = r.Match(対象).Success ' ソースから検査対象が読み取れませんでした
  If ErrChk Then
    objTxtNm.Text = strWork ' ソースにはstrWorkを設定するところがありません
  End If
End Function


徹夜
会議室デビュー日: 2004/03/22
投稿数: 11
投稿日時: 2004-03-23 17:32
Jittaさん、ありがとうございます。
一応、既存で動作している環境がWin2000らしいです。まだ、あまり詳しくは知りませんで申し訳ありません。
とりあえず、一番妥当なValidatingイベントを使って回避しようと思います。
時間があれば、正規表現チェックをしてみます。

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

徹夜さんの書き込み (2004-03-23 17:32) より:

とりあえず、一番妥当なValidatingイベントを使って回避しようと思います。


 何か誤解させてしまったようで、ごめんなさい。Validatingイベントは「検証するタイミングで発生するイベント」なので、イベントをハンドルしたからといって、勝手にチェックしてくれるわけではありません。内部は自分で書く必要があります。

 また、バグだと思うのですが、「×」で終了するときにも働いてしまう為、少々使いづらいところがあります。
徹夜
会議室デビュー日: 2004/03/22
投稿数: 11
投稿日時: 2004-03-23 22:08
引用:----------------------------------------------------------------
 また、バグだと思うのですが、「×」で終了するときにも働いてしまう為、
少々使いづらいところがあります。
-----------------------------------------------------------------------
貴重なご意見ありがとう御座います。
実際自分で行ってみました。「X」で終了する時にも、働いてるようでした。
問題なのはエラー時にメッセージが2回も表示される事で、それを回避したい訳でした。
結局、仕様の部分でエラーメッセージは出さないで値を精査する仕様に変わりましたので、
裏で動いていようと問題なし?になったと判断して手を打ちます。
(納期までにあまり時間がない為)
ありがとうございます。
1

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