お世話になっています。何方かお教えください。
自作関数の引数にダイアログのクラス名を入れたいのですが、なかなかうまくいきません。
環境 Win2000 VC++6.0 MFC ダイアログベースです
親ダイアログ.cpp とサブウィンドウ.cpp をつくっています。
今の現状です。
//------------------------------------------
親ダイアログ.cpp
BOOL CMainDlg::OnCommand(
WPARAM wParam,
LPARAM lParam)
{
CPassWordDlg m_PasWrdDlg; //開きたいダイアログクラス名
int cidID = LOWORD(wParam);
switch(cidID){
case ID_PASSWORDIPTBTN : // パスワード入力画面表示ボタン
case ID_PASSWORDSETBTN : // パスワード設定画面表示ボタン
if(cidID == ID_PASSWORDIPTBTN){
type = ID_PASSWORDIPTBTN;
}else{
type = ID_PASSWORDSETBTN;
}
// パスワード設定
wndopn( type ); // 自作関数サブウィンドウ.cppにとぶ
break;
}
//--------------------------------------------------
サブウィンドウ.cpp
BOOL wndopn( // ダイアログオープン
int cidID) // 子ウィンドウID
{
CPassWordDlg m_PasDlg; ※
m_PasDlg.DoModal();
}
以上のソースでサブウィンドウの※の部分を引数にもっていきたいのです。
サブウィンドウでダイアログクラス名を固定にしたくないのです。
サブウィンドウを共通関数にしたいのです。
私のイメージでは、以下の感じです。
//------------------------------------------------------------------------------
親ダイアログ.cppの一部抜粋
CPassWordDlg m_PasDlg; //例で私用するダイアログクラス名
wndopn( type ); // 自作関数サブウィンドウ.cppにとぶ
↓
wndopn( m_PasDlg, type ); // 自作関数サブウィンドウ.cppにとぶ
//------------------------------------------------------------------------------
サブウィンドウ.cpp
BOOL wndopn( // ダイアログオープン
親から送れてきたダイアログクラス名 m_Dlg,
int type)
{
m_Dlg.DoModal();
または
m_Dlg.ShowWindow(SW_SHOW);
}
親のダイアログ.cppでwndopn関数の第一引数のダイアログクラス名が変わっても
サブウィンドウ.cppには影響はないようにしたいのです。
どうか何方か御返答ください。宜しくお願いします。
サブウィンドウ.h
template<typename Window>
BOOL wndopn(Window& window, int type) {
window.DoModal();
...
}
なんてのじゃダメか?
御返答ありがとうございます。
template<typename Window> はどういう意味でどこに記述すればいいのですかね?
初心者なもんですみません。
よろしくおねがいします。
すみません。記述する場所はヘッダーファイルにかいていましたね。
意味だけ教えてください。templateてなんですか?
本を読んでください。
# 初心者ならなおさら。
本はないのでヘルプ見ました。
それから御返答いただいたソースを記述しましたがえらーが起きるのです。
エラー内容は、「Window、windowが定義されていない識別子です。」です。
そのソースが以下に書きました。
//----------------------------------------
サブウィンドウ.h
template<typename Window>
BOOL wndopn( Window& window, int type);
//-------------------------------------------------
サブウィンドウ.cpp
BOOL wndopn( // ダイアログオープン
Window& window,
int type)
{
window.DoModal();
}
//---------------------------------------------
僕が最初に示した通り、関数本体もヘッダに置いてください。
επιστημη さんの指示通り記述すればコンパイルが通りました。ご迷惑かけてすみません。
ヘッダに関数本体を記述してはいけないと思っていて記述してもいいんですね。
それから一つ質問があるのですがお答え願いますか。
template<typename Window>の記述は何故関数のすぐ上に記述しないといけないのでしょうか
template<typename Window>と関数の間に何か記述していたら、「Windowが定義されていませ
ん・・・」というエラーがでます、どうしてでしょうか。
宜しくお願いします。
それがtemplateのルールだからです。
とにかく、本を読んでください。
BBSで語り尽くせるようなことではありません。
すみません。いらだつのも無理ないですよね。本当に初心者でごめんなさい。