イベントの発生を待つプログラムの効率的な方法について

このQ&Aのポイント
  • テキストボックスへの文字入力を待つプログラムの効率的な方法を教えてください。
  • 現在、Form.Load()で呼び出されるプロシージャの中で、テキストボックスのキー入力を待機するプログラムを作成しています。
  • ただし、Sleep()関数を使用するとアプリケーションがフリーズしてしまいます。効率的な方法をご教示ください。
回答を見る
  • ベストアンサー

イベントの発生を待つ

現在、テキストボックスへの文字入力を待つプログラムを作っております。 Form.Load()によって呼び出されるプロシージャの中で、フォームのテキストボックスへのキーの入力があるまで待機するプログラムとなっております。 方針としては、まずBoolean型のフラグを用意し、まずTextBoxのKeyPressイベントでこのフラグをオンにし、メインのプロシージャでは必要個所でDoループを回してこのフラグを確認し、オンになっていたらオフにしてループを抜け出すというプログラムです。 このループの中にSleep()関数を入れたりしても、ループのところでアプリケーションがフリーズしてしまいます。(ブレークポイントなどで確認しました) もっと効率のよい方法をご存知でしたらご伝授ください。 (KeyPressイベントの中に直接処理を書けばいいじゃないか、とおっしゃるかもしれませんが、今回はあくまでメインプロセスから読む必要があったため、質問をさせていただきました。)

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

ご要望を満たすものですと マルチスレッドによる処理が必要になる気がしますよ #1氏、#2氏の回答のように Windowsのプログラムは メッセージによって処理されています メッセージというのは『キーが押された』『どこかを再描画してください』などといった内容をWindowsから各プログラムに通知されます これは VB.NETなどの各プロシージャなどの内部に制御がある場合にはこの通知を受け取ることが出来ません これらを受け取るために Application.DoEvents を実行して Windowsから アプリケーションがメッセージを受け取れるようにする必要があります 複数回そのメインループの処理が必要な場合 Form_Loadイベントなどアプリケーションにとって1度しか実行されないプロシージャの中で処理するのは無理がありそうですよ

その他の回答 (3)

回答No.4

> Form.Load()によって呼び出されるプロシージャの中で、フォームのテキストボックスへのキーの入力があるまで待機するプログラムとなっております。 「Form_Loadによって呼び出される…」と「フォームのテキストボックス」が同じフォームであるならこの時点で矛盾します。Form_Loadイベントのイベントプロシージャが終了しないとフォームが表示されず、テキストボックスへの入力もできません。 もっと効率の良い方法を提示するには、やりたいことをもう少し具体的に提示してください。 例えば、「一連の処理の中で、ユーザーにテキストの入力を求め、完了するまでは先に進まない手続きにしたい」など。 この場合、フォームをダイアログとして表示(ShowDialog)するのが一般的、という回答を出せます。 > 今回はあくまでメインプロセス 同じExe内であれば、マルチスレッドが組まれていても「プロセス自体は同じ」です。メインスレッドで受け取りたい、という場合でも、マルチスレッドを自力で実装しない限りイベント駆動であってもシングルスレッドで動作します。

回答No.2

イベント駆動にそぐわない要望に思います。設計に疑問を感じます。 メインとなる処理をモジュールにまとめておき、KeyPressイベントの中で呼び出すのが自然だと思います。 Form.Loadだけで処理をするのなら、その処理を再実行する場合はどうするのでしょう?ループ処理をさらにループさせるのでしょうか?

  • Caryo_t
  • ベストアンサー率45% (112/246)
回答No.1

直感ですが、オンになっていないとループから抜けられないようになっていませんか? また、(ご存じだとは思いますが)DoEventsを入れないと、強制終了もできず、危険です。 ところで、わざわざループを使わなくても、必要個所でフラグを確認するだけで良いと思うのですが、ループを使う理由があれば教えてください。

関連するQ&A

  • Loadイベント中にほかのイベントを発生したくない

    VisualC# .net です。 フォームを表示する場合に コンストラクタが呼ばれその後ロードイベントで フォームのコントロールの初期設定を行っています。 (この方法がまちがっている?) ロードイベント内でコンボボックスの初期設定を行うと コンボボックスのイベントが発生してしまいます。 以下参照にて このイベントでメッセージを表示しているのですが 初期設定では出てほしくありません。 そこで、 これを防ぐためには以下のようにフラグを立てるような 方法しかないのでしょうか? それともDebugger.IsAttached のようなものが 用意されているのでしょうか public bool iload = false;     (←仮フラグを追加) private void Form1_Load(object sender, EventArgs e) { iload = true;    (←仮フラグを登録) ComboBox1.SeletedIndex = 0; iload = false;   (←仮フラグを削除) } private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e) { if (iload) return;     (←仮フラグ登録時はなにもしない) MessageBox.Show("変更しました"); }

  • イベント発生について

    お世話になります。 .NET C#で開発をしております初心者です。 テキストボックスに数字を入力したら、その値をメッセージボックスで ユーザーに確認を促したいのですが、そのイベント発生タイミングを どうしたらいいのか考えています。 現在は下記の様にしています。 まず、TextChangeイベントで、変数に代入してから、Leaveイベントでメッセージボックス を表示させています。 本当は、Leaveイベントでなく、その場でメッセージボックスを表示させたいのですが、 でも、TextChangeイベントだけでは、例えば二桁以上の数字を入力しようとしていた場合、 一桁数字を打ち込む度に、TextChangeイベントが発生してしまい、その度にメッセージボックスが 表示されてしまうので、仕方なくLeaveイベントも使っています。 何か良い方法ってありますでしょうか。 どなたかご親切な方、ご教授頂きたく宜しくお願い致します。                           記 private void textBox1_TextChanged(object sender,EventArgs e) { if(textBox1.Text != "-") { if(textBox1.Text != "") { suuryou = int.Parse(textBox1.Text);   } } } private void textBox1_Leave(object sender,EventArgs e) { if(textBox1.Text != "") { MessageBox.Show(suuryou,"", MessageBoxButtons.OK, MessageBoxIcon.Information); } }

  • TextChangeイベントが発生しない

    ASP.NETで開発を行っています。 クライアント側の処理はJavaScript、サーバー側の処理は VB.NETを使っています。 サーバー側であるテキストボックスに対してT extChangeイベントを発生させたいのですが、 クライアント側の処理で値を入力したときは、 イベントが発生しません。 サーバー側で値を変更したときは発生します。 具体的な手順は以下のとおりです。 Cookieから取得した値をテキストボックスにセット ↓ この時点でTextChangeイベントを発生させたいが、何も起こらない。 ↓ サーバー側の処理でそのテキストボックスの値を変更する。 ↓ この時点でTextChangeイベントが発生。 また画面上で直接値を入力したときはイベントが発生します。 クライアント側の処理でテキストボックスに入力した場合は、 サーバー側のイベントは発生しないのでしょうか。 この処理の中で値が入力された時点でイベントを発生させる にはどうしたらいいのでしょうか?

  • VBAのイベント処理について

    VBAのイベント処理について お世話になってます。現在、VBAでアプリケーションを作成しています。 1つのフォームに4つのテキストボックスと1つのボタンが配置されており、それぞれイベントが設定されています。 その中のテキストボックスに関するイベントなのですが、1つのテキストボックスに対してKeyPress、KeyDown、MouseUp、AfterUpdate、以上4つのイベントを作成します。 フォームに配置されている4つのテキストボックスすべてに、上記で示したイベントを作成する必要がありますが、各イベントにおける処理の内容はオブジェクト名が違うだけで全く同じです。 ひとつひとつイベントを作成していけば、処理目的は満たせそうですが、ソースがかなり長くなってしまいます。ひとつのオブジェクトに対してこれらの処理をひとまとめにする様な記述方法はありませんでしょうか?考え方だけでも教えていただければ幸いです。 質問が長くなってしまい申し訳ありません。回答宜しくお願い致します。

  • クリックイベントは実行されない

    サブフォームのテキストボックスにクリックイベントでVBAを実行するようにしてるのですが クリックしても何も反応がありません。 だけど試しに同じテキストボックスに、フォーカス取得後のGotFocusイベントを[イベント プロシージャ]で選択してみましたが テキストボックスにフォーカスが触れるとイベントが実行されます。 なぜクリックイベントは実行されないのでしょうか? サブフォームは帳票フォームです。それ関係ありますか?

  • テキストボックスに大文字を

    テキストボックスのKeyPressイベントで テキストボックスに大文字を入れたいのですが、 入力の時に、shift+CapsLock(英数)ってすると、大文字がいれれるとおもうのですが、それを初期設定で制限することはできないのでしょうか?  

  • onchangeでイベントが発生しません

    テキストフィールドに何かを入力した時に“onchange”でイベントを発生させたい場合ですが、今までに入力したデータが候補として表示され、その中から選択した場合はイベントが発生しません。 そのような場合でもイベントを発生させる方法はありますか?

  • タブキー押下時のイベントをひろいたい。

    テキストボックスにフォーカスがあり、TABキーが押された時のイベントをひろいたいのですが、KeyPressもKeyDownもイベントが発生しません。 (If KeyCode = vbKeyTab Then  MsgBox "タブキー" End If  If KeyAscii = vbKeyTab Then ~ のようなコードを記述してもメッセージが表示されない) ヘルプにはKeyDownでは発生しないという記述がありますが、KeyPressではイベントがひろえるようなことが書いてあるのにひろえないので困っています。 なにかよい方法はありませんでしょうか。 わかりにくい説明で申し訳ありませんが困ってます。 宜しくお願いします。

  • Excel changeイベントをループさせる方法

    ご質問させていただきます。 Excel2007を使用しています。 チェックボックスを190個作り以下のプロシージャを作成しました。 190個のチェックボックスは開発タブの挿入をクリックしてActive Xコントロールのチェックボックスを選択してデザインモードでコピーして作りました。 やりたいことは、チェックボックスのON/OFFの瞬間に以下のプロシージャの処理を実行したいのです。 changeイベントを使うみたいなのですが、チェックボックスが190個もあるのでループさせた方が良いと思うのですが、そもそもchangeイベントをループさせることはできるのでしょうか? ご存知の方がいらっしゃいましたら教えてください。 よろしくお願いいたします。 なお、私のVBAの知識は初心者レベルで、下記のプロシージャもこちらのサイトで教えていただいたものを自分で少し変更しただけです。 Sub チェックボックスのループ() Dim i As Integer For i = 0 To 189 sCtrlName = "CheckBox" & CStr(1 + i) If Me.OLEObjects(sCtrlName).Object.Value = True Then Cells(1 + i, 2).Value = Cells(1 + i, 2).Value Else Cells(1 + i, 2).Formula = "=Sheet2!A" & 1 + i & "" End If Next i End Sub

  • レポートでイベントプロシージャでコントロールソース

    アクセス2000で レポートのイベントプロシージャーでテキストボックスの コントロールソースを変えたい 住所1,2で文字数が20文字以下なら 1と2を結合して1行で出力したいのです。 テイブル名 JLIST フィールド名 ADD1,ADD2 レポート名 YK2 テキストボックス名 TADD1,TADD2 今はテキストボックスを非連結にしています。 イベントプロシージャはフォーマット時にかいています。  

専門家に質問してみよう