C-BuilderでEditのデーターが変化した時、ある処理をしています。
その処理の中で、入力内容が正しく無い時はエラーメッセージを表示させ、Editの内容を入力された以前の状態に戻して居る為、その状態でも再度OnChangeイベントが発生してしまいます。
現在はbInhibitフラグを作って、これをルーチン内でtrueにする事で、再度OnChangeイベントが発生した時にルーチンの最初でreturnさせて二重割り込みを防ごうとしていますが、タイミングによっては二重割り込みが発生してしまいます。
これが内部での変更で無ければ
Edit1->Enabled = false;
とする事により、二重の割り込みは防げますが、今回はEdit1Changeの中で書き換えを行っている為、これでは二重割り込みを防げません。
何か二重割り込みを防ぐ方法がありましたらお教え下さい。
宜しくお願い致します。
bool bInhibit = false;
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
if( bInhibit == true )
return;
bInhibit = true;
--------
bInhibit = false;
}
}
No.1ベストアンサー
- 回答日時:
あまり変わらないかも知れませんが、OnChangeイベントの頭でイベントにNULLを設定してみたらどうでしょう?
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
dynamic_cast<TEdit*>(Sender)->OnChange = NULL;
--------
dynamic_cast<TEdit*>(Sender)->OnChange = Edit1Change;
}
この回答への補足
本日、会社で試して見ました。
この方法では二重割り込みは発生しませんでした。
その他のマスクにも使えますね。
ありがとう御座いました。
ご回答ありがとうございます。
OnChangeが制御出来るのですね。
このやり方は知りませんでした。
明日、会社で試して見たいと思います。
ありがとう御座いました。
No.2
- 回答日時:
下記、いずれも未検証ですが……
【案1】
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
Edit1->Enabled = false; // とりあえず、これ以降割り込み発生しないようにして
Application->ProcessMessages(); //イベントループを一回りさせる(これで、内部状態も反映される)
// 実際の処理
Edit1->Enabled = true; // 元に戻す。
}
【案2】
実際の処理を、OnChange ハンドラの外でやる。
bool isChagned = false;
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
Edit1->Enabled = false; // とりあえず、これ以降割り込み発生しないようにして
isChanged = true; // 変化したというフラグを立てて
Timer1->Enabled = true; // 定期的な監視をスタートして、処理終了
}
だけにして、定期的に、isChanged をチェックするという方法です。
定期的なチェックは、Timer を使って、タイムラグが気にならない程度の頻度でハンドラを起動し、
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
// 実際の処理
// 処理が終わったら、
Timer1->Enabled = false; // 定期的な監視を終了
isChanged = false; // 変化しフラグをクリアして、
Edit1->Enabled = true; // 割り込みが発生できるようにして、処理終了
}
こんな感じで。
OnChage() を抜けて、割り込みが発生しない状態になってから、編集が始まるというのがみそです。
マルチスレッドで構成できれば、もう少しきれいにできると思います。
ご回答ありがとう御座います。
Application->ProcessMessages();の方は既に検討済みです。
やはり外部で制御する必要があるのでしょうか。
メインテナンスの事を考えると出来るだけ内部でやりたいと思っております。
今は2重にフラグを作って対応して居ますが、このEdit自体実際はダイナミックキャストを使って居ますので、そこら辺のタイムラグ等で最初のフラグが認識されない事があるのかも知れません。
2重にしてどうにか正常動作?して居ますので、特に割り込み禁止プロパティー等が無ければ今のプログラムで行こうと思っております。
ありがとう御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- Visual Basic(VBA) EXCELのセル相互同期用のVBAでの不具合 3 2022/08/10 11:44
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/06 13:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6でSendKeyを利用したTab移動...
-
USJでの割り込み
-
マイコン C言語 割り込み処理...
-
電車乗車時、並んでいるのに割...
-
(H8マイコン)タイマ割込で変更...
-
CPU負荷率の安全な上限と計...
-
ゲームプログラマーは優秀なの?
-
【組込み】割り込み中のstatic...
-
H8マイコンでの割り込み(シリ...
-
C-Builder OnChangeをマスク
-
CPUの処理量を減らすコーデ...
-
PICでタイマー割込み(mikroC V...
-
電車で待機列の割り込みについ...
-
SH2 (SH7144)のソフトウェアス...
-
スーパーのレジで並んでいたら...
-
Protools8 Mbox...
-
Amazonfireタブレットにわから...
-
sleep関数の原理について
-
アセンブラのタイマー割り込み
-
ウォッチドッグタイマ(WDT)の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
このレジの並び方は間違ってま...
-
電車で待機列の割り込みについ...
-
スーパーのレジで並んでいたら...
-
ショッピング
-
CPUの処理量を減らすコーデ...
-
一定時間操作がなかったら、と...
-
CPU負荷率の安全な上限と計...
-
pic 複数の割り込み関数 切り分...
-
Amazonfireタブレットにわから...
-
【組込み】割り込み中のstatic...
-
マイコン C言語 割り込み処理...
-
USB機器からのデータ受信による...
-
駅のトイレでナイチンに邪魔さ...
-
インバウンドで迷惑している人...
-
PICのSleepからの復帰に関して
-
PICでのプログラムによるチャタ...
-
実行した後、どうしてもフリー...
-
PICで内部タイマーを使わずカウ...
-
SH2のタイマ出力
-
割り込み中に例外異常
おすすめ情報