タブコントロール

[戻る]
みかん 2008/07/17(木) 11:29:49
表記の件で質問があります。

タブコントロール内にエディットボックスがあってそのエディットボックス内に
計算結果を表示させたいのですが、どのようなやりかたがあるでしょうか?
エディットボックス内に直接入力してその文字を取得はできたのですが・・・

開発環境はWindows XP Visual Studio2005 VC++ MFCです。

みかん 2008/07/17(木) 11:48:22
ちなみに
タブ内にはエディットボックスだけがあり、そのエディットボックスの変数
(m_EditNAme)を親ダイアログでも使用できるようになると有難いです。

//タブコントロール表示
BOOL CTabCtrlDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    
    SetIcon(m_hIcon, TRUE);         // 大きいアイコンの設定
    SetIcon(m_hIcon, FALSE);        // 小さいアイコンの設定
    
    // TODO: 初期化をここに追加します。
    {
        int        err = 0;
        CRect    rect;
        
        // 子ダイアログ作成
        if (!err) if (!m_dlgTabName.Create(CDlgTabName::IDD, this)) err = 1;
        if (!err) if (!m_dlgTabPrice.Create(CDlgTabPrice::IDD, this)) err = 1;
        if (!err) if (!m_dlgTabNum.Create(CDlgTabNum::IDD, this)) err = 1;
        // 子ダイアログ移動
        if (!err)
        {
            m_dlgTabName.GetClientRect(&rect);
            rect.OffsetRect(20, 40);
            m_dlgTabName.MoveWindow(&rect, FALSE);
            m_dlgTabPrice.MoveWindow(&rect, FALSE);
            m_dlgTabNum.MoveWindow(&rect, FALSE);
        }
        // タブ作成
        if (!err) if (m_xcTab.InsertItem(0, _T("名前")) == -1) err = 1;
        if (!err) if (m_xcTab.InsertItem(1, _T("体重")) == -1) err = 1;
        if (!err) if (m_xcTab.InsertItem(2, _T("人数")) == -1) err = 1;
        // 初期表示
        if (!err) OnTcnSelchangeTab(0, 0);
    }
    return TRUE;
}

PATIO 2008/07/17(木) 13:20:55
親ダイアログってCTabCtrlDlgの親って意味ですか?
m_EditNAmeってどのクラスの変数なんでしょう?

例えばですが、ダイアログAにタブコントロールがあって
タブのページにあたるダイアログがダイアログPageとします。
ダイアログPageにm_edtNameというエディットコントロールクラスの
変数があったとすると、

ダイアログPageはダイアログAのメンバー変数として定義するでしょうから
m_edtNameと言う変数がpublicなメンバー変数で、
ダイアログPageのインスタンスもダイアログAのpublicなメンバー変数で
あれば、普通にメンバー変数を参照する方法でアクセスできるはずです。

ですが、クラスとして考えるならば、メンバー変数を直接扱わせるのでは
なくてクラスにその変数を操作するメンバー関数を用意する方が
安全性が高くできるのでダイアログPageにGetName等の関数を作って
関数内でm_edtNameに対して操作をするようにするのが常套手段だと思います。
これと同じ考え方でダイアログAにもGetNameというメンバー関数を用意し、
その関数の中でダイアログPageのGetNameを呼ぶようにすれば、
ダイアログPageのm_edtNameを直接操作する必要は無いはずです。

この辺のカプセル化の概念は複雑なアプリを組み始める前にちゃんと理解して
置いた方が良いです。
カプセル化がなぜ良いのかと言う話はオブジェクト指向の入門書等を
御自分で読んで見られることをお勧めします。

なんにせよ、C++言語を使うのであれば、クラスの概念とか、
カプセル化、継承、仮想関数といった考え方をちゃんと理解した方がいいです。

PATIO 2008/07/17(木) 13:22:41
あうあう。
表示したいのでしたね。
GetNameをSetNameと読み替えて
ダイアログPageのSetNameでm_edtNameに引き渡された文字列を
設定すると言う風に考えて見てください。
GetがSetになるだけの話で基本的なスタンスは同じです。

みかん 2008/07/17(木) 13:53:34
[[解決]]
PATIOさん有難うございます。

子ダイアログでSetNameの関数を作成して、
それを親ダイアログ関数内で呼ぶようにしたらできました。

どうも有難うございます。

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