現在、テキストボックスへの文字入力を待つプログラムを作っております。
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で質問しましょう!
似たような質問が見つかりました
- Java Java モンスターブリーダー 1 2023/02/05 09:44
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Visual Basic(VBA) EXCEL VBA ユーザーフォームの内容をループでデータベースに登録したい。 2 2023/02/02 10:22
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
- 仕事術・業務効率化 効率的な勉強方法(分野問わず)を教えてください 1 2023/08/16 01:33
- その他(プログラミング・Web制作) 入力フォームへ、データを自動的に入力するプログラム。どうやって作る? 4 2023/01/16 10:24
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
VBAでセルに値が入力されるまで待つ方法
Visual Basic(VBA)
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
【VB.NET】別Formのボタンが押されるまで待機する方法??
Visual Basic(VBA)
-
-
4
【VB】タブ切り替え時のイベント
Visual Basic(VBA)
-
5
Hideについて(.NET)
Visual Basic(VBA)
-
6
vb.netで画面のコントロールId名を変数で動的に制御し処理する方法
Visual Basic(VBA)
-
7
[Excel VBA]コマンドボタンの入力待ち方法
Visual Basic(VBA)
-
8
DoEventsがやはり分からない
Visual Basic(VBA)
-
9
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA for i=1 to lastrow
-
画面を強制的に再描画させる方法
-
GIFアニメをループさせたくない
-
エクセルの当番表を作っていま...
-
UWSCの終了の仕方
-
ExcelVBAで、index、match関数...
-
pythonでファイルのコメント行...
-
どなたかこのプログラミングを...
-
DoEventsが必要な理由について
-
テキストボックスの名前に変数...
-
VBA横データを縦にしたいです
-
vb.netからエクセル関数書き込み
-
範囲指定したセルを1つずつ飛...
-
vbscriptでIE自動入力(途中で...
-
Escキーを押すと、中断する時と...
-
VisualStudioにてモザイクの画...
-
ループフリー
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
VBA Dir関数でファイルをループ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
流れ図(フローチャート)が分か...
-
乱数の桁数指定、または範囲指定。
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
-
vbscriptでIE自動入力(途中で...
おすすめ情報