[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/12/15(Fri) 14:36
投稿者名:こう
Eメール:
URL :
タイトル:
Changeイベントでテキストボックスを変換
Changeイベントで、テキストボックスに入力した文字の変換を
しています。
入力した、先頭1バイトを、半角の大文字、それ以降を、半角の
小文字に変換しています。

例えば、
「tokyo」と入力したら「Tokyo」と変換
「TOKYO」と入力したら「Tokyo」と変換
したいのですが、どうしても、「Oykto」となってしまいます。
どこがいけないのでしょうか。

IMEModeは、「半角英数」を指定しています。

Private Sub Text1_Change()
    Dim top_chr As String
    Dim str_chr As String

    top_chr = UCase(Mid$(Text1.Text, 1, 1))
    str_chr = LCase(Mid$(Text1.Text, 2))
    Text1.Text = top_chr & str_chr
End Sub

投稿時間:2006/12/15(Fri) 14:53
投稿者名:るしぇ
Eメール:
URL :
タイトル:
Re: Changeイベントでテキストボックスを変換
> どうしても、「Oykto」となってしまいます。
> どこがいけないのでしょうか。
実行途中の動作を確認すれば原因くらいは分かるのでは???

Text が変更された時に挿入ポインタの位置が移動しているのに
何の対策もしてないからでしょう?
SelStart プロパティを設定すれば良いのでは?

※以下、追加
SelStart プロパティだけ設定すれば良いように思いましたが、
再帰してますね。

フラグを用意して Change イベント内での Change イベントの
処理を重複して実行しない方がよさそうです。

投稿時間:2006/12/15(Fri) 14:54
投稿者名:PE
Eメール:
URL :
タイトル:
Re: Changeイベントでテキストボックスを変換
> 「tokyo」と入力したら「Tokyo」と変換
> 「TOKYO」と入力したら「Tokyo」と変換
> したいのですが、どうしても、「Oykto」となってしまいます。
> どこがいけないのでしょうか。

Text1_Changeイベント内でText1を更新しているからです。

投稿時間:2006/12/15(Fri) 15:23
投稿者名:たろ
Eメール:
URL :
タイトル:
Re: Changeイベントでテキストボックスを変換
汎用性はないと思いますが、「KeyPress」時でもできます。

Private Sub Text1_KeyPress(KeyAscii As Integer)
  If Len(Me.Text1) = 0 Then
    KeyAscii = Asc(UCase(Chr(KeyAscii)))
  Else
    KeyAscii = Asc(LCase(Chr(KeyAscii)))
  End If
End Sub

でも、質問はChangeイベントで・・・って書かれていたから、るしぇさんが言われたようにSelStart プロパティで設定するしかないですかね・・・
答えになってなくてすみません。

投稿時間:2006/12/15(Fri) 16:15
投稿者名:YK
Eメール:
URL :
タイトル:
Re: Changeイベントでテキストボックスを変換
こんにちは。

> Private Sub Text1_Change()
      Text1.Text = StrConv(Text1, vbProperCase)
> End Sub

では 駄目?

投稿時間:2006/12/15(Fri) 16:39
投稿者名:たろ
Eメール:
URL :
タイトル:
Re^2: Changeイベントでテキストボックスを変換
> こんにちは。
>  
> > Private Sub Text1_Change()
>       Text1.Text = StrConv(Text1, vbProperCase)
> > End Sub
>
> では 駄目?

これでは、PE さんが言ったように、Text1_Changeイベント内でText1を更新しているから、結果下と同じでは?

> 「TOKYO」と入力したら「Tokyo」と変換
> したいのですが、どうしても、「Oykto」となってしまいます。


「LostFocus」「Validate」だったらOKですよね^^

もしくは、

Private Sub Text1_Change()
  Me.Text1 = StrConv(Me.Text1, vbProperCase)
  Me.Text1.SelStart = Len(Me.Text1)
End Sub

投稿時間:2006/12/15(Fri) 17:23
投稿者名:YK
Eメール:
URL :
タイトル:
Re^3: Changeイベントでテキストボックスを変換

> これでは、PE さんが言ったように、Text1_Changeイベント内でText1を更新しているから、結果下と同じでは?

試して見ました?

投稿時間:2006/12/15(Fri) 17:30
投稿者名:たろ
Eメール:
URL :
タイトル:
Re^4: Changeイベントでテキストボックスを変換
>  
> > これでは、PE さんが言ったように、Text1_Changeイベント内でText1を更新しているから、結果下と同じでは?
>
> 試して見ました?

YKさん、すみませんでした。
なんか、偉そうに指摘したみたいで。。。
今、試した結果ですが

Private Sub Text1_Change()
  Text1.Text = StrConv(Text1, vbProperCase)
End Sub

だと、「TOKYO」と入力したら「Oykto」になりました。
デバッグだと問題ないんんですがね・・・

るしぇ さんが言われた、
>Text が変更された時に挿入ポインタの位置が移動しているのに
これが原因ですね。

投稿時間:2006/12/15(Fri) 17:56
投稿者名:こう
Eメール:
URL :
タイトル:
Re^5: Changeイベントでテキストボックスを変換
皆さん、ありがとうございます。
教えて頂いた、「SelStart」プロパティで上手く行きました。

Text1.SelStart = Len(Text1.Text)

>フラグを用意して Change イベント内での Change イベントの
>処理を重複して実行しない方がよさそうです。
フラグを用意して、処理が重複しないようにとは、
「SelStart」で上手くいっていますが、必要なのでしょうか。
実際、どのような処理になるのですか。

投稿時間:2006/12/15(Fri) 18:44
投稿者名:るしぇ
Eメール:
URL :
タイトル:
Re^6: Changeイベントでテキストボックスを変換
テキスト変更イベントの中でテキストを変更するということは、
その変更イベントの中でまたテキストが変更されて、
その変更イベントで…

…と下手をすると無限ループに陥るので気をつけてください
ということです。
[VB6.0]
Option Explicit
Private m_SyorityuFlag As Boolean '処理中フラグ

Private Sub Text1_Change()
    Dim top_chr As String
    Dim str_chr As String

    If m_SyorityuFlag Then Exit Sub
    
    top_chr = UCase(Mid$(Text1.Text, 1, 1))
    str_chr = LCase(Mid$(Text1.Text, 2))
    m_SyorityuFlag = True
    Text1.Text = top_chr & str_chr
    m_SyorityuFlag = False
    
    Text1.SelStart = Len(Text1.Text)

End Sub

また、
>Text1.SelStart = Len(Text1.Text)
ですけど、当然、ユーザが矢印キー等で挿入ポインタの位置を
変える事はあるわけで、常に文字列の最後に移動するのでは
実用的なレベルにまでは行ってませんが、まぁ、その程度なら
自分で修正できるだろうと思ってコメントしてません。

投稿時間:2006/12/18(Mon) 10:11
投稿者名:こう
Eメール:
URL :
タイトル:
Re^7: Changeイベントでテキストボックスを変換
るしぇさん、YKさん、たるさんありがとうございます。
教えていただいたことで再度、確認してみます。

投稿時間:2006/12/18(Mon) 13:59
投稿者名:こう
Eメール:
URL :
タイトル:
Re^7: Changeイベントでテキストボックスを変換
> また、
> >Text1.SelStart = Len(Text1.Text)
> ですけど、当然、ユーザが矢印キー等で挿入ポインタの位置を
> 変える事はあるわけで、常に文字列の最後に移動するのでは
> 実用的なレベルにまでは行ってませんが、まぁ、その程度なら
> 自分で修正できるだろうと思ってコメントしてません。

確かに、
矢印キー等で挿入ポインタの位置を変えて入力された文字の
修正を行うとおかしくなります。
複数文字を入れようとすると、先頭の1文字のみがポインタ
のある位置に入り残りすべてが、最後に入ってしまいます。

どう対処すればいいですか。

投稿時間:2006/12/19(Tue) 13:51
投稿者名:YK
Eメール:
URL :
タイトル:
Re^8: Changeイベントでテキストボックスを変換
こんにちは。

> 複数文字を入れようとすると、先頭の1文字のみがポインタ
> のある位置に入り残りすべてが、最後に入ってしまいます。
>
> どう対処すればいいですか。

るしぇさんのコードをお借りしています。

Option Explicit
Private m_SyorityuFlag As Boolean '処理中フラグ

Private Sub Text1_Change()
    Dim top_chr As String
    Dim str_chr As String
    Dim lPosi   As Long
    
    If m_SyorityuFlag Then Exit Sub
    
    lPosi = Text1.SelStart
    
    top_chr = UCase(Mid$(Text1.Text, 1, 1))
    str_chr = LCase(Mid$(Text1.Text, 2))
    m_SyorityuFlag = True
    Text1.Text = top_chr & str_chr
    m_SyorityuFlag = False
    
    If Text1.SelStart = 0 Then
        Text1.SelStart = 1
    Else
        Text1.SelStart = lPosi
    End If
End Sub

Private Sub Text2_Change()
    Dim lPosi   As Long
    
    lPosi = Text2.SelStart
  
    Text2 = StrConv(Text2, vbProperCase)
        
    If Text2.SelStart = 0 Then
        Text2.SelStart = 1
    Else
        Text2.SelStart = lPosi
    End If
End Sub

投稿時間:2006/12/19(Tue) 16:25
投稿者名:たろ
Eメール:
URL :
タイトル:
Re^8: Changeイベントでテキストボックスを変換
> 複数文字を入れようとすると、先頭の1文字のみがポインタ
> のある位置に入り残りすべてが、最後に入ってしまいます。
>
> どう対処すればいいですか。

るしぇ さん、YKさん、琴さんのレスを統合するともっと簡単になるかも。


Private m_SyorityuFlag As Boolean '処理中フラグ
Private m_SelStart As Long 'SelStart退避
-------------------------------------------------
Private Sub Text1_Change()
  
  If m_SyorityuFlag Then Exit Sub
  
  m_SelStart = Text1.SelStart

  m_SyorityuFlag = True
  Text1.Text = StrConv(Text1, vbProperCase)
  m_SyorityuFlag = False

  Text1.SelStart = m_SelStart
  
End Sub

投稿時間:2006/12/20(Wed) 13:29
投稿者名:こう
Eメール:
URL :
タイトル:
Re^9: Changeイベントでテキストボックスを変換
YKさん、たろさん
ありがとうごございます。

どの方法も上手くいっています。

投稿時間:2006/12/16(Sat) 08:40
投稿者名:YK
Eメール:
URL :
タイトル:
Re^5: Changeイベントでテキストボックスを変換
こんにちは。

此方こそ失礼しました。
一行抜かしてUPしていました。
>
> YKさん、すみませんでした。
> なんか、偉そうに指摘したみたいで。。。
> 今、試した結果ですが
>
> Private Sub Text1_Change()
   Text1.SelStart = Len(Text1)
>   Text1.Text = StrConv(Text1, vbProperCase)
> End Sub

投稿時間:2006/12/18(Mon) 10:32
投稿者名:いちろう
Eメール:
URL :
タイトル:
Re^6: Changeイベントでテキストボックスを変換
> Text1.Text = StrConv(Text1, vbProperCase)
の前または、後に、「Text1.SelStart = Len(Text1)」
を設定しても同じ動きに見えるのですが、違いはあるのですか。
どちらがですか。

投稿時間:2006/12/18(Mon) 12:09
投稿者名:たろ
Eメール:
URL :
タイトル:
Re^7: Changeイベントでテキストボックスを変換
> > Text1.Text = StrConv(Text1, vbProperCase)
> の前または、後に、「Text1.SelStart = Len(Text1)」
> を設定しても同じ動きに見えるのですが、違いはあるのですか。
> どちらがですか。

こんにちは。
私の私的意見ですが。
るしぇさん(No.7909)の言葉を借りて申し訳ありませんけど、
>Text が変更された時に挿入ポインタの位置が移動しているのに
なので、後に、「Text1.SelStart = Len(Text1)」を設定したほうがよいのかも

あと、
>再帰してますね。
再帰してるので同じに見えますが、Flagを考慮した場合、カーソールの位置が変わると思いますので試してみてください。

    If m_SyorityuFlag Then Exit Sub
    
    m_SyorityuFlag = True

   Text1.SelStart = Len(Text1)
  Text1.Text = StrConv(Text1, vbProperCase)

    m_SyorityuFlag = False

と、

    If m_SyorityuFlag Then Exit Sub
    
    m_SyorityuFlag = True

  Text1.Text = StrConv(Text1, vbProperCase)
  Text1.SelStart = Len(Text1)

    m_SyorityuFlag = False

あとは、好みの問題ですかね。




    

投稿時間:2006/12/18(Mon) 15:32
投稿者名:
Eメール:
URL :
タイトル:
Re^8: Changeイベントでテキストボックスを変換
Text1.SelStartの値を変数に退避させておいて、
変換後にText1.SelStartに戻してあげればいいんじゃないでしょうか?