テキストボックスで入力と同時に選択状態にするには?

解決


ガブリアス  2008-04-09 00:13:39  No: 139498  IP: 192.*.*.*

VB6.0のテキストボックスで入力と同時に選択状態にしたいのですが
どのようにすれば良いのか検討がつきません。。。

<問題点>
TEXT1.SelStart = 0
TEXT1.SelLength = Len(TEXT1.Text)

と記述すればテキスト全てが選択状態になるのはわかるのですが、
この状態から次の2文字目を入力すると当然その選択範囲に上書きされて
しまい、延々と1文字しか入力できません。

<試行例>
Sendkeysを使用してShiftキーを無理やり操作するやり方を試してみました
これで見かけ上はうまくいったのですが
この場合どうにも"("等の元からShiftキーを使用する文字が
選択状態にならず、うまくいきませんでした。

Private Sub TEXT1_KeyPress(Index As Integer, KeyAscii AS Integer)

Call Sendkeys("{LEFT " & Len(TEXT1.Text) + 1 & "}")
Call Sendkeys("+{END}")
TEXT1.SelStart = Len(TEXT1.Text)

何か良い方法はないでしょうか?
お手数お掛けしますがよろしく御願いします。

<最終目的>
IMEの動作みたいな事をVB6.0で実現させようとしています。
テキストボックスに"AAA"と入力しSPACEキーでその"AAA"に該当する
検索結果を一覧表示し、その結果から選択して"AAA"の文字と置き換える
ような動作です。

編集 削除
ガッ  2008-04-09 02:43:43  No: 139499  IP: 192.*.*.*

<最終目的>に書かれていることをやろうとするために,
なぜ入力と同時に選択状態にしなければいけないのか不明.
見た目の問題というのならそれっぽく見せるコントロールを作ればいい話.

編集 削除
K・今川  2008-04-09 09:58:12  No: 139500  IP: 192.*.*.*

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    
    Text1.SelStart = Len(Text1.Text)

End Sub

これを追加すれば、とりあえず、上書きはされなくなります。
ただこのままだと、DELキー、カーソルキーが効かなくなるなどの弊害も
出てくるのでうまく処理してください。

編集 削除
くり  2008-04-09 12:10:06  No: 139501  IP: 192.*.*.*

>・・・ような動作です。

まずこの仕様を詳細に明文化したらいかがですか?

編集 削除
旅人A  2008-04-09 16:44:22  No: 139502  IP: 192.*.*.*

入力と同時にじゃなくて、フォーカスを取得したときに、テキスト内の文字列を選択状態にすればいいのでは?

編集 削除
ガブリアス  2008-04-09 20:27:58  No: 139503  IP: 192.*.*.*

すいません仕様の詳細は長文になり省いていたのですが追記致します。

①空白のテキストボックスへ AAA と入力します。
②AAAは選択状態としこの状態でSPACEキーを押すとその AAA の文字列に
  該当する語句を検索し結果を別の一覧表示用のラベル(配列)へ表示します。
③その一覧表示用のラベルで↑↓キーにて操作し希望の語句を選んで
  ENTERキーで元のテキストへ打ち込んだ AAA と選択語句を置き換えます。
④現在のテキストボックスの選択した語句の後ろにさらに BBB の文字列を
  入力する事を可能としこの場合 BBB と入力すれば BBB の文字列のみを
  選択状態として以下同処理です。

選択状態にする理由は見た目の問題とSelTextにて容易に検索に
使用する文字列のみを取得できる為です。
以上の処理をできるだけテキストボックス上で実現したいと考えているのですが
やはり無理があるでしょうか?

編集 削除
魔界の仮面弁士  2008-04-09 21:32:48  No: 139504  IP: 192.*.*.*

> 空白のテキストボックスへ AAA と入力します。
> AAAは選択状態としこの状態でSPACEキーを押すと

その実装だと、本当にスペースを入力したい場合に問題があると思います。

いわゆる「AutoComplete」や「Google サジェスト」のような実装の方が
使いやすいような気がしますが、それでは駄目なのでしょうか。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200505/05050005.txt

編集 削除
くり  2008-04-09 23:20:44  No: 139505  IP: 192.*.*.*

「この仕様を詳細に明文化」する形式としては
状態遷移図  あたりが適当かと思います。

編集 削除
ガブリアス  2008-04-09 23:34:40  No: 139506  IP: 192.*.*.*

皆様色々な御意見ありがとうございます、
ほんとにわかりにくくて申し訳ない限りです。。。

> その実装だと、本当にスペースを入力したい場合に問題があると思います。

スペースは入力しない項目であると解釈して下さい、
このプログラムで最も守るべき箇所は操作性の部分です。

仕様の詳細というより下記のアドレスに現在のソースプログラムを
アップロードしてみましたので、こちらを見ていただければ
わかりやすいかと思います。

http://zero-mail.com/uploader/src/zero-mail0055.lzh

このプログラムで"("等のshiftキーを使用する文字を入力しても選択状態に
なれば問題解決なのですが。
「選択状態」というのが不可能なようでしたら
現在の入力値がわかる別の手段でも構わないと思いはじめています。

編集 削除
ガブリアス  2008-04-10 21:24:56  No: 139507  IP: 192.*.*.*

すいませんなんとか自己解決致しました。

単純にshiftを押した状態で右から左へのカーソル移動をするだけで
良かったようです。

上記ソースプログラムのSendKeysを使用している2行部分を
以下の2行に変更してうまくいきました。

Text1.SelStart = Len(Text1.Text)
CALL SendKeys("+{LEFT " & Len(Text1.Text) - Len(m_Macro_Txt) + 1 & "}")

文字を入力してもカーソルが左の位置で固定されますが
特に問題ありません、というか頭固いですね。。。

皆様ありがとうございました。

編集 削除
魔界の仮面弁士  2008-04-10 22:23:06  No: 139508  IP: 192.*.*.*

SendKeys ではなく、SelStart / SelLength を使った方が良いかも。

編集 削除