プロパティページで入力必修項目をつくりたい – プログラミング – Home

プロパティページで入力必修項目をつくり...
 
通知
すべてクリア

プロパティページで入力必修項目をつくりたい


熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

VC++ 6.0 MFC XP

プロパティシートのOKボタンを押すと、付属するプロパティページのOnOk()を順番に実
行するそうですが、最初のプロパティーページで入力必修項目があって、プロパティシ
ートのOKボタンを押しても、無効化したいです。
該当するプロパティページのOnOK()をオーバライドしても、だめでした。
なにか、方法は、ありませんでしょうか?


引用解決済
トピックタグ
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ども、PATIOです。

プロパティページのOnOKをオーバーライドしたとありますが、
一体どんなコードを書かれたのでしょう?

あと、OnOKって確か返り値なしだったと思いますけれど、
呼び出し元にどうやって必須項目が足りない事を知らせようとしたのでしょう。

最終的にウインドウ全体を終わらせているのはプロパティシートのOnOKですよね。
だとしたらプロパティシートの方でプロパティページでエラーが起きている事を
感知して終了処理をしないようにする必要があると思いますけれど、
単純にOnOKを呼ぶだけしかしていないのであれば、プロパティシートの方で
プロパティページ側のエラーを知る事は出来ないと思いますよ。
既存仕組みで対処できないのであれば、プロパティシート側のOnOKを
オーバーライドして処理を書かないと無理なのではないかと思います。


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

PATIOさん、レスありがとうございます。

プロパティシートのOnOKは、オーバライドできないみたいです。

最初のプロパティページのOnOKのオーバライドは、以下の内容です。
if (m_TelNo >= 0) {
CPropertyPage::OnOK();
} else {
AfxMessageBox(電話番号が入力されていません) ;
}


返信引用
とおりすがり
 とおりすがり
(@とおりすがり)
ゲスト
結合: 23年前
投稿: 180
 

プロパティページのDDX&DDV使ったらダメなの?
あそこを自分でカスタムするのが一番手っ取り早いと思うんだけど。
それとページ切替でUpdateData(true)してFALSE帰ってきたら
LRESULTを1で返す。これで鉄板かと


返信引用
とおりすがり
 とおりすがり
(@とおりすがり)
ゲスト
結合: 23年前
投稿: 180
 

追記。VC6なら

//{{AFX_DATA_MAP(ページ)
//}}AFX_DATA_MAP ←このコメントの外に

if(pDX->m_bSaveAndValidate == TRUE)
{
 条件を書く。だめなら
 pDX->fali() をよぶとか
}


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

というか、ソースを見るとわかるんですが、
プロパティシートのソース上はOnOKの記述はないみたいですね。
プロパティページのOnOKにブレイクポイントを設定して
そこで止めてコールスタックで何処から呼ばれているか
確認した方が良さ気な感じがします。

既存のクラスとは違う動きをさせたい場合に
問題のクラスの既存の実装ではどうなっているのかを
把握する事が必要になります。
MFCはソースもついているのですからデバッガ使って追いかけてみましょう。
既存のクラスの動きが分かって初めてどうやって手を入れればよいのかも
理解できると思いますよ。

私自身はプロパティシートもプロパティページも殆ど使わないので
良く分からないです。TabControlを使って自前で実装する事が殆どなので。


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

とおりすがりさん、レスありがとうございます。
現在の状況は、プロパティーシートをモーダルしたあと、すぐOKを押されると、電話
番号が入力されずにプロパティシートは、閉じてしまいます。
プロパティシートのDDX&DDVをつかうとは?どういうことになるんでしょうか?
クラスウィザードに表示される、プロパティシートの変数は、なにもないんです
が・・・


返信引用
とおりすがり
 とおりすがり
(@とおりすがり)
ゲスト
結合: 23年前
投稿: 180
 

ごめん。ページ切り替えうんぬんはタブコントロールだから無視してください。

プロパティページならDoDataExchangeにコード書いて条件に失敗したら
Fail呼ぶだけでOKっす。たぶん。


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

なるほどプロパティ系を使う時はそうするんですね。

メモっておこう。


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> 該当するプロパティページのOnOK()をオーバライドしても、だめでした。
SDKでも使われる通常手法を取るなら、入力チェックは CPropertyPage::OnApply
(PSN_APPLY)で行えば良い。


返信引用
とおりすがり
 とおりすがり
(@とおりすがり)
ゲスト
結合: 23年前
投稿: 180
 

Applyは知らなかったです。
とりあえず、DoDataExchangeでやっとけば
他のページに移ることを阻止できるからこの場合は良いかもしれない。

あとはどのやり方がスレ主さんのやりたいことに沿っているか否か。
頑張ってください。


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

とおりすがりさん、PATIOさん、gakさん、レスありがとうございます。

PATIOさんのいってくださった、プロパティページのOnOK()でブレイクして、コースタッ
クをのぞいてみたら、OnOK()は、gakさんのいってくださったOnApply()から呼ばれてい
ました。そして、OnApply()をオーバライドして、以下の記述をしたら、イメージどおり
の動作をしました。
まだ、しっくりきてません。(どうしてそうなるのか、理解できていません)
BOOL CXXXPP1::OnApply()
{
if (m_TelNo >= 0) {
return CPropertyPage::OnApply();
} else {
AfxMessageBox(電話番号が入力されていません) ;
}
return(FALSE) ;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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