アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
}


}

A 回答 (2件)

あまり変わらないかも知れませんが、OnChangeイベントの頭でイベントにNULLを設定してみたらどうでしょう?



void __fastcall TForm1::Edit1Change(TObject *Sender)
{
dynamic_cast<TEdit*>(Sender)->OnChange = NULL;
  --------

dynamic_cast<TEdit*>(Sender)->OnChange = Edit1Change;
}

この回答への補足

本日、会社で試して見ました。
この方法では二重割り込みは発生しませんでした。
その他のマスクにも使えますね。

ありがとう御座いました。

補足日時:2012/03/14 18:05
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

OnChangeが制御出来るのですね。
このやり方は知りませんでした。
明日、会社で試して見たいと思います。

ありがとう御座いました。

お礼日時:2012/03/13 18:53

下記、いずれも未検証ですが……



【案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() を抜けて、割り込みが発生しない状態になってから、編集が始まるというのがみそです。

マルチスレッドで構成できれば、もう少しきれいにできると思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとう御座います。

Application->ProcessMessages();の方は既に検討済みです。
やはり外部で制御する必要があるのでしょうか。
メインテナンスの事を考えると出来るだけ内部でやりたいと思っております。
今は2重にフラグを作って対応して居ますが、このEdit自体実際はダイナミックキャストを使って居ますので、そこら辺のタイムラグ等で最初のフラグが認識されない事があるのかも知れません。
2重にしてどうにか正常動作?して居ますので、特に割り込み禁止プロパティー等が無ければ今のプログラムで行こうと思っております。

ありがとう御座いました。

お礼日時:2012/03/13 18:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!