• ベストアンサー

文字のリアルタイム検索がしたいんです…

質問を見てくださってありがとうございます。 少し説明が長いのですがどうぞ見てやって下さい。 さっそく質問内容なのですが…。 私がしたいと思っているのは文字列のリアルタイム検索です。まず、それが具体的にどういうことなのかを説明します。 あるFORM1にテキストボックスと一覧表示系コントロール(私が使っているのはTDBGridというコントロールです…)を配置しています。その一覧系コントロールには名前とそのフリガナが表示されます。その状態でテキストボックスにフリガナを入力して沢山あるリストの中から該当する名前(フリガナ)を検索しカレント行にする。というものなのですが、この時"リアルタイム検索"というのがどういうことかといいますと…。 一覧系コントロールに以下のような内容が表示されているとします。 -------------------- 名前  フリガナ -------------------- 相田  アイダ 飯田  イイダ 石狩  イシカリ 石川  イシカワ 渡   ワタリ -------------------- この中の"イシカワ"を検索する時…、 「イ」を入力すると飯田さんの行がカレント行になり 続いて「シ」を入力すると石狩さんの行がカレント行る。 更に「カ」を入力して「ワ」を入力すると石川さんの行がカレント行になるというものです。 これは入力した文字を一文字づつ認識してやり、一覧から検索してきて一番初めにヒットしたものを探し出してくるのですが、ここで問題となるのが入力した文字を一文字づつ認識させるということだと思うんですね。 実際は、入力しても一度[Enter]キーを押すまで、変換待ちになってしまいますから…。 ホントにどうしたらいいんでしょう…。 ずっと考えているのですが分からなくて困っています、わからないけどこうしたらどうかな??なんて回答でもいただけたら嬉しいのでどうぞ宜しくお願いしますm(__)m

質問者が選んだベストアンサー

  • ベストアンサー
  • coco1
  • ベストアンサー率25% (323/1260)
回答No.5

#3です。 私の言うOnChangeイベントはACCESSのchangeイベントと同じものです。最近、他のツールばかり触ってますので混同してました。 それから、私が例示したクエリですが、Likeを使うことも可能です。 あと、IMEを使う環境では、おっしゃるような不具合があるのはやむを得ません。 であれば、元になるテーブルに[yomi]というフィールドを追加し、テキストボックスにも半角文字で入力するようにすればどうでしょうか。つまり「タナカ」ではなく「tanaka」とするのです。当然、クエリも半角英字をキーにして投げます。 読み仮名自体は既に入力されているのでしょうから、それをローマ字に変換して格納するのは、自作関数などで比較的簡単にできると思います。 例えば、 function mbKana2Kana(Instr as string) as string dim MBkana as string(5) dim RKana as string(5) dim TmpStr as string TmpStr = InStr MBKana(1)="あ" MBKana(2)="い" MBKana(3)="う" MBKana(4)="え" MBKana(5)="お" RKana(1)="a" RKana(2)="i" RKana(3)="u" RKana(4)="e" RKana(5)="o" for i = 1 to 5 MBKana2kana = replace(TmpStr, MBKana(i), RKana(i)) next i end. って感じで置換をかければいいと思います。 もしかして、replace関数というのがなかったかも知れませんが他の文字列置換関数で代行できると思います。 VBは、最近余り触っていないので、もっと良いルーチンがあるかも知れませんが思いつきません...。

ryuji0202
質問者

お礼

お礼が遅くなってしまって申し訳ありません。 回答ありがとうございました! 半角英数文字を入力させて比較させる、ってのはいい案ですね! そうすれば入力時にEnter待ちってなことにはならないですからね。 一度試して見たいと思います、本当にありがとうございました。

その他の回答 (4)

noname#11856
noname#11856
回答No.4

少々、めんどくさいですが。。。(^-^; IMEをオフ固定にし、KeyPress(お好みでKeyDownでもいいですが)でキーを拾う。拾ったらKeyAsciiを0にして入力がなかった事にする。 子音であればStatic変数にでもおいておき、母音が入力された時、前回の入力で子音が入力されていなければア行の表示。子音が入力されていれば・・・。 なんていうか、タイピングソフトでも作れそうな勢いです。(笑) うちのPCにはVB.NETしかインストールしていないのですが、一応、テストしてみました。ローマ字入力かつ、カタカナのみという条件付きであれば、結構できそうです。(カタカナだけとはいえAsciiコードを全部調べるのが面倒だったので途中でやめちゃいましたが。(笑))

ryuji0202
質問者

お礼

回答ありがとうございます! わざわざ試していただいたということでとても嬉しかったです。 私もこの方法を試してみようと思います。 「少々めんどくさいですが…」とありますが、とんでもない!!とてもいい案だと思います! また、何かあったらよろしくお願いしますね!

  • coco1
  • ベストアンサー率25% (323/1260)
回答No.3

開発環境がよくわからないので、細かい回答はできませんが、通常、この手の処理(インクリメンタルサーチ)では、テキストボックスのOnChangeイベントで入力された文字を検知して、その都度クエリを投げてグリッドのデータソースを更新し直す、という処理になると思います。 つまり、データソースとなるデータベースが「MF名簿」、そのフィールドが(氏名、ヨミ)だとすると、テキストボックスに次のようなSQLを連動させればよいのです。 select 氏名 from MF名簿 where left(ヨミ,len(txtbox.text)) = txtbox.text order by ヨミ; データソースがないのでしたら、ループ処理で、先頭文字と比較して、一致しないものはグリッドのアイテムから除外する、を繰り返す というのも考えられそうです。

ryuji0202
質問者

お礼

回答ありがとうございます! この回答でなんだかすごくできそうな気がしてきたのですが、分からない点がいくつかあるんです(まだまだ初心者なので申しわけないです…)。 私の開発環境はVB6.0+AccessのDAOです。 OnChangeイベントについてなのですが、テキストボックスにはChangeイベントはあるのですがこれのことですか?? Changeイベントでは文字を一度Enterで確定してやらないとイベントが発生してくれないのですが、どうしたらいいんでしょう? これについてもし何か分かったら教えてもらえませんか?どうぞお願いします!!

  • O-LEO
  • ベストアンサー率27% (205/740)
回答No.2

文字・編集ボタンをクリックする毎に 入力文字の編集演算→入力文字と読みの比較→表示 を実行すれば良いのでは。

ryuji0202
質問者

お礼

本当に回答ありがとうございます。 ただ、その方法も既にやってみたんです。 説明不足で本当にごめんなさい…。 また何かあったら教えてください!

  • O-LEO
  • ベストアンサー率27% (205/740)
回答No.1

入力じゃなくて五十音ボタンにしたらどうでしょう。

ryuji0202
質問者

お礼

さっそくの回答ありがとうございます! その五十音ボタンについては既に作成済みなんです。 どうしても今回上の内容を実現したいのです…。

関連するQ&A