- - PR -
VB.NET2003/スマートデバイスアプリケーションについて
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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をして見ましたが 今度は何もエラーメッセージが表示されませんでした。 用はエラーメッセージ表示を一回だけにして処理を抜けるようにしたいのですが、 うまい具合に処理が出来ません。 宜しければ、皆様方のお知恵をお貸しください。 宜しくお願いします。 | ||||
|
投稿日時: 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」だったかで、「数値」なんだけど。。。 正規表現を使ったコード例:
| ||||
|
投稿日時: 2004-03-23 17:32
Jittaさん、ありがとうございます。
一応、既存で動作している環境がWin2000らしいです。まだ、あまり詳しくは知りませんで申し訳ありません。 とりあえず、一番妥当なValidatingイベントを使って回避しようと思います。 時間があれば、正規表現チェックをしてみます。 | ||||
|
投稿日時: 2004-03-23 19:02
何か誤解させてしまったようで、ごめんなさい。Validatingイベントは「検証するタイミングで発生するイベント」なので、イベントをハンドルしたからといって、勝手にチェックしてくれるわけではありません。内部は自分で書く必要があります。 また、バグだと思うのですが、「×」で終了するときにも働いてしまう為、少々使いづらいところがあります。 | ||||
|
投稿日時: 2004-03-23 22:08
引用:----------------------------------------------------------------
また、バグだと思うのですが、「×」で終了するときにも働いてしまう為、 少々使いづらいところがあります。 ----------------------------------------------------------------------- 貴重なご意見ありがとう御座います。 実際自分で行ってみました。「X」で終了する時にも、働いてるようでした。 問題なのはエラー時にメッセージが2回も表示される事で、それを回避したい訳でした。 結局、仕様の部分でエラーメッセージは出さないで値を精査する仕様に変わりましたので、 裏で動いていようと問題なし?になったと判断して手を打ちます。 (納期までにあまり時間がない為) ありがとうございます。 |
1