tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルIPアドレス
記事No12652
投稿日: 2008/06/30(Mon) 10:03
投稿者IP
テキストボックスに
0.0.0.0〜255.255.255.255のアドレスだけしか入力させないプログラムを書いたのですが
予想される規定を色々考えて書いていたら、
めちゃくちゃ変数を使い長い文になってしまいました。
Timer1_Timer内で
Dim PortCheck1 As Boolean           'ポート名確認
Dim PortCheck2 As Boolean
Dim PortCheck3 As Boolean
Dim PortCheck4 As Boolean
Dim PortCheck5 As Boolean
Dim PortCheck6 As Boolean
PortCheck1 = PortName.Text Like "*#.*#.*#.*#"          
PortCheck2 = PortName.Text Like "*.*.*.####"          
PortCheck3 = PortName.Text Like "*.*.*.#####"
PortCheck4 = PortName.Text Like "*.*.*.######"
PortCheck5 = PortName.Text Like "*.*.*.#######"
PortCheck6 = PortName.Text Like "*.*.*.########"
↑このように定義し(一部です・・・。)
If PortCheck1 = True And PortCheck2 = False _
    And PortCheck3 = False And PortCheck4 = False _
    And PortCheck5 = False And PortCheck6 = False Then
↑このようにいくつもFalseかTrueか判別させ入力させないという文にしました。

このような長い文ではなく下記の
・0.0.0.0〜255.255.255.255まで
・もちろんピリオド "." は3つまで
・特殊記号を使わない
・大文字不可
これらの条件を満たすコーディングを思いついた方、
解答宜しくお願いいたします。

[ツリー表示へ]
タイトルRe: IPアドレス
記事No12653
投稿日: 2008/06/30(Mon) 10:21
投稿者よねKEN
(1) 4つのテキストボックスを使う方法 (おすすめ)
4つのテキストボックス(と間に「.」を表示するための3つのラベル)を用意するのが
簡単だと思いますよ。
この方法なら、各テキストボックスの値が0〜255の数値かどうかだけチェックすればよいです。

(2) 1つのテキストボックスで行う方法
どうしても1つのテキストボックスで入力させたいのであれば、
まずテキストボックスの値をSplit関数を使って「.」で4つのパーツに分割します。
・4つのパーツに分割されたかどうかをチェックします。
・各パーツが数値の0〜255かどうかをチェックします。

[ツリー表示へ]
タイトルRe: IPアドレス
記事No12654
投稿日: 2008/06/30(Mon) 10:25
投稿者ダンボ
以前に回答したことがあります。
http://hanatyan.sakura.ne.jp/logbbs1/wforum.cgi?mode=allread&no=2459&page=1440#2459

[ツリー表示へ]
タイトルRe^2: IPアドレス
記事No12655
投稿日: 2008/06/30(Mon) 11:29
投稿者IP
ちょっと言葉不足だったからかもしれません・・・。すみません。
Timer内でこの判別を行うためリアルタイムにテキストボックス内をチェックしています。
Dim ChkIP() As String '分割したIPアドレス
Dim i As Integer
ChkIP() = Split(Text1.Text, ".")
If UBound(ChkIP) <> 3 Then Stop
    For i = 0 To 3
        If Not IsNumeric(ChkIP(i)) Then Stop
        If (Val(ChkIP(i)) < 0) Or (Val(ChkIP(i)) > 255) Then Stop
    Next i
End Sub
このやり方を実行するとピリオドが3つないときつまり無記入の状態だと
インデックスが指定範囲外になってしまうので駄目でした。
僕が最初に定義してあるIf文では、
(PortCheck1 = PortName.Text Like "*#.*#.*#.*#"  )
上記より、ピリオドが3つ以上ないと判別の処理を実行しないものになっています。
リアルタイムにテキストボックスを呼び出し判別するかたちで
何か良い案がありましたら宜しくお願い致します。
ちなみに自分が思いついた判別方法がこれです。

PortCheck1 = PortName.Text Like "*#.*#.*#.*#"           '最低1桁ピリオド毎に入力
PortCheck2 = PortName.Text Like "*.*.*.####"            'ピリオド毎に4桁以上入力不可
PortCheck3 = PortName.Text Like "*.*.*.#####"
PortCheck4 = PortName.Text Like "*.*.*.######"
PortCheck5 = PortName.Text Like "*.*.*.#######"
PortCheck6 = PortName.Text Like "*.*.*.########"
PortCheck7 = PortName.Text Like "*.*.*.#########"
PortCheck8 = PortName.Text Like "*.*.####.*"
PortCheck9 = PortName.Text Like "*.*.#####.*"
PortCheck10 = PortName.Text Like "*.*.######.*"
PortCheck11 = PortName.Text Like "*.*.#######.*"
PortCheck12 = PortName.Text Like "*.*.########.*"
PortCheck13 = PortName.Text Like "*.*.#########.*"
PortCheck14 = PortName.Text Like "*.####.*.*"
PortCheck15 = PortName.Text Like "*.#####.*.*"
PortCheck16 = PortName.Text Like "*.######.*.*"
PortCheck17 = PortName.Text Like "*.#######.*.*"
PortCheck18 = PortName.Text Like "*.########.*.*"
PortCheck19 = PortName.Text Like "*.#########.*.*"
PortCheck20 = PortName.Text Like "####.*.*.*"
PortCheck21 = PortName.Text Like "#####.*.*.*"
PortCheck22 = PortName.Text Like "######.*.*.*"
PortCheck23 = PortName.Text Like "#######.*.*.*"
PortCheck24 = PortName.Text Like "########.*.*.*"
PortCheck25 = PortName.Text Like "#########.*.*.*"
PortCheck26 = PortName.Text Like "*.*.*.*.*"            'ピリオドを3つ以上入力不可
PortCheck27 = PortName.Text Like "*.*.*.*.*.*"
PortCheck28 = PortName.Text Like "*.*.*.*.*.*.*"
PortCheck29 = PortName.Text Like "*.*.*.*.*.*.*.*"
PortCheck30 = PortName.Text Like "2[6-9]#.*.*.*"        '255以上の数字を入力不可
PortCheck31 = PortName.Text Like "*.2[6-9]#.*.*"
PortCheck32 = PortName.Text Like "*.*.2[6-9]#.*"
PortCheck33 = PortName.Text Like "*.*.*.2[6-9]#"
PortCheck34 = PortName.Text Like "2[5-9][6-9].*.*.*"
PortCheck35 = PortName.Text Like "*.2[5-9][6-9].*.*"
PortCheck36 = PortName.Text Like "*.*.2[5-9][6-9].*"
PortCheck37 = PortName.Text Like "*.*.*.2[5-9][6-9]"
PortCheck38 = PortName.Text Like "0#*.*.*.*"            '数字の前に0を入力不可
PortCheck39 = PortName.Text Like "*.0#*.*.*"
PortCheck40 = PortName.Text Like "*.*.0#*.*"
PortCheck41 = PortName.Text Like "*.*.*.0#*"
PortCheck42 = PortName.Text Like "[3-9]##.*.*.*"
PortCheck43 = PortName.Text Like "*.[3-9]##.*.*"
PortCheck44 = PortName.Text Like "*.*.[3-9]##.*"
PortCheck45 = PortName.Text Like "*.*.*.[3-9]##"
これらをIf文で判別し、とあるボタンのEnableをTrueかFalseにしようと言うものです。

[ツリー表示へ]
タイトルRe^3: IPアドレス
記事No12656
投稿日: 2008/06/30(Mon) 12:04
投稿者よねKEN
> ちょっと言葉不足だったからかもしれません・・・。すみません。

何が言葉不足だったのでしょうか?
不足があったなら補足してくださいね。

> Timer内でこの判別を行うためリアルタイムにテキストボックス内をチェックしています。

不足というのはこの辺のことをおっしゃっていますか?
最初の投稿でTimerコントロールを使われている旨は記載がありますので、
そのように理解しています。リアルタイムかどうかによって処理の方法は
変わらないと思います。

> Dim ChkIP() As String '分割したIPアドレス
> Dim i As Integer
> ChkIP() = Split(Text1.Text, ".")
> If UBound(ChkIP) <> 3 Then Stop
>     For i = 0 To 3
>         If Not IsNumeric(ChkIP(i)) Then Stop
>         If (Val(ChkIP(i)) < 0) Or (Val(ChkIP(i)) > 255) Then Stop
>     Next i
> End Sub
> このやり方を実行するとピリオドが3つないときつまり無記入の状態だと
> インデックスが指定範囲外になってしまうので駄目でした。

ダンボさんの書かれているコードの意味を理解されましたか?
IPアドレスが4つのパーツに分割されなかった場合は不正なものとしてStopするようにコーディングされています。

> 僕が最初に定義してあるIf文では、
> (PortCheck1 = PortName.Text Like "*#.*#.*#.*#"  )
> 上記より、ピリオドが3つ以上ないと判別の処理を実行しないものになっています。

そのように修正しましょう。

> ちなみに自分が思いついた判別方法がこれです。

現時点でご提示になっている情報からだとこのような複雑なコードにする
必要性はないと思います。もし必要だとすればIPさんの想定する仕様で、
ここの投稿に記載漏れていることがあるのではないでしょうか。

[ツリー表示へ]
タイトルRe^4: IPアドレス
記事No12657
投稿日: 2008/06/30(Mon) 12:53
投稿者IP
> ダンボさんの書かれているコードの意味を理解されましたか?
> IPアドレスが4つのパーツに分割されなかった場合は不正なものとしてStopするようにコーディングされています。

"0.0.0."
↑テキストに入っている値がこの("."が3でその後がない)場合エラーになりませんか?
ならなければすみません。
こちらが間違っていたことになります。

これまでの条件に合うもので、
短いコーディングが出来れば思ったのですが
この長いままで実行するしかないようですね・・・。

[ツリー表示へ]
タイトルRe^5: IPアドレス
記事No12658
投稿日: 2008/06/30(Mon) 13:11
投稿者よねKEN
> > ダンボさんの書かれているコードの意味を理解されましたか?
> > IPアドレスが4つのパーツに分割されなかった場合は不正なものとしてStopするようにコーディングされています。
>
> "0.0.0."
> ↑テキストに入っている値がこの("."が3でその後がない)場合エラーになりませんか?
> ならなければすみません。

エラーにはならないと思いますが、どこでどんなエラーになると考えられましたか?
(VB6環境はないので、Excelマクロで部分的にのみ動作確認し、
残りは机上デバッグで検証しています)

>If Not IsNumeric(ChkIP(i)) Then Stop

"0.0.0."というデータなら、ここでStopすることになるでしょう。
このデータパターンは不正なデータでよいわけですよね?
Stopの代わりに、不正なデータに対応するときのロジックに修正しましょう。

> これまでの条件に合うもので、

これまでの条件とは?
PortCheck??のことですか?

> 短いコーディングが出来れば思ったのですが
> この長いままで実行するしかないようですね・・・。

??なぜそのような結論になるのでしょう??
私の(2)の方針やダンボさんの案は、

> ・0.0.0.0〜255.255.255.255まで
> ・もちろんピリオド "." は3つまで
> ・特殊記号を使わない
> ・大文字不可

この条件を満たしていますよ。
ダンボさんのコード例はデータが不正だった場合の処理を
すべてStopステートメントで記述されていますので、
IPさんが自分のプログラムに取り込む際にはその辺りは
IPさんのプログラムに合うように修正する必要があります。

[ツリー表示へ]
タイトル解決
記事No12659
投稿日: 2008/06/30(Mon) 13:39
投稿者IP
すみません。
もう一度このコーディングで試してみたところ
stopでちゃんと抜けました・・・。f(^^;
ご迷惑をお掛けしまして申し訳ないです。
皆様、アドバイスありがとうございました。。

ですが、
・特殊記号は使えてしまう。
・00.00.01.001などの3桁だけど数字の前に0が記入してもOK。
・何桁でもOK。
自分で書き直してほしいとの事でしたね。
そうします。

[ツリー表示へ]