tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルテキストボックスの3桁毎のカンマ表示
記事No12666
投稿日: 2008/07/02(Wed) 14:27
投稿者ゆき

VB6,SP5、WindowsXPの環境です。
それ以外に必要でしたら追記しますのでレスください。

テキストボックスに金額を入れると(例えば「3000000」)をいれると
3,000,000にしたくて、

Private Sub Text1_Change()
    Form1.Text1.Text = Format(Form1.Text1.Text, "#,##0")
End Sub
(Form1.Text1のAlgnmentは右揃え、MaxLengthは0です。)

と、した分けですが、どう言うことか、「3000」を打った時点で
「|3,000」となり、次の桁を打っても入力されないのです。
(↑で、3の前にある「|」はカーソルの位置です。)
プロパティーで何か設定するヶ所があったり、
プログラムそのものが悪いのでしょうか?

具体的に操作を下に示します。
("「」"をテキストボックスに見立ててください
"|"はカーソルに見立ててください)

@初期値
「      |」
A"3"を入力
「     3|」
B十の位の"0"を入力
「    30|」
C百の位の"0"を入力
「   300|」
D千の位の"0"を入力
「 |3,000」
E万の位の"0"を入力
「 |3,000」←以降"0"を入力しても同じ

但し、万の位以降"0"以外の数字ならばOKとなります。
どうも、千の位を入力後にカーソルが一番先頭に来るのが
問題みたいです。
連続して「3000000」)をいれると3,000,000となる様な対策はあるのでしょか?

[ツリー表示へ]
タイトルRe: テキストボックスの3桁毎のカンマ表示
記事No12668
投稿日: 2008/07/02(Wed) 15:09
投稿者いな
こうしてデバッグコメントを入れてみると、
へぇ〜、こんな動きしているんだ・・・。と分かるかも・・・。
なので、カーソル位置を強制的に移動させちゃいませう。

Private Sub Text1_Change()
    Debug.Print Form1.Text1.Text
    Form1.Text1.Text = Format(Form1.Text1.Text, "#,0")
    Debug.Print Form1.Text1.Text

' このコメントを外す↓
'    Form1.Text1.SelStart = Len(Form1.Text1.Text)

End Sub

[ツリー表示へ]
タイトルRe^2: テキストボックスの3桁毎のカンマ表示
記事No12670
投稿日: 2008/07/02(Wed) 15:32
投稿者るしぇ
もうちょっと分かり易くするなら
[VB6.0(SP5)]
Private Sub Command1_Click()
    With Me.Text1
        .Text = "300"
        Debug.Print .SelStart
        
        .SelStart = Len(.Text)
        Debug.Print .SelStart
    
        .Text = "300"
        Debug.Print .SelStart
    
        .Text = "30"
        Debug.Print .SelStart
    End With

End Sub

Private Sub Form_Load()
    With Me.Text1
'        .Algnment = 1 'デザイン画面でのみ設定可
        .MaxLength = 0
    End With
End Sub

Private Sub Text1_Change()
    Debug.Print "Change"; Text1.Text
End Sub


[出力]
>Change300
>0
>3
>3
>Change30
>0

変更後のテキストが、変更前の Text の値と一致していると
代入しても Text の更新処理は実行してないという動きが確認
できます。

Text 更新の内部処理を想像して、一度 ""(クリア)にしておいて
変更後の文字列を右順に挿入している。。。
というのは無理の無い解釈だと思うのですがどうでしょう?
それが正しいと仮定するとテキスト更新後はカーソルが左端に
来るのが自然ですね。

思いつく解決案は先に書き込まれた方々と同じなので省略。

[ツリー表示へ]
タイトルRe: テキストボックスの3桁毎のカンマ表示
記事No12669
投稿日: 2008/07/02(Wed) 15:26
投稿者
リアルタイムで「,」を出す必要がない(最終的に入っていれば良い)のであれば
LostFocus時にFormat関数で操作するのが手っ取り早いですかね。

リアルタイムだと入力済みのテキストボックスについて修正を行う場合に
カーソル位置の計算が大変だと思いますよ。

例)3,000,000 → 3,150,000 に修正する場合等

[ツリー表示へ]
タイトルRe^2: テキストボックスの3桁毎のカンマ表示
記事No12671
投稿日: 2008/07/02(Wed) 15:36
投稿者いな
> LostFocus時にFormat関数で操作するのが手っ取り早いですかね。

確かにリアルタイムでやる必要は無いかも・・・。
Validiate時でやってもいいですね。

[ツリー表示へ]
タイトルRe^3: テキストボックスの3桁毎のカンマ表示
記事No12673
投稿日: 2008/07/02(Wed) 15:56
投稿者るしぇ
> 確かにリアルタイムでやる必要は無いかも・・・。
無理にリアルタイムでやってみたw
あまり検証してないので時間のある方は改善案よろm(__)m
[VB6.0(SP5)]
Private myChangeFlag As Boolean

Private Sub Text1_Change()
    Dim intSelStart As Integer
    Dim intBeforeLen As Integer
    Dim intAfterLen As Integer
    
    If myChangeFlag = False Then
        myChangeFlag = True
        intSelStart = Me.Text1.SelStart
        intBeforeLen = Len(Me.Text1.Text)
        Me.Text1.Text = Format(Me.Text1.Text, "#,##0")
        intAfterLen = Len(Me.Text1.Text)
        Me.Text1.SelStart = intSelStart + (intAfterLen - intBeforeLen)
        myChangeFlag = False
    End If
End Sub

[ツリー表示へ]
タイトルRe: テキストボックスの3桁毎のカンマ表示
記事No12674
投稿日: 2008/07/02(Wed) 16:18
投稿者Do_Shirouto
>
> VB6,SP5、WindowsXPの環境です。
> それ以外に必要でしたら追記しますのでレスください。
>
> テキストボックスに金額を入れると(例えば「3000000」)をいれると
> 3,000,000にしたくて、
>
> Private Sub Text1_Change()
>     Form1.Text1.Text = Format(Form1.Text1.Text, "#,##0")
> End Sub
> (Form1.Text1のAlgnmentは右揃え、MaxLengthは0です。)
>
> と、した分けですが、どう言うことか、「3000」を打った時点で
> 「|3,000」となり、次の桁を打っても入力されないのです。
> (↑で、3の前にある「|」はカーソルの位置です。)
> プロパティーで何か設定するヶ所があったり、
> プログラムそのものが悪いのでしょうか?
>
> 具体的に操作を下に示します。
> ("「」"をテキストボックスに見立ててください
> "|"はカーソルに見立ててください)
>
> @初期値
> 「      |」
> A"3"を入力
> 「     3|」
> B十の位の"0"を入力
> 「    30|」
> C百の位の"0"を入力
> 「   300|」
> D千の位の"0"を入力
> 「 |3,000」
> E万の位の"0"を入力
> 「 |3,000」←以降"0"を入力しても同じ
>
> 但し、万の位以降"0"以外の数字ならばOKとなります。
> どうも、千の位を入力後にカーソルが一番先頭に来るのが
> 問題みたいです。
> 連続して「3000000」)をいれると3,000,000となる様な対策はあるのでしょか?

私は下記のようにしていますが、
何の不都合もありませんが、
初心者なので間違っているかもしれません。
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
Text1.Text = Format(Format(Text1.Text), "###,###,##0")
Text1.SelStart = Len(Text1.Text)
End Sub

[ツリー表示へ]
タイトルRe: テキストボックスの3桁毎のカンマ表示
記事No12676
投稿日: 2008/07/02(Wed) 20:30
投稿者ゆき
みなさん、どうもレスありがとうございました。
私もこのリアルタイムでカンマを付ける前には
Validateでカンマを後付けしてたのですが、
入力途中に0が沢山になって「桁が分からなくなる
人も居るよな〜?」と思い改善を試みました。

結果的には、Do_Shiroutoさんの方法を基本にして
BSで数字を消したときには、カーソルが動かない
工夫をこれから考えたいと思います。
しかし、その工夫でつまづいた時、再び出現しますが
その節もどうぞ宜しくお願い致します。


みなさま、どうも素早い対応ありがとうございました。

[ツリー表示へ]