OnChangeについて

[戻る]
TKT 2004/12/09(木) 10:14:02
こんにちは、質問させてください。

現在基本クラスを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回繰り返されるのか?ということです。
ご存知の方がいらっしゃいましたらよろしくお願いします。

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

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

TKT 2004/12/09(木) 12:47:18
[[解決]]
シャノンさん、PATIOさんありがとうございます。

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

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

古いスレッドには追加発言できません。