DOCクラスの使い方について 

[戻る]
たかし   2001/02/12(月) 07:00:14
はじめまして。専門学校に通っている高志といいます。よろしくお願いします。
学校の卒業課題で三目並べを作っていますが、Dataの共有の仕方がわかりません。
SDIベースでウインドウのメニューから CSanmokuDlg を呼んで、
(九つのボタン形式(マスメです))ボタンが押された回数(int型)で、奇数はPlayerA,偶数は
PlayerBとキャプションを書き換えるような事をしたいのです。
上記の場合、CSanmokuDlgの例えばOnButton1が押された場合、DocからDataを読み込む
関数というのは、どういったものなんでしょうか?
もしくは,CSanmokuDlg.hにintを書き込めばよろしいのでしょうか?

ダイアログベースやSDIのウインドウからDocのDataを読み込むというのは、
書いてあるとこを見たときあるのですが、ウインドウから呼び出されたダイアログボックス
というのは調べられませんでした。
初歩的なことですいませんが、よろしくお願いします。

たかし 2001/02/12(月) 08:54:39
追加

CSanmokuDoc.h
//アストリビュート
   public:
         int sam;

CSanmokuDoc.cpp
CSanmokuDoc::CSanmokuDoc()
{
        //TODO: この位置に1度だけ呼ばれる構築用のコードを追記してください。
        sam = 0;
}

CSanmokuDlg.cpp
void CSanmokuDlg::OnButton1
{
        //TODO; この位置にコントロール通知ハンドラ用のコードを追記してください。
        int nn;

        nn = ((CSanmokuDoc*)GetDocument())->sam;
}


上記を記入しましたが'GetDocument':定義されていない識別子です。
と出てきます。

[E-Mail] 2001/02/12(月) 09:36:12
GetDocumentは使えないですね。

解決策?を一つ

ダイアログのクラスにDocクラスのメンバ(ポインタ)を宣言、
モーダルダイアログならDoMdal、モードレスダイアログならCreateの時に
Docクラスのポインタを渡す、DoMdal又はCreateでメンバ(ポインタ)にコピー

これでダイアログ内でDocのメンバにもアクセスできるはずです。

たかし 2001/02/12(月) 10:37:42
重さんアドバイスありがとうございます。

本当に申し訳ないんですが、具体的な例をあげてもらえませんか。
みなさん忙しいとは思いますがよろしくお願いします。m(_)m

2001/02/12(月) 11:10:55
まずは、訂正
> モードレスダイアログならCreateの時に
間違ってますね。(^^;)
サンプルを見てもらえれば解ると思います。

では、以下サンプルです。(基本的に追加部分のみです)

CSanmokuDlg.h

#include "CSanmokuDoc.h"
class CSanmokuDlg : public CDialog
{
private:
    CSanmokuDoc    *m_pDoc;    // 追加

// コンストラクション
public:
    CSanmokuDlg (CWnd* pParent = NULL);   // 標準のコンストラクタ
    CSanmokuDlg (CSanmokuDoc*);           // 追加(モードレス)

    BOOL Create(void);                    // 追加(モードレス)
    int  DoModal(CSanmokuDoc*);           // 追加(モーダル)
};


CSanmokuDlg.cpp
#include "CSanmokuDlg.h"

CSanmokuDlg::CSanmokuDlg(CSanmokuDoc *pTemp)
    : CDialog(CSanmokuDlg::IDD, NULL)
{
    m_pDoc = pTemp;
}

BOOL CSanmokuDlg::Create()
{
    return CDialog::Create(CSanmokuDlg::IDD);
}

int CSanmokuDlg::DoModal(CSanmokuDoc *pTemp)
{
    m_pDoc = pTemp;

    return CDialog::DoModal();
}

        
呼び出すときはCSanmokuDocクラスからなら、
モーダルは
    CSanmokuDlg cSanmokuDlg;
    cSanmokuDlg.DoModal(this);

モードレスは
    CSanmokuDlg cSanmokuDlg(this);
    cSanmokuDlg.Create();

で呼び出せます。

注意事項
CSanmokuDoc.hでCSanmokuDlg.hをインクルードする場合には少々細工が必要になると思われます。
以上のサンプルは一切動作確認をしていません。"変だ?"と思われた場合には再度書き込みをして下さい。

たかし 2001/02/12(月) 12:40:28
重さんアドバイスありがとうございます。

本当に申し訳ないんですが、具体的な例をあげてもらえませんか。
みなさん忙しいとは思いますがよろしくお願いします。m(_)m

2001/02/12(月) 13:37:54
具体的な例と言われても・・・
前のサンプルならDocクラスにポインタアクセス出来る筈なんですけど

> SanmokuDoc.cpp
> CSanmokuDoc::CSanmokuDoc()
> {
>         //TODO: この位置に1度だけ呼ばれる構築用のコードを追記してください。
>         sam = 0;
> }
> 
> CSanmokuDlg.cpp
> void CSanmokuDlg::OnButton1
> {
>         //TODO; この位置にコントロール通知ハンドラ用のコードを追記してください。
>         int nn;
> 
>         nn = m_pDoc->sam;    // 前のサンプル+ここを変更
> }

これでアクセスできませんか?


> CSanmokuDoc.hでCSanmokuDlg.hをインクルードする場合には少々細工が必要になると思われます。
1.細工と言ってもマクロでOK。
2.CSanmokuDoc.hでインクルードせずに.cppでインクルードすれば何も問題なし。(グローバルのみでしか扱えませんが)

たかし 2001/02/13(火) 06:31:06
[[解決]]
重さんまたまたアドバイスありがとうございます。

学校(2年生)の方では、モードレスのほうは難しいからとモーダルのほうしか
扱ったことがありません。恥ずかしながら・・・(でも、卒業までに作ってみたいな)

質問の件ですが、このサイトに書いてあった
CxxxDoc *pDoc = (CxxxDoc*)((CFrameWnd *)AfxGetMainWnd())->GetActiveDocument();
で解決できました。(すいません。FrameWndとかかいてあったからダイアログとは関係ないかなとか思っていました。)

重さんのアドバイスのほうは、僕の書き方が悪いのかちょとエラーが出てきます。
でも、勉強としてやってみます。
難しいことはわからないのですが、これは、DocクラスのTemplateをm_pDocにコピーして
使うといったことなんでしょうか?違っていたらすいません。
あっ、マクロも使ったことがありません。
精進足りませんね。。。。

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