
現在、テキストボックスへの文字入力を待つプログラムを作っております。
Form.Load()によって呼び出されるプロシージャの中で、フォームのテキストボックスへのキーの入力があるまで待機するプログラムとなっております。
方針としては、まずBoolean型のフラグを用意し、まずTextBoxのKeyPressイベントでこのフラグをオンにし、メインのプロシージャでは必要個所でDoループを回してこのフラグを確認し、オンになっていたらオフにしてループを抜け出すというプログラムです。
このループの中にSleep()関数を入れたりしても、ループのところでアプリケーションがフリーズしてしまいます。(ブレークポイントなどで確認しました)
もっと効率のよい方法をご存知でしたらご伝授ください。
(KeyPressイベントの中に直接処理を書けばいいじゃないか、とおっしゃるかもしれませんが、今回はあくまでメインプロセスから読む必要があったため、質問をさせていただきました。)
No.3ベストアンサー
- 回答日時:
ご要望を満たすものですと マルチスレッドによる処理が必要になる気がしますよ
#1氏、#2氏の回答のように
Windowsのプログラムは メッセージによって処理されています
メッセージというのは『キーが押された』『どこかを再描画してください』などといった内容をWindowsから各プログラムに通知されます
これは VB.NETなどの各プロシージャなどの内部に制御がある場合にはこの通知を受け取ることが出来ません
これらを受け取るために Application.DoEvents を実行して
Windowsから アプリケーションがメッセージを受け取れるようにする必要があります
複数回そのメインループの処理が必要な場合
Form_Loadイベントなどアプリケーションにとって1度しか実行されないプロシージャの中で処理するのは無理がありそうですよ
No.4
- 回答日時:
> Form.Load()によって呼び出されるプロシージャの中で、フォームのテキストボックスへのキーの入力があるまで待機するプログラムとなっております。
「Form_Loadによって呼び出される…」と「フォームのテキストボックス」が同じフォームであるならこの時点で矛盾します。Form_Loadイベントのイベントプロシージャが終了しないとフォームが表示されず、テキストボックスへの入力もできません。
もっと効率の良い方法を提示するには、やりたいことをもう少し具体的に提示してください。
例えば、「一連の処理の中で、ユーザーにテキストの入力を求め、完了するまでは先に進まない手続きにしたい」など。
この場合、フォームをダイアログとして表示(ShowDialog)するのが一般的、という回答を出せます。
> 今回はあくまでメインプロセス
同じExe内であれば、マルチスレッドが組まれていても「プロセス自体は同じ」です。メインスレッドで受け取りたい、という場合でも、マルチスレッドを自力で実装しない限りイベント駆動であってもシングルスレッドで動作します。
No.2
- 回答日時:
イベント駆動にそぐわない要望に思います。
設計に疑問を感じます。メインとなる処理をモジュールにまとめておき、KeyPressイベントの中で呼び出すのが自然だと思います。
Form.Loadだけで処理をするのなら、その処理を再実行する場合はどうするのでしょう?ループ処理をさらにループさせるのでしょうか?
No.1
- 回答日時:
直感ですが、オンになっていないとループから抜けられないようになっていませんか?
また、(ご存じだとは思いますが)DoEventsを入れないと、強制終了もできず、危険です。
ところで、わざわざループを使わなくても、必要個所でフラグを確認するだけで良いと思うのですが、ループを使う理由があれば教えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
テキストボックス(VBA)でEnterを押したときに作動するマクロ
Access(アクセス)
-
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
-
4
ユーザーフォームでTextBox1にカーソルを移動したい
Excel(エクセル)
-
5
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
6
エクセルVBAでテキストボックスに入力があった場合のみ、ワークシートに転記したい
Visual Basic(VBA)
-
7
[Excel VBA]コマンドボタンの入力待ち方法
Visual Basic(VBA)
-
8
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
9
VBAでセルに値が入力されるまで待つ方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UWSCの終了の仕方
-
VBAでの一時停止と再開の方法
-
Do whileでExitせず、ループの...
-
テキストボックスの名前に変数...
-
VB.NETでFTPプログラム
-
xmplayの使い方
-
C言語でファクト関数を使わずに...
-
csh foreachで「*」でエラ...
-
ListBox 複数選択 で オートフ...
-
ループフリー
-
UWSCに制限時間を付けたいです
-
プログラミングで難しいと感じ...
-
EXCEL VBA(初心者)印刷ルー...
-
CSVファイルの特定の行だけを読...
-
エクセルの当番表を作っていま...
-
vb.netからエクセル関数書き込み
-
VBAで3秒だけ時間を止めたい
-
Excel VBAでIf 条件式 then か...
-
流れ図(フローチャート)が分か...
-
Dim flag(4) as boolean で配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
VBAでの一時停止と再開の方法
-
Escキーを押すと、中断する時と...
-
乱数の桁数指定、または範囲指定。
-
イベントの発生を待つ
-
流れ図(フローチャート)が分か...
-
UWSCに制限時間を付けたいです
-
vb.netです。2次元配列の要素を...
-
VBA for i=1 to lastrow
-
DoEventsが必要な理由について
-
ループフリー
-
VBA Boxが空白の場合のメッセー...
-
VBA ニュースタイトル取得
-
エクセルの当番表を作っていま...
-
Javaの質問です。 この問題の答...
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
おすすめ情報