OnChangeについて – プログラミング – Home

通知
すべてクリア

[解決済] OnChangeについて


TKT
 TKT
(@TKT)
ゲスト
結合: 20年前
投稿: 6
Topic starter  

こんにちは、質問させてください。

現在基本クラスをCEditViewにしてテキストエディタを作成しようと
していますが、OnChangeの動作についてわからないことがあります。

Testというワークスペースを作成して、OnChangeを下記のように書いてみました。

void CTestView::OnChange()
{
CEdit &edt = GetEditCtrl();
edt.ReplaceSel(abc!,false);
}

そして、例えばkと入力すると

kabc!abc!abc!abc!abc!abc!abc!abc!abc!abc!abc!abc!

と表示されるのです。
疑問点は、なぜ12回繰り返されるのか?ということです。
ご存知の方がいらっしゃいましたらよろしくお願いします。


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

ReplaceSel でテキストが変更されたことにより、また OnChange が呼び出されていま
す。
無限再帰でスタックオーバーフローでも起こしそうなものですが、間にメッセージ処理
を挟むためか、例外で落ちているわけではなさそうです。
なぜ 12 回かはわかりません。俺の環境では、試してみたら 15 回でした。
回数を決定する要因は何なんでしょうかね?
まぁ何回にせよ、よくないプログラムではありますが。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

書かれている例のようにあるメッセージハンドラ内でそのハンドラに対応するメッセージが
発生するようなプログラムを書いてしまうととんでもない事になったりするので注意が必
要です。
例えば、OnDraw内でMessageBoxを出すとかすると永遠とメッセージボックスが出る羽目に
なります。
自分が書いたコードでどんなウインドウメッセージが生成されうるのかを良く考えて
組み立てるようにしないとはまり込む事になると思いますよ。


返信引用
TKT
 TKT
(@TKT)
ゲスト
結合: 20年前
投稿: 6
Topic starter  

シャノンさん、PATIOさんありがとうございます。

無限ループになるかな?と思っていたのですが、
そのくせ途中で止まるし、なぜ12回なのか不思議でした。

またなにかありましたらよろしくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました