[リストへもどる]
一括表示

投稿時間:2003/07/03(Thu) 10:38
投稿者名:TM
Eメール:
URL :
タイトル:
テキストボックスの入力チェック
テキストボックスのDataFormatを「数値」にしても英字入力できてしまうのは仕様なのでしょうか?
入力チェックで例えば、0から10までの数字しか受け付けないようにしたい場合、

if (isnumeric(text1.text) = false) then
  msgbox "数字を入力して下さい", vbOkonly
  text1.setfocus
  exit sub
end if
if (cint(text1.text) < 0) or (cint(text1.text > 10) then
  msgbox "・・・は0〜10の範囲で入力して下さい", vbOkonly
  text1.setfocus
  exit sub
end if

などとしなければならないのでしょうか?
isnumericでチェックしてからでないとcintでエラーになってしまうし、
たくさんの入力項目があると、コード量も多くて大変になっています。
みなさん、どのような方法でチェックされているのでしょうか?

投稿時間:2003/07/03(Thu) 11:24
投稿者名:nobu
Eメール:
URL :
タイトル:
Re: テキストボックスの入力チェック
> たくさんの入力項目があると、コード量も多くて大変になっています。

TextBox をコントロール配列にしたら如何ですか?

投稿時間:2003/07/03(Thu) 12:00
投稿者名:nanashi
Eメール:
URL :
タイトル:
Re: テキストボックスの入力チェック
> テキストボックスのDataFormatを「数値」にしても英字入力できてしまうのは仕様なのでしょうか?

DataFormatプロパティは全く関係ありません。
データベースに接続している時に使うようですが……
私はそういう使い方自体したこと無いので このプロパティの使い方自体知りません。

> 入力チェックで例えば、0から10までの数字しか受け付けないようにしたい場合、

SetWindowLong、GetWindowLongのAPIを使えば実現出来ます。
APIの宣言は適当にネットで探してもらうとして

    Const GWL_STYLE As Long = -16&
    Const ES_NUMBER As Long = &H2000&
    
    With Text1
        Call SetWindowLong(.hWnd, GWL_STYLE, GetWindowLong(.hWnd, GWL_STYLE) Or ES_NUMBER)
    End With

こんな感じですね。
フォームのロード時にでも追加してください。

投稿時間:2003/07/03(Thu) 12:04
投稿者名:nanashi
Eメール:
URL :
タイトル:
Re^2: テキストボックスの入力チェック
あ、よく見たらちょっと用件と違いましたねf^^;
前回の投稿は数字入力のみを受け付ける時に使います。

> > 入力チェックで例えば、0から10までの数字しか受け付けないようにしたい場合、

この場合TextBoxじゃなくてComboBoxを使った方が良いんじゃないでしょうか?
Styleプロパティをドロップダウンリストにして。

投稿時間:2003/07/03(Thu) 13:16
投稿者名:TM
Eメール:
URL :
タイトル:
制御系なので
制御系なので、入力項目はたくさんあるし、それぞれ入力範囲が違ったりします。
例えば、ある項目は0から100Vの範囲で入力させたり、0〜3600秒だったり、
-60〜120℃であったりと様々です。
よって、コントロール配列やコンボリストだけではちょっと難しいです。
配列使って、(index,min,max,メッセージ)のようにしておいて
コントロール配列のindexで検索すれば見た目はすっきりするかもしれませんが、
項目増えたらパフォーマンスも気になります。
やっぱりズラズラとチェックしていくのが一番いいのでしょうか?

投稿時間:2003/07/03(Thu) 14:03
投稿者名:nanashi
Eメール:
URL :
タイトル:
Re: 制御系なので
> 配列使って、(index,min,max,メッセージ)のようにしておいて
> コントロール配列のindexで検索すれば見た目はすっきりするかもしれませんが、
> 項目増えたらパフォーマンスも気になります。

配列使ってもパフォーマンスなんて大して変わらないと思いますよ。
制御系ってよく分かりませんが、入力項目たくさんって言っても1000も2000も無いでしょうし。

投稿時間:2003/07/03(Thu) 14:31
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 制御系なので
> 制御系なので、入力項目はたくさんあるし、それぞれ入力範囲が違ったりします。
TextBoxの替わりに、マスクエディットコントロールを使う…という方法もあります。

> 配列使って、(index,min,max,メッセージ)のようにしておいて
> コントロール配列のindexで検索すれば見た目はすっきりするかもしれませんが、
あるいは、入力チェック機構を備えたUserControlを自作するか…ですかね。

> 項目増えたらパフォーマンスも気になります。
パフォーマンスを気にするのであれば、入力チェック機能を持った、
市販コントロールの導入を検討してみては如何でしょうか。
チェック内容によっては、コーディングする人件費より、
ツール代の方が安くあがる事もありますので。。。

例えば、このあたりとか。
  拡張テキストボックス [InputMan Pro]
  http://www.grapecity.com/japan/support/database/P1_78.htm

  計測システム用コントロール [PerfectMeasure]
  http://www.comrade.co.jp/package/pm3.htm

投稿時間:2003/07/03(Thu) 15:45
投稿者名:TM
Eメール:
URL :
タイトル:
Re^2: 制御系なので
> 例えば、このあたりとか。
>   拡張テキストボックス [InputMan Pro]
>   http://www.grapecity.com/japan/support/database/P1_78.htm
>
>   計測システム用コントロール [PerfectMeasure]
>   http://www.comrade.co.jp/package/pm3.htm
>
下のほうのは、ビジュアル重視みたいなんで必要ありませんが、
上のはいいですね。「入力値の自動チェック(範囲や妥当性の判定)、入力文字の制限」
なんて書いてあるので、MAX,MINのチェックのほかにも
製番などでA001、B001のように英字はA,Bのみ入力可なんてふうにも使えるかもしれません。

でも高いですね。.NETには対応していないようなので、コーディングの工数と今後VB6の使用頻度を考えて検討してみます。
ところで、自作コントロールってのはどうやって作るのでしょうか?
どこかいいサイトがあったら教えてください。

投稿時間:2003/07/03(Thu) 16:19
投稿者名:ナンバリ
Eメール:
URL :
タイトル:
Re^3: 制御系なので
以前どこかで参照させてもらったものですが、
下記の用なプログラムではだめでしょうか?

Private Sub Text1_KeyPress(KeyAscii As Integer)
    Const Number$ = "-0123456789."
    If KeyAscii <> 8 Then 'バックスペースは例外
        If InStr(Number, Chr(KeyAscii)) = 0 Then
            KeyAscii = 0
            Exit Sub
        Else
            If "." = Chr(KeyAscii) Then
                If InStr(Text1.Text, ".") > 0 Then '「.」は一つだけ
                    KeyAscii = 0
                    Exit Sub
                End If
            End If
            If "-" = Chr(KeyAscii) Then
                If InStr(Text1.Text, "-") > 0 Then '「-」は一つだけ
                    KeyAscii = 0
                    Exit Sub
                End If
            End If
        End If
    End If

    '入力チェック
    if val(text1.text) >= 9999 then msgbox "上限を超えました"

End Sub

チェックをかけるのはコントロール配列の方が便利だと思います。

投稿時間:2003/07/03(Thu) 17:44
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: 制御系なので
> 上のはいいですね。「入力値の自動チェック(範囲や妥当性の判定)、入力文字の制限」
> なんて書いてあるので、MAX,MINのチェックのほかにも
> 製番などでA001、B001のように英字はA,Bのみ入力可なんてふうにも使えるかもしれません。
体験版(トライアル版)もありますので、実際に試されては如何でしょうか。

> でも高いですね。.NETには対応していないようなので、
配布ライセンスが無料の製品のわりには、比較的安価なコンポーネントだと思いますよ。
個人で買うとなると、流石にちょっと手が出し難いですけれどね……。

ちなみに、.NET版はこちら。
http://www.grapecity.com/japan/support/database/P7_200.htm

> コーディングの工数と
それほど複雑な入力チェックを行わないような場合は、オーバースペックになって
しまうでしょうから、今後の開発(およびメンテナンス)にかかる人件費との相談ですね。

> ところで、自作コントロールってのはどうやって作るのでしょうか?
MSDNライブラリの以下の項目に、チュートリアルがあります。

VB6(Visual Studio 6)の場合:
[MSDN ライブラリ]
└[Visual Studio 6.0 ドキュメント]
 └[Visual Basic ドキュメント]
  └[Visual Basic の使用方法]
   └[コンポーネント ツール ガイド]
    └[ActiveX コンポーネントの作成方法]
     └[ActiveX コントロールの作成手順]

VB.NET(Visual Studio.NET 2002 および同2003)の場合:
[MSDN ライブラリ]
└[.NET 開発]
 └[.NET 開発]
  └[Visual Studio .NET]
   └[製品ドキュメント]
    └[Visual Basic と Visual C#]
     └[コンポーネントによるプログラミング]
      └[コンポーネントの作成]
       └[Windows フォーム用のコントロールの作成]

投稿時間:2003/07/03(Thu) 23:59
投稿者名:Lantern
Eメール:
URL :
タイトル:
Re: 制御系なので
私の場合、こういった同様な処理が多い場合デザインパターンを
使用します。

少し長いですがサンプルです。
テキストボックスへの入力を範囲に入っている、入っていないで
文字色を変えたりしています。
Form_Loadで初期化しておくだけでよいのでコードの煩雑さはなくなります。

尚、これを作成したときには
サイト:”プログラムのメモ帳”の”デザインパターンを応用したコントロールの拡張”
等を参考にさせていただきました。
http://hp.vector.co.jp/authors/VA010223/


'-------------------------------------------------------------------------
'- clsSubText.cls
'-------------------------------------------------------------------------
'================================================
'=
'=  テキストボックスデザインパターン化
'=  機能:初期値
'=    :最大最小範囲
'=    :入力変更 文字色緑
'=    :リターン 文字色黒
'=    :値違反  文字色赤
'=
'================================================
Option Explicit
Private WithEvents oTxt As TextBox
Private dMax As Double
Private dMin As Double
'================================================
'=
'=  関数:InitText
'=  機能:テキストボックスのデザインパターン追加
'=  引数:objTxt    テキストボックス
'=    :vMax      最大値
'=    :vMin      最小値
'=  戻り:デザインパターン追加テキストボックス
'=
'================================================
Public Function InitText(ByRef objTxt As TextBox, _
                         ByVal vMax As Double, _
                         ByVal vMin As Double, _
                         Optional ByVal vInit As Variant) As clsSubText

    Set oTxt = objTxt
    dMax# = vMax#
    dMin# = vMin#
    If Not IsMissing(vInit) Then
        oTxt.Text = CStr(vInit)
        Call oTxt_LostFocus
    End If

    Set InitText = Me

End Function
'================================================
'=
'=  テキストボックスの変更
'=
'================================================
Private Sub oTxt_Change()

    If oTxt.Text = vbNullString Then
        Exit Sub
    End If
    If Not IsNumeric(oTxt.Text) Then
        oTxt.ForeColor = vbRed
        Exit Sub
    End If
    If ((CDbl(oTxt.Text) > dMax#) Or _
        (CDbl(oTxt.Text) < dMin#)) Then
        oTxt.ForeColor = vbRed
        Exit Sub
    End If
    
    oTxt.ForeColor = vbGreen
    
End Sub
'================================================
'=
'=  テキストボックスの確定
'=
'================================================
Private Sub oTxt_KeyPress(KeyAscii As Integer)

    If KeyAscii% = vbKeyReturn Then
        If ((CDbl(oTxt.Text) > dMax#) Or _
            (CDbl(oTxt.Text) < dMin#)) Then
            oTxt.ForeColor = vbRed
            Exit Sub
        End If
        oTxt.ForeColor = vbBlack
        KeyAscii% = 0
    End If

End Sub
'================================================
'=
'=  テキストボックスフォーカス移動による確定
'=
'================================================
Private Sub oTxt_LostFocus()

    If ((CDbl(oTxt.Text) > dMax#) Or _
        (CDbl(oTxt.Text) < dMin#)) Then
        oTxt.ForeColor = vbRed
        Exit Sub
    End If
    oTxt.ForeColor = vbBlack

End Sub

'-------------------------------------------------------------------------
'- テキストボックスを配置されたフォームのロードイベント
'-------------------------------------------------------------------------
Private colTextBox As Collection
Private Sub Form_Load()
    '========================================
    '=  テキストボックスの初期化
    '========================================
    Set colTextBox = New Collection
    colTextBox.Add NewText.InitText(Me.txtText1, 30, -30, -30)
    colTextBox.Add NewText.InitText(Me.txtText2, 100, -50, 15)
End Sub

'-------------------------------------------------------------------------
'- 標準モジュール
'-------------------------------------------------------------------------
'=================================================
'=
'= 関数 :NewText
'= 機能 :デザインパターン追加用関数
'= 引数 :
'= 戻り :clsSubText  追加されたclsSubText
'=
'=================================================
Public Function NewText() As clsSubText

    Set NewText = New clsSubText

End Function

投稿時間:2003/07/04(Fri) 02:20
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^2: 制御系なので
ちなみに、No.4608 の Lantern さんの投稿のように、クラスモジュールとWithEventsで
制御させるという手法をとる場合には、そのコントロールを「コントロール配列」に
する事ができなくなりますので、その点は注意してくださいね。>TMさん

# 標準コントロールではなく、ActiveXコントロールであれば、
# コントロール配列であっても処理する事ができるのだけれども。。。

投稿時間:2003/07/07(Mon) 13:44
投稿者名:TM
Eメール:
URL :
タイトル:
遅くなりましたが
遅くなってしまいましたが、みなさんご回答ありがとうございます。
Lanternさんの色が変わるのいいですね。でも私には難解なので教えて頂いたサイトを見て勉強してみます。
魔界の仮面弁士さんのMSDNライブラリのほうは行き方がよくわかりませんでした。
http://www.microsoft.com/japan/msdn/library/default.asp
から
「Visualツールおよび開発言語」
「Visual Studio」
「Visual Studio 6.0」
「技術文書」
とたどっていくのでしょうか?道に迷ってしまいました。