シリアライズについて

[戻る]
NOMURA 2010/01/09(土) 02:40:55
MFC SDI です、ファイルを開いて、エディットビューに表示し、かつ、
一行ずつコンテナに読込みたいのですが、デバッグモードで実行すると、Debug
Assertion Failed! が起こります
ネットで検索しますと、エディットビューのデータを取得したい場合、
ビューのドキュメントを取得する方法は多く見られるのですが、シリアライズする時点で
データをコンテナに取得しかつ、エディットビューに表示するような例は
見当たりませんでした、このような使い方はイレギュラーなのでしょうか?
また、どのようにすれば目的が果たせるでしょうか。よろしくお願いします。

// CxxxDoc シリアル化

void CxxxDoc::Serialize(CArchive& ar)
{
    CString line;
    if( ar.IsLoading() == TRUE)
    {
        while(ar.ReadString(line))
        {
            // メンバ変数 std::vector<CString> mc_vec
            mc_vec.push_back(line);
        }
    }
    if(ar.IsBufferEmpty())
        reinterpret_cast<CEditView*>(m_viewList.GetHead())->SerializeRaw(ar);
}

初心者だけど 2010/01/10(日) 21:36:51
void CxxxDoc::Serialize(CArchive& ar)
{

arからまずデータをよみます それをView側の変数に転送する
それから たとえば pViewにView側のポインタをゲットして
pView->Invalidate();すると
OnDraw(〜){〜〜〜}が起動されるから
そのなかでViewにお好きなように展開なさるのも一法

}

NOMURA 2010/01/11(月) 11:52:50
初心者だけど さん、ご回答ありがとう。
>arからまずデータをよみます それをView側の変数に転送する
これはできたのですが

>pViewにView側のポインタをゲットして
これは、CxxxViewクラスのポインタを、CxxxDocクラスでゲットするということだと思う
のですが、
すみません、具体的な例を教えていただきませんか。

bun 2010/01/11(月) 13:07:44
m_viewList はドキュメントに関連付けられたビューのリスト?
だとしたら、わざわざ自分で管理しなくて良いです。

以下のMFC関数で管理できます。
  CDocument::GetFirstViewPosition()
  CDocument::GetNextView()

例えば、SerializeRaw()関数呼ぶだけなら、以下の通りで良いです。
  void CxxxDoc::Serialize(CArchive& ar)
  {
    POSITION Pos = GetFirstViewPosition();
    while(Pos)
    {
      CEditView* lpView = (CEditView*)GetNextView(Pos);
      lpView->SerializeRaw(ar);
    }
  }

それでは、本題です。

> 一行ずつコンテナに読込みたいのですが、デバッグモードで実行すると、Debug
> Assertion Failed! が起こります
どういうAssertionですか?
Assertionのときは、[再試行]するとファイル名,行番号およびAssertionの原因が
分かります。

たぶん、「ファイルの末尾に達した」とか、そういうのですよね?
そうだとするなら、以下のコードのせいで、
>        while(ar.ReadString(line))
で、すでにファイルポインタがファイル末尾に行っちゃってるんです。

ファイルポインタを戻してください。
  ar.GetFile()->SeekToBegin();

ITO 2010/01/11(月) 13:47:23
>これは、CxxxViewクラスのポインタを、CxxxDocクラスでゲットするということだと
>思うのですが、
CView::GetDocument();

MSDNサンプル "Scribble"をダウンロードするといいと思います。
 HTTPに頼るのもいいですが、ドキュメント/ ビュー 
今回スレにはでていませんがフレームの関係についてはMSDNでも説明があります。
いつものことですが、説明は分かり難いですが内容は確かなものだと思いますので
MSDNをよく読むことを薦めます。

遠いようで一番の近道は書籍を購入することですね。

 

NOMURA 2010/01/16(土) 16:05:11
bun さんありがとう
ご指摘通り、ファイルポインタを戻したら期待通りの動作となりました。
ITOさん、scribbleの紹介ありがとう、MDIの良い題材ですね大変勉強になります
気づいたのですが、データ処理はDocクラスで行い、描画やプリントの処理はViewクラスで
行っているように思うのですが、特殊な場合もあるのでしょうが、基本のスタイルは
このパターンでいいのでしょうか?
それから、書籍の件ですがMFCの良書も紹介して頂けないでしょうか、Amazonで検索しますと
近年はMFCの本というのは出版されていないようですが、古い本でも結構ですので良い本
をご存知でしたら紹介願います、洋書はちょっと難有り(私の読解能力)ですが、合わせ
てお願いします。
それから、MSDNは読んでも理解できない場合が多いので敬遠がちですが、調べる努力をし
ていきます。

ITO 2010/01/18(月) 19:51:05
> 気づいたのですが、データ処理はDocクラスで行い、描画やプリントの処理はViewク  
> ラスで行っているように思うのですが、特殊な場合もあるのでしょうが、
> 基本のスタイルはこのパターンでいいのでしょうか?
僕は、ドキュメントはあまり使わないので、詳細は省きますが、
基本はいいと思います。

> それから、書籍の件ですがMFCの良書も紹介して頂けないでしょうか、Amazonで
> 検索しますと近年はMFCの本というのは出版されていないようですが、
> 古い本でも結構ですので良い本をご存知でしたら紹介願います、
> 洋書はちょっと難有り(私の読解能力)ですが、合わせてお願いします。
うーん、僕も本探しはへたですね。
東京はとおいですか?
「今のところ立ち読み出来る本屋さんで大きいのは、「八重洲ブックセンター」
でしょうかな?」と思います。
あと、秋葉原にも何件かありましたが、かなり模様替えしたので詳細は分かりません
ね。
初めてのときは、やはり書店で読んで選ぶのがいいと思います。
時間が掛かりますが順当の手段だと思います。

NOMURA 2010/01/19(火) 07:35:49
[[解決]]
ITOさんありがとうございました。
MFC本は、東京へ出張した際に探して見たいと思います。

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