DOBON.NET DOBON.NETプログラミング掲示板過去ログ

.NetでMaskEditのプロパティ

環境/言語:[WinXP、 VB.Net2003]
分類:[.NET]

現在、,NetでAxMsMask.AxMSEdBox(以下 マスクエディット)を使用しています。
マスクは"####/##/##"になっています。


フォーム上に二つのマスクエディット(medDate1,medDate2)と、
その他のコントロールがあります。

1.medDate1でEnterキーが押された時、KeyPressイベントで次のmedDate2に
フォーカスを移動。medDate2でEnterキーが押された時、次のコントロールに移動

2.medDate1からmedDate2のコントロールにフォーカスが移動する時、
medDate2の値が空だったら、前のmedDate1の値をmedDate2にコピー。

というコードを書いています。


medDate1のLeaveイベント、またはmedDate2のEnterイベントで、
medDate2の値をCtlText、ClipText、SelTextなどを使用して
値を取得するコードが存在すると、
medData1からmedData2にEnterキーで移動(1)、
medData2から次のコントロールににEnterキーで移動(2)、
した時に、(2)の段階で、medData2に入っていた値が消えて
しまいます。

ただし、この現象がおきるのは、medData2に値が途中までのみ
入っていた場合です。"2003/01/01"などのように、全て入力
済みの場合は起きません。

また、TABキーで移動した場合も起きません。

同じような現象に見舞われたりなどで、解決策を知っている方は
いらっしゃらないでしょうか。

ちなみにマスクエディットのTextプロパティでは、値の取得も設定も
できませんでした。

以下がそのコードになります。
フォームにマスクエディット二つ(medDate1,medDate2)とテキスト
ボックス(TextBox1)を置いてください。

Private Sub medDate1_KeyPressEvent _
(ByVal sender As System.Object, _
ByVal e As AxMSMask.MaskEdBoxEvents_KeyPressEvent) _
Handles medDate1.KeyPressEvent
If (CChar(Chr(e.keyAscii)) = Microsoft.VisualBasic.ChrW(13)) Then
If (Me.medDate2.CanFocus = True) Then Me.medDate2.Focus()
End If
End Sub
Private Sub medDate2_KeyPressEvent _
(ByVal sender As System.Object, _
ByVal e As AxMSMask.MaskEdBoxEvents_KeyPressEvent) _
Handles medDate2.KeyPressEvent
If (CChar(Chr(e.keyAscii)) = Microsoft.VisualBasic.ChrW(13)) Then
If (Me.TextBox1.CanFocus = True) Then Me.TextBox1.Focus()
End If
End Sub

Private Sub TextBox1_KeyPress_
(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles TextBox1.KeyPress
If (e.KeyChar = Microsoft.VisualBasic.ChrW(13)) Then
If (Me.medDate1.CanFocus = True) Then Me.medDate1.Focus()
End If
End Sub

Private Sub medDate1_Leave _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles medDate1.Leave
If (Me.ActiveControl Is Me.medDate2) Then
If (medDate2.ClipText.Trim = "") Then '---※
Me.medDate2.CtlText = Me.medDate1.CtlText
End If
End If
End Sub

※--ここで値を取得しなければ蒸気のような現象は発生しません。
> ちなみにマスクエディットのTextプロパティでは、値の取得も設定も
> できませんでした

ちなみに部分しか、体験していませんが、同じ現象がおきています。
やはり、Textプロパティでは値の取得ができないです。
また、seltextも取得できないです。

値取得ができるのは、cliptextだけ。
バグなんですかね。
active-xコントロールって使わない方がいいんでしょうか。(+_+)
■No2269に返信(kenyさんの記事)
回答ではありませんが、マスクエディットコントロールはVB.NETで作成されている方が何人かいらっしゃるようなので、これらを使われていただくのも一つの手ではないでしょうか。

・The Code Project - FlexMaskEditBox - a masked edit control - VB.NET
http://www.thecodeproject.com/vb/net/CpFlexMaskEditBox.asp

・The Code Project - TextBox whith Validation Functions and MaskEdit - VB.NET
http://www.codeproject.com/vb/net/validtext3.asp

・The Code Project - VB.NET Maskedbox Control - Final Release - VB.NET
http://www.codeproject.com/vb/net/maskedbox_control.asp
■No2269に返信(kenyさんの記事)
>>ちなみにマスクエディットのTextプロパティでは、値の取得も設定も
>>できませんでした
>
> ちなみに部分しか、体験していませんが、同じ現象がおきています。
> やはり、Textプロパティでは値の取得ができないです。
> また、seltextも取得できないです。
>
> 値取得ができるのは、cliptextだけ。
> バグなんですかね。
> active-xコントロールって使わない方がいいんでしょうか。(+_+)


自己レスです。
米・MSのサポートページに怪しい記事が・・・・
http://support.microsoft.com/default.aspx?scid=kb;en-us;814321
よく分からない英文ですが、.NETでは、MASKED EDIT CONTROLのテキストプロパティは機能しない(でも文中には使えるようなことも書いてある)ようなことが書いてありました。
どうも、まともではないようです。
代わりにCtlTextを使うように書いてあったので、半信半疑で利用したら、seltextの効能と同じでように値を取得できました。(*^_^*)

あまりこのコントロールには深入りするのは、危険かもしれないので、別のコードを利用させてもらうことにします。
ほかにも、ツールチップが表示できないとか、ランタイムエラーがでるとかみたいなことが見つかりましたんで(英文でしたから、真偽の程はご自分で)
皆様、ありがとうございます。

とりあえず、フォーカス移動時にマスクエディットの内容が消えてしまう現象は、
Leaveイベントでの値コピー前に、ClipTextやCtlTextなどでフォーカス移動先の
値を取得せずに、マスクのChangeイベントで最新の値をメンバ変数(モジュール
変数?)に退避させ、それをコピー前に参照するようにして回避しました。

今回は諸事情でほかの方が作られたコントロールを使えないのが痛いです。
余裕があるときにぜひ試してみたいです。


ちなみにCtlTextプロパティで値を取得する時に、タイミングに
よっては、入力されていないマスク部分がPromptCharで設定された
文字になって取れてきたり、スペースとして取れてきたりで、
値比較をするなどの場合に気をつけないといけないようです。
解決済み!
> ちなみにマスクエディットのTextプロパティでは、値の取得も設定も
> できませんでした。

ちょっと記憶があやふやなんですが、
マスクエディットコントロールを.NETで使う場合の
TextプロパティはdefaultTextプロパティとかいうプロパティだったような気が・・・
オブジェクトブラウザでプロパティをざっと確認して見て下さい。

違ったらごめんなさい。
> ちょっと記憶があやふやなんですが、
> マスクエディットコントロールを.NETで使う場合の
> TextプロパティはdefaultTextプロパティとかいうプロパティだったような気が・・・
> オブジェクトブラウザでプロパティをざっと確認して見て下さい。

ありました。
値とれました。
CtlTextと同じような動きしますね。
マスク箇所の文字が取れたり取れなかったりするところも・・。

元の投稿の、問題の箇所に埋め込んで動作させてみましたが、
やはり値が消えてしまうという現象が起きてしまいました。

DOBON.NET | プログラミング道 | プログラミング掲示板