DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

VB6やってますが何か。

いまさらVB6かよ!
泣ける。。。


  ∧,,∧l||l   
  ミ,,  彡 
 ミ   ∪  しかも中身の理解ができなくって
 ,と,,と,,,)    納期Overリそう。


継続プロジェクトをやっておりまして、当たり前にあるんですよね。VB6。
VB.NETへ移行するほうがめんどくさい。というわけです。

それにしても、、、VB6のプロジェクトってたいていの場合、
数値変換にしても、Valで変換したり、IsNumericだけでチェックしてたり
誤動作対策がろくに対策されていないコードをよく目にします。

VB 入力チェック論2 チェックする方法 ~ 数値, 半角, アルファベットのチェック 正規表現を使ったチェック
http://homepage1.nifty.com/rucio/main/technique/InputChk2.htm
こちらのページ、IsNumericのTrueを返す時の情報。
とても役に立ちます。

そもそも、IsNumericは実数と整数が区別できないのも相当ひどいね。実用にならないっす。

ということで、
自作で、簡単に、IsIntegerShortとIsIntegerLongを作成しました。
そして、動作確認。



んーー、それにしても、
VB6ユーザーってものすごい数、いるように思いますが
なんで、この程度をテクニックとして公開している人は少ないようですね。
もう古い開発環境だからかなあ。

上記サイトでも、IsDigitの実装はありますが、
文字が0~9だけで成り立っていることを確認するのだけでは、少しもの足りないですがね。
Short型をOverすることも予想しておかないと、誤動作の原因じゃないかな。

IsDoubleなども実装したいところです。

Delphiほどには熱くコードにエネルギーを注ぐ人は少ない。そんな気がしてきてしまいます。

これは、VB.NETに関しても似たような感じ。


高品質なコードを書かなければ、いずれバグがどこかで発生するので
こだわりをもった関数を作っていきたいですね。
そうしないと、予期せぬ場合に誤動作が起きる不安があります。

ちっちゃいちっちゃい部品であっても高品質は保ちたいもの。
自動車工場の部品屋さんのような気がしてきます。


とはいえ、、、
業界自体が、品質より納期納期ですもんねえ。
ぐだぐだなコードを継承して短納期というのは、俺だけが嫌なわけでもないよなあ。。。。

みなさん、そうでもないのですか?

ま。腐らずやっていきたいですね~~

というわけでコードです。
----
Option Explicit

Private Sub Command1_Click()
  Call Check("True", IsIntegerShort("1000"))
  Call Check("True", IsIntegerShort("-32768"))
  Call Check("True", IsIntegerShort("32767"))
  Call Check("False", IsIntegerShort("-32769"))
  Call Check("False", IsIntegerShort("32768"))
  
  Call Check("True", IsIntegerLong("1000"))
  Call Check("True", IsIntegerLong("-32768"))
  Call Check("True", IsIntegerLong("32767"))
  Call Check("True", IsIntegerLong("-32769"))
  Call Check("True", IsIntegerLong("32768"))
  Call Check("True", IsIntegerLong("-2147483648"))
  Call Check("True", IsIntegerLong("2147483647"))
  Call Check("False", IsIntegerLong("-2147483649"))
  Call Check("False", IsIntegerLong("2147483648"))
End Sub

Private Sub Check(ByVal A As String, ByVal B As String)
 If A <> B Then
  MsgBox "A=" & A & vbCrLf & "B=" & B & vbCrLf & "AとBは異なります"
 End If
End Sub

'-----------------------------------------------------------------------------
' 数値を文字列に変換可能かどうか確認する関数
'機能: VB6の場合は
      「-32768~32767」をInteger
      「-2147483648~2147483647」をLong と判断します
'備考:
'-----------------------------------------------------------------------------
Public Function IsIntegerShort(ByVal s As String) As Boolean
On Error GoTo Err
  Dim i As Integer
  i = CInt(s)
  IsIntegerShort = True
  Exit Function
Err:
  IsIntegerShort = False
End Function

Public Function IsIntegerLong(ByVal s As String) As Boolean
On Error GoTo Err
  Dim i As Long
  i = CLng(s)
  IsIntegerLong = True
  Exit Function
Err:
  IsIntegerLong = False
End Function

Public Function TryStrToIntegerShort(ByVal s As String, ByRef OutValue As Integer) As Boolean
On Error GoTo Err
  OutValue = CInt(s)
  TryStrToIntegerShort = True
  Exit Function
Err:
  TryStrToIntegerShort = False
End Function

Public Function TryStrToIntegerLong(ByVal s As String, ByRef OutValue As Long) As Boolean
On Error GoTo Err
  OutValue = CLng(s)
  TryStrToIntegerLong = True
  Exit Function
Err:
  TryStrToIntegerLong = False
End Function



もうひとつ。



'-----------------------------------------------------------------------------
' 文字列が時刻に変換可能かどうか確認する関数
'機能:
'備考:
'履歴
'2009/11/26(木)
'・ 作成
'-----------------------------------------------------------------------------
Public Function IsTime(ByVal S As String) As Boolean
On Error GoTo Err
  Dim i As Date
  i = CDate(S)

  If InStr(S, "/") <> 0 Then
    '文字に「/」が含まれているとだめ
    IsTime = False
  ElseIf InStr(S, ":") = 0 Then
    '文字に「:」が含まれていないとだめ
    IsTime = False
  ElseIf Int(i) <> 0 Then
    IsTime = False
  Else
    IsTime = True
  End If
  Exit Function
Err:
  IsTime = False
End Function

Public Sub testIsTime()
  Call Check("True", IsTime("00:00"))
  Call Check("True", IsTime("00:30"))
  Call Check("True", IsTime("00:59"))
  Call Check("False", IsTime("00:60"))
  Call Check("False", IsTime("00:61"))
  Call Check("True", IsTime("01:23"))
  Call Check("True", IsTime("11:59"))
  Call Check("True", IsTime("12:00"))
  Call Check("True", IsTime("13:00"))
  Call Check("True", IsTime("23:59"))
  Call Check("False", IsTime("23:60"))
  Call Check("False", IsTime("24:01"))
  Call Check("True", IsTime("2:1"))
  Call Check("False", IsTime("25:17"))

  Call Check("True", IsTime("20:00:01"))
  Call Check("False", IsTime("20:00:0100"))
  Call Check("False", IsTime("20:00:010001"))

  Call Check("False", IsTime("2009/01/01 00:00"))


  Call Check("False", IsTime("00"))
  Call Check("False", IsTime("12"))
  Call Check("False", IsTime("13"))
  Call Check("False", IsTime("13:"))
  Call Check("False", IsTime(":00"))
End Sub

Public Function IsDate(ByVal S As String) As Boolean
On Error GoTo Err
  Dim i As Date
  i = CDate(S)

  If InStr(S, ":") <> 0 Then
    '文字に「:」が含まれているとだめ
    IsDate = False
  ElseIf InStr(S, "/") = 0 Then
    '文字に「/」が含まれていないとだめ
    IsDate = False
  ElseIf (i - Int(i) <> 0) Then
    '時刻部分が「0」でないとだめ
    IsDate = False
  Else
    IsDate = True
  End If
  Exit Function
Err:
  IsDate = False
End Function


Public Sub testIsDate()
  Call Check("True", IsDate("2009/01/01"))
  Call Check("False", IsDate("2009/01/01 00:00"))
  Call Check("False", IsDate("2009/01/00"))
  Call Check("False", IsDate("2009/00/05"))
  Call Check("True", IsDate("09/05/05"))
  Call Check("True", IsDate("2009/5/5"))
  Call Check("True", IsDate("9/5/5"))

  Call Check("False", IsDate("9/5/5 00:00"))
  Call Check("False", IsDate("9/5/5 00"))
  Call Check("False", IsDate("9/5/5 01"))

  Call Check("False", IsDate("00:00"))
  Call Check("False", IsDate("00:00"))

  Call Check("False", IsDate("00"))
  Call Check("False", IsDate("12"))
  Call Check("False", IsDate("13"))

  Call Check("True", IsDate("2009/01/010"))
  Call Check("True", IsDate("2009/01/00010"))
  Call Check("False", IsDate("2009/01/10 :"))
  Call Check("False", IsDate("2009/01/"))
  Call Check("True", IsDate("2009/01"))
  Call Check("False", IsDate("20009/01/010"))
  Call Check("False", IsDate("2009/01/100"))
  Call Check("False", IsDate("2009/02/31"))
  Call Check("True", IsDate("2999/02/3"))

End Sub

ん?
IsDateはこんな独自実装しなくても、デフォルトであるのかな?

Check関数は何をやっているかというと、エクストリームプログラミングのテストファーストね。


スポンサーサイト

| 未分類 | 00:31 | comments:2 | trackbacks(-) | TOP↑

COMMENT

テストファーストってのは「テストコードを最初に作る」ことを表してるので、
「Check関数はテストファーストをやってる」というのは使い方がおかしいですよ。
意味をよく把握していない用語を使う場合は、まず検索などをして「テスト」してみてはどうですか?

| VB厨 | 2009/11/28 01:09 | URL | ≫ EDIT

コメントありがとうございます。
ははは。そうですね。

ではなんと呼びましょう。テストコードです。とかかな。

Check関数は、テストコードです。
これはXPのテストファーストをやっています。
という表現が適切ですね。

Delphiびいきの記事で、お気に障りましたか・・・

| ミ・д・彡 | 2009/11/29 02:46 | URL | ≫ EDIT















非公開コメント

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。