2016-12-03 22 views
0

CTestDialogのデフォルトコンストラクタをオーバーライドして、CStringを渡すことができます。MFCのダイアログのデフォルトコンストラクタをオーバーライド

にはどうすれば

CTestDialog(CString strValue = NULL);

するMFCでこれは可能ですか、それはちょうど私の想像で通過していますか?

class CTestDialog : public CDialog 
{ 
    DECLARE_DYNAMIC(CTestDialog) 

public: 
    CTestDialog(CWnd* pParent = NULL); // standard constructor 
    CTestDialog(CString strValue = NULL); // Custom Constructor 
    virtual ~CTestDialog(); 

    // Dialog Data 
#ifdef AFX_DESIGN_TIME 
    enum { IDD = IDD_TESTDIALOG }; 
#endif 

protected: 
    CString _filename; 
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 

    DECLARE_MESSAGE_MAP() 
public: 
    virtual BOOL OnInitDialog(); 
}; 

使用法:

CString str = _T("Some Text"); 

CTestDialog dlg(str); 
dlg.doModal(); 

UPDATE行で1

dlg.DoModal(); 

デバッグアサートに失敗しました。 Microsoft Visual C++ランタイムライブラリダイアログが表示されます。

UPDATE 2

IMPLEMENT_DYNAMIC(CTestDialog, CDialog) 

CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/) 
    : CDialog(IDD_TESTDIALOG, pParent) 
{ 

} 

CTestDialog::CTestDialog(CString str) 
    : CDialog(CTestDialog::IDD, NULL) 
{ 
    _filename = str; 
} 

CTestDialog::~CTestDialog() 
{ 
} 

void CTestDialog::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
} 


BEGIN_MESSAGE_MAP(CTestDialog, CDialog) 
END_MESSAGE_MAP() 

BOOL CTestDialog::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 

    // TODO: Add extra initialization here 
    AfxMessageBox(_filename.GetBuffer()); 
    return TRUE; 
} 
+0

にはいそれが可能です。あなたは何か問題を抱えていますか? – TheUndeadFish

+0

はい、上記のコードを書くたびにデバッグアサーションダイアログが表示されます。私は正しくそれを行う方法を見つけることはありません。どんなサンプルも非常に役に立ちます – Rahul

+0

@DhegdeModal() - >デバッグアサーションで@TheUndeadFishが発生します。それを解決するために何をすべきかわからない。 – Rahul

答えて

2

試してみてください。

class CTestDialog : public CDialog 
{ 
    DECLARE_DYNAMIC(CTestDialog) 

    public: 
     CTestDialog(CWnd* pParent = NULL); // standard constructor 

     CTestDialog(CWnd* pParent, CString strValue); // Custom Constructor 

     virtual ~CTestDialog(); 

    // Dialog Data 
    #ifdef AFX_DESIGN_TIME 
     enum { IDD = IDD_TESTDIALOG }; 
    #endif 

    protected: 
     CString _filename; 
     virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 

     DECLARE_MESSAGE_MAP() 
    public: 
     virtual BOOL OnInitDialog(); 
}; 

そして:

IMPLEMENT_DYNAMIC(CTestDialog, CDialog) 

CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/) 
    : CDialog(IDD_TESTDIALOG, pParent) 
{ 

} 

CTestDialog::CTestDialog(CWnd* pParent, CString str) 
    : CDialog(IDD_TESTDIALOG, pParent) 
{ 
    _filename = str; 
} 

CTestDialog::~CTestDialog() 
{ 
} 

void CTestDialog::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
} 


BEGIN_MESSAGE_MAP(CTestDialog, CDialog) 
END_MESSAGE_MAP() 

BOOL CTestDialog::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 

    // TODO: Add extra initialization here 
    AfxMessageBox(_filename.GetBuffer()); 
    return TRUE; 
} 

お知らせ:

CTestDialog::CTestDialog(CWnd* pParent, CString str) 
    : CDialog(IDD_TESTDIALOG, pParent) 
{ 
    _filename = str; 
} 

だから、それは次のようになります。あなたが見

CTestDialog dlg(NULL, "filename"); 
dlg.DoModal(); 

、カスタムコンストラクタが最初に呼び出されます。その後、必要なpParentを基本クラスのコンストラクタに渡します。

+0

1つのダイアログから別のダイアログに値を渡すためにコンストラクタを使用することは、データ転送の良い方法です。もう一つの疑問。カスタムコンストラクタで** pParent **を渡す必要があるか、省略することもできます – Rahul

0
class CTestDialog : public CDialog 
{ 
    DECLARE_DYNAMIC(CTestDialog) 

    public: 
     CTestDialog(CWnd* pParent = NULL); // standard constructor 

     CTestDialog(CString strValue); // Custom Constructor 

     virtual ~CTestDialog(); 

    // Dialog Data 
    #ifdef AFX_DESIGN_TIME 
     enum { IDD = IDD_TESTDIALOG }; 
    #endif 

    protected: 

     virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 

     DECLARE_MESSAGE_MAP() 
    public: 
     CString _filename; 
     virtual BOOL OnInitDialog(); 
}; 

と利用

CTestDialog dlg(NULL, stingtopass); 
dlg.doModal(); 
+0

デフォルトのコンストラクタを2つ持つことは、依然として悪い設計です。パラメータを指定せずにオブジェクトを作成するようになりました。どのコンストラクタを使用するのですか?コメントで述べたように、2番目のコンストラクタの宣言から '= NULL'を削除してください。また、変数を非公開にしてパブリックのGetメソッドまたはSetメソッドを追加することも、通常はベストです。最後に、元のコンストラクタにパラメータとして変数を追加しただけではない理由はわかりません。あなたは2つを必要としませんでした。 –

+0

@AndrewTruckle私はあなたの意見を受け入れる。小さな質問が私をくすぐる、質問は、デフォルトのコンストラクタをオーバーライドするか、GetメソッドかSetメソッドをあなたのガイドとして使用するかどうかです。どちらがmfcでもっと論理的で良い習慣であるか。 – Rahul

+0

いずれか、またはその両方。どちらも良い練習テクニックです。 –

関連する問題