DBGridに規制をかけるには?

解決


琅珎  2002-12-04 16:42:20  No: 76503  IP: [192.*.*.*]

DBGridを使い、Accessのテーブルのデータを表示させていて、その際各レコードに文字数の規制(4文字以内)や郵便番号とかの特殊な形にするための入力制限はかけられないのでしょうか?

編集 削除
魔界の仮面弁士  2002-12-05 11:06:16  No: 76504  IP: [192.*.*.*]

> 文字数の規制
更新前に切り捨てるとか。。。

Private Sub DBGrid1_BeforeColUpdate( _
    ByVal ColIndex As Integer, _
    OldValue As Variant, _
    Cancel As Integer)
  Dim Value As Variant

  '処理対象の列番号かどうか
  If ColIndex = 対象列の番号 Then
    '現在の入力値を取得
    Value = "" & DBGrid1.Columns(ColIndex).Value
    '4バイトを超えている場合は、入力値の先頭4バイトのみを利用する
    If LenB(StrConv(Value, vbFromUnicode)) > 4 Then
      Cancel = 1
      Value = StrConv(LeftB(StrConv(Value, vbFromUnicode), 4), vbUnicode)
      OldValue = IIf(Value = "", Null, Value)
    End If
  End If
End Sub


> 郵便番号とかの特殊な形
う〜ん。DBGridだと、アンバウンドモードを使わない限り、
細かい入力制限はかけられない様な気がします。

VB6のDataGridであれば、「Microsoft Data Formatting Object Library」を
参照設定する事で使える[StdDataFormatオブジェクト]のイベントで
対処できるのですけれども。

編集 削除
瑰琿  2002-12-05 11:52:35  No: 76505  IP: [192.*.*.*]

StrConvってのは一体なんですか?
どこかでDimでセットされたものなのですか?
基本的なことを聞いているのかもしれないですけどはじめたばかりでうまく理解できていないところがあるのでよろしければ教えてください。

編集 削除
魔界の仮面弁士  2002-12-05 12:18:47  No: 76506  IP: [192.*.*.*]

> StrConvってのは一体なんですか?
まずは、ヘルプやWebで調べてから質問しましょう。(^_^;)

> どこかでDimでセットされたものなのですか?
StrConvは、「文字列を変換するための関数」です。


最初の質問で、「文字数の規制(4文字以内)」というものが
ありましたよね。もしこれが、「漢字4文字」も許可するのであれば、
StrConvは不要です。その場合は、

  If Len(Value) > 4 Then
    Cancel = 1
    Value = Left(Value, 4)
    OldValue = IIf(Value = "", Null, Value)
  End If
で済みます。

しかし、文字数制限ではなく、全角文字は2バイト・半角文字は1バイトと
みなして、「バイト数」による制限をかけたい場合は、先のように
StrConv関数を利用する必要があるでしょう。

編集 削除
瑰琿  2002-12-05 13:41:57  No: 76507  IP: [192.*.*.*]

4バイト以上の文字は入らなくなりましたが、決定するまでには何文字も入り、わかりにくくないですか?
はじめからそのレコードには特定の文字数以上は入らないようにするってことはできないのでしょうか(テキストボックスのMaxLengthの設定のように)?

編集 削除
琅珎  2002-12-05 14:12:04  No: 76508  IP: [192.*.*.*]

>> 郵便番号とかの特殊な形
>DBGridだと、アンバウンドモードを使わない限り、
>細かい入力制限はかけられない様な気がします。
アンバウンドモードっていうのは何ですか?
ヘルプでも見つからなかったのですが?

編集 削除
魔界の仮面弁士  2002-12-05 14:53:56  No: 76509  IP: [192.*.*.*]

> アンバウンドモードっていうのは何ですか?

DBGridの Unbound系イベントを利用した方法を指します。

英語版のヘルプでは、文字通りUnbound Modeと書かれているのですが、
日本語版のヘルプでは`非連結モード`などと訳されているので、
ちょっとわかりにくかったかもしれませんね。

http://www.bcap.co.jp/hanafusa/vbbbs/wforum.cgi?no=1563&reno=1558&oya=1558&mode=msgview&page=30

編集 削除
魔界の仮面弁士  2002-12-05 15:19:36  No: 76510  IP: [192.*.*.*]

> 決定するまでには何文字も入り、わかりにくくないですか?
確かにわかり難いと思います。(^_^;)

まぁ、RichTextBoxのMaxLengthなどでは、変換前の文字列まで
入力制限を受けてしまうので、それよりはマシだと考えるしか無いかも。


> はじめからそのレコードには特定の文字数以上は入らないようにするってことはできないのでしょうか
どうしても、というのであれば、APIを使って制限をかける事はできます。

ただし環境によっては、半角英数字には対応できるものの、
漢字入力時には対応しきれないので、先の回答のチェックは
いずれにしても必要となるでしょう。

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
   (ByVal hWnd As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const EM_LIMITTEXT = &HC5

Private Sub DBGrid1_ColEdit(ByVal ColIndex As Integer)
  '処理対象の列番号かどうか
  If ColIndex = 対象列の番号 Then
    SendMessage DBGrid1.hWndEditor, EM_LIMITTEXT, 4, 0
  End If
End Sub


> (テキストボックスのMaxLengthの設定のように)?
VB5のそれは、バイト数制限ではなく、文字数制限ですけれどね。

編集 削除
瑰琿  2002-12-05 15:58:07  No: 76511  IP: [192.*.*.*]

APIを利用してやるんですね。やってみます。
いろいろとありがとうございました。

編集 削除
琅珎  2002-12-05 16:24:19  No: 76512  IP: [192.*.*.*]

アンバウンド、バウンドの理解にはまだ時間がかかりそうですが、何とかやってみたいと思います。
どうもありがとうございます。

編集 削除
琅珎  2002-12-05 16:26:09  No: 76513  IP: [192.*.*.*]

解決時のチェック忘れてました。
何とか解決しました。

編集 削除