VC++ 6.0 MFC XP
プロパティシートのOKボタンを押すと、付属するプロパティページのOnOk()を順番に実
行するそうですが、最初のプロパティーページで入力必修項目があって、プロパティシ
ートのOKボタンを押しても、無効化したいです。
該当するプロパティページのOnOK()をオーバライドしても、だめでした。
なにか、方法は、ありませんでしょうか?
ども、PATIOです。
プロパティページのOnOKをオーバーライドしたとありますが、
一体どんなコードを書かれたのでしょう?
あと、OnOKって確か返り値なしだったと思いますけれど、
呼び出し元にどうやって必須項目が足りない事を知らせようとしたのでしょう。
最終的にウインドウ全体を終わらせているのはプロパティシートのOnOKですよね。
だとしたらプロパティシートの方でプロパティページでエラーが起きている事を
感知して終了処理をしないようにする必要があると思いますけれど、
単純にOnOKを呼ぶだけしかしていないのであれば、プロパティシートの方で
プロパティページ側のエラーを知る事は出来ないと思いますよ。
既存仕組みで対処できないのであれば、プロパティシート側のOnOKを
オーバーライドして処理を書かないと無理なのではないかと思います。
PATIOさん、レスありがとうございます。
プロパティシートのOnOKは、オーバライドできないみたいです。
最初のプロパティページのOnOKのオーバライドは、以下の内容です。
if (m_TelNo >= 0) {
CPropertyPage::OnOK();
} else {
AfxMessageBox(電話番号が入力されていません) ;
}
プロパティページのDDX&DDV使ったらダメなの?
あそこを自分でカスタムするのが一番手っ取り早いと思うんだけど。
それとページ切替でUpdateData(true)してFALSE帰ってきたら
LRESULTを1で返す。これで鉄板かと
追記。VC6なら
//{{AFX_DATA_MAP(ページ)
//}}AFX_DATA_MAP ←このコメントの外に
if(pDX->m_bSaveAndValidate == TRUE)
{
条件を書く。だめなら
pDX->fali() をよぶとか
}
というか、ソースを見るとわかるんですが、
プロパティシートのソース上はOnOKの記述はないみたいですね。
プロパティページのOnOKにブレイクポイントを設定して
そこで止めてコールスタックで何処から呼ばれているか
確認した方が良さ気な感じがします。
既存のクラスとは違う動きをさせたい場合に
問題のクラスの既存の実装ではどうなっているのかを
把握する事が必要になります。
MFCはソースもついているのですからデバッガ使って追いかけてみましょう。
既存のクラスの動きが分かって初めてどうやって手を入れればよいのかも
理解できると思いますよ。
私自身はプロパティシートもプロパティページも殆ど使わないので
良く分からないです。TabControlを使って自前で実装する事が殆どなので。
とおりすがりさん、レスありがとうございます。
現在の状況は、プロパティーシートをモーダルしたあと、すぐOKを押されると、電話
番号が入力されずにプロパティシートは、閉じてしまいます。
プロパティシートのDDX&DDVをつかうとは?どういうことになるんでしょうか?
クラスウィザードに表示される、プロパティシートの変数は、なにもないんです
が・・・
ごめん。ページ切り替えうんぬんはタブコントロールだから無視してください。
プロパティページならDoDataExchangeにコード書いて条件に失敗したら
Fail呼ぶだけでOKっす。たぶん。
なるほどプロパティ系を使う時はそうするんですね。
メモっておこう。
> 該当するプロパティページのOnOK()をオーバライドしても、だめでした。
SDKでも使われる通常手法を取るなら、入力チェックは CPropertyPage::OnApply
(PSN_APPLY)で行えば良い。
Applyは知らなかったです。
とりあえず、DoDataExchangeでやっとけば
他のページに移ることを阻止できるからこの場合は良いかもしれない。
あとはどのやり方がスレ主さんのやりたいことに沿っているか否か。
頑張ってください。
とおりすがりさん、PATIOさん、gakさん、レスありがとうございます。
PATIOさんのいってくださった、プロパティページのOnOK()でブレイクして、コースタッ
クをのぞいてみたら、OnOK()は、gakさんのいってくださったOnApply()から呼ばれてい
ました。そして、OnApply()をオーバライドして、以下の記述をしたら、イメージどおり
の動作をしました。
まだ、しっくりきてません。(どうしてそうなるのか、理解できていません)
BOOL CXXXPP1::OnApply()
{
if (m_TelNo >= 0) {
return CPropertyPage::OnApply();
} else {
AfxMessageBox(電話番号が入力されていません) ;
}
return(FALSE) ;
}