Serialize関数による読み込み


あいや  2009-01-30 20:24:13  No: 69535

またもお世話になります.環境は XP, VS2008C++, MFCです.

ビュー・ドキュメント形式のプロジェクトで,Serialize関数で
ファイルから読み込んだデータを表(リストコントロールを貼り
付けたモードレスダイアログ画面)に表示させ,また表を修正した
結果をファイルに保存するプログラムを作成しました.

プログラムを起動した直後はデータが正しく読み込まれて表に
表示され,表を修正した結果も正しく保存されているようです.
  
  ところが,プログラム実行中に再度,同じファイルからデータ
を読み込もうとしても,読み込んでくれません.

下のSerialize関数内でAfxMessageBox関数のメッセージが表示
されないのです.別のファイルを読み込むときはメッセージが
表示され,正しく読み込まれます.

Serialize関数は同じファイルからデータを再度読み込むことが
できない仕様になっているのでしょうか?  

それともリセットのためのフラグや関数呼び出しをやってないために
再読み込みができないのでしょうか?

MSDNを調べてみたのですが,よくわかりません.どうかよろしくお願
いします.

struct BeamType {  // 表の1行分のデータを格納する構造体        
   size_t ndiv;     
   double L,D,d;
};

CtestDocクラス内
private:
vector<BeamType> v; // 表1行分のデータ

void CtestDoc::Serialize(CArchive& ar)
{
    size_t i, n;
    BeamType Bm;

    if (ar.IsStoring())  
    {   // 保存

        n = GetSize();  // vector v に格納されている要素数を取得
  if(!n) return; 
        ar << n;
  for(i=0; i<n; ++i) { 
        GetData(i, Bm);  // 表1行分のデータを取り出す
           ar << Bm.ndiv << Bm.L << Bm.D << Bm.d;
  }
    else
    {   // 読込   
 
        AfxMessageBox("kokodayo");
      
        Clear();    // vector v をクリア 
  ar >> n;
  for(i=0; i<n; ++i) {
     ar >> Bm.ndiv >> Bm.L >> Bm.D >> Bm.d; 
     AddData(Bm);  //  表1行分のデータを追加
  }
    }
}
void CtestView::OnInitialUpdate()
{
    CView::OnInitialUpdate();
        ・・・
   if( !m_pDlg->GetSafeHwnd() ) {
        m_pDlg->Create( GetDesktopWindow() ); // モードレスダイアログの生成
    }
   m_pDlg->ShowList(); // 表を表示し直す.
}


あいや  2009-01-30 20:26:32  No: 69536

すみません.コードがずれてしまいました.


Blue  2009-01-30 20:42:08  No: 69537

http://www.ne.jp/asahi/hishidama/home/tech/vcpp/reload.html
を参考にどうぞ。(VC6.0向けですが、なんとかなると思う。)


あいや  2009-01-30 20:56:15  No: 69538

Blueさん、ありがとうございます。勉強してやって見ます。


あいや  2009-01-31 03:55:36  No: 69539

すみません.Blueさんが紹介してくれたサイトはテクニックが私には複雑
すぎてここまでやるくらいならsireialize関数は使わないで別の方法を
使った方が良い気がしてきました.

ファイルをいったん閉じてもかまわないから

if (ar.IsStoring())  
{   // 保存
  ・・・
}
else
{   // 読込   
  ...
}

    }
}
ar.Close();

とやって見ましたが,結果は変わりませんでした.

ファイルを閉じることはできないのでしょうか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加