データの保存方法は?

  

ここに紹介するプログラムは、WIN XP 2003/Windows 7 (32bits) - OS 環境でマイクロソフトのVisual Studio 2010 で作ったものです。
Windows XP/ Windows 7(32bits) での動作は確認済みですが…

 

主データファイルの保存方法は?
負荷計算の条件データなどは保存して再現性があるようにしておきたい。


最終的な、データはMFCの標準シリアライズ機能を使い保存することにしました。

これにより、複雑なファイル形式ですが簡単なコーディングで行うことが出来ます。

 

まずは、保存されるデータの構造から説明します。

ダイアログから入力したデータ群は、ダイアログクラスのメンバー変数であるそれぞれのアレーに格納されます。

 

 

クラス名

クラスメンバー

壁情報

CWallDlg Class

m_WallDataArray

窓情報

CGlassDlg Class

m_GlassDataArray

その他情報

COtherDlg Class

m_OtherData

部屋情報

CRoomDlg Class

m_ArrayRoom

簡易負荷計算

CRoomDlg Class

m_SimpleDataArray

 

m_ArrayRoom (Index = 0)

m_WallDataArray

壁データは必要な個数のアレー

m_GlassDataArray

窓データは必要な個数のアレー

m_OtherData

Roomに対して1個

m_SimpleData

Roomに対して1個


 

 

m_ArrayRoom (Index = 1)

m_WallDataArray

壁データは必要な個数のアレー

m_GlassDataArray

窓データは必要な個数のアレー

m_OtherData

Roomに対して1個

m_SimpleData

Roomに対して1個

        :

        :

 

m_ArrayRoomと同じものを、名前をm_AirconArrayとしてドキュメントクラスに作り、ダイアログでデータの入力編集が確定した時にコピーされるようにしておきます。 データの編集や入力ダイアログとのやり取りは、m_ArrayRoomで行い負荷計算やデータをファイルに落とす時は、m_AirconArrayを使用することとしました。    

 

複雑ですが、ドキュメントビューアーキテクチュアの考えにのっとり、ビューに密接に関り合う、計算・表示・ファイリング作業は、ドキュメント・メンバーに独立したアレーを持たせるようにしています。 

 

プログラムを途中で終了した時や、完了の時、この決められた順序でシリアライズ機能を使いファイルに落とします。 プログラムを再度起動したとき、同様にシリアライズ機能でデータをm_AirconArrayに読み込み、更にダイアログクラスの各々のアレーにコピーし編集や計算を行います。

 

各Roomデータは、Index番号で所定のデータを拾い出しダイアログのグリッドに表示し編集します。

 

m_AirconArray

 --- 

m_ArrayRoom

  ---------------------------

ダイアログRoomDlg

Index = 0

 

Index = 0

 

 

  ------

m_WallDataArray

  -----

WallDlg   

m_GlassDataArray

GlassDlg

m_OtherData

OtherDlg

m_SimpleData

SimpleDlg

Index = 1

Index = 1

Index = 2

Index = 2

Index = 3

Index = 3

 

特定のRoomDataが削除された場合、その下のm_WallDataArray/m_GlassDataArray/m_OtherData/m_SimpleDataも同時に削除され Index番号を再配置し連続データにする必要があります。

 

追加の場合は、新たにIndex番号を追加し、その下にデータを書き加えます。

このコードは、ドキュメントクラスの”CreatRoomData( )関数にコーディングしました。

 

シリアライズのコーディング

単純にファイル書き込み・読み込みのコードをドキュメントクラスに書くと、変数が多いため非常に見難いことになります。従って、データクラスをCObjectクラスから派生させ、シリアライズ機能をインプリメントしました。

 

ヘッダーコード

 

class CWallData : public CObject
{
  DECLARE_SERIAL(CWallData)
  public:
  CWallData();
  CWallData( const CWallData& s );
  virtual ~CWallData();
  const CWallData& operator = ( const CWallData& s );

  CString m_orient;
  CString m_type;
  CString m_wallarea;
  CString m_uf;
  CString m_tempdeff;
  CString m_dnsty;

  protected:
  void Serialize(CArchive& ar); //シリアライズ機能

};

 

インプリメントコード

 

IMPLEMENT_SERIAL(CWallData, CObject, 0)
void CWallData::Serialize(CArchive& ar)
{
  if(ar.IsStoring()){
    ar << m_orient;
    ar << m_type;
    ar << m_wallarea;
    ar << m_uf;
    ar << m_tempdeff;
    ar << m_dnsty;
  }
  else{
    ar >> m_orient;
    ar >> m_type;
    ar >> m_wallarea;
    ar >> m_uf;
    ar >> m_tempdeff;
    ar >> m_dnsty;
  }
}

 

 

ドキュメントクラスのシリアライズ

 

/////////////////////////////////////////////////////////////////////////////
// CAutoACDoc シリアライゼーション
void CAutoACDoc::Serialize(CArchive& ar)
{
  CAirconData* pRoom;
  CWallData* pWall;
  CGlassData* pGlass;

  if ( ar.IsStoring( )) {
    ar << m_szPjname;
    ar << m_szPerform;

    // CItems Class 国情報の取得
    ar << ctry;
    ar << idod;
    ar << idof;
    ar << keidod;
    ar << keidof;
    ar << timediff;
    ar << alt;
    ar << oadb;
    ar << oawb;
    ar << oarh;
    ar << zone;
   
    r = m_ArrayAircon.GetSize(); // RoomDataの数取得
    ar << r;
    for( int i=0; r>i; i++ ) {
      pRoom = &m_ArrayAircon[i];
      ar << pRoom; // Room Data の保存(データクラスでシリアライズ関数をインプリメント)

      w = pRoom->m_ArrayWall.GetSize(); // WallDataの数取得
      ar << w;
      for( int j=0; w>j; j++ ) {
        pWall = &pRoom->m_ArrayWall[j];
        ar << pWall; // Wall Data の保存
      }

      g = pRoom->m_ArrayGlass.GetSize(); // GlassDataの数取得
      ar << g;
      for( int k=0; g>k; k++ ) {
        pGlass = &pRoom->m_ArrayGlass[k];
        ar << pGlass; // Glass Data の保存
      }
    }
  }
  else {
    m_Result.RemoveAll(); // 動的負荷計算データのリセット
    m_ArrayAircon.RemoveAll();
    m_ArrayList.RemoveAll();
    // General Items
    ar >> m_szPjname;
    ar >> m_szPerform;

    // CItems Class
    ar >> ctry;
    ar >> idod;
    ar >> idof;
    ar >> keidod;
    ar >> keidof;
    ar >> timediff;
    ar >> alt;
    ar >> oadb;
    ar >> oawb;
    ar >> oarh;
    ar >> zone;

    ar >> r; // Roomデータの数取得
    for(int i=0; r>i; i++) {
      ar >> pRoom;// Roomデータ取得
      ar >> w; // Wallデータ数取得
      pRoom->m_ArrayWall.RemoveAll(); // アレーの初期化
      for( int k=0; w>k; k++ ) {
        ar >> pWall; // Wall Data取得
        pRoom->m_ArrayWall.Add( *pWall );
        delete pWall;
      }

      ar >> g; // Glassデータの数取得
      pRoom->m_ArrayGlass.RemoveAll(); // アレーの初期化
      for( int m=0; g>m; m++ ) {
         ar >> pGlass; // Glass Data取得
         pRoom->m_ArrayGlass.Add( *pGlass );
        delete pGlass;
      }

      nIndex = m_ArrayAircon.Add( *pRoom ); // メインアレー作成
      // ファイル読み込み後のLeftView, AutoView 書き換え

      POSITION pos = GetFirstViewPosition();
      GetNextView( pos ); // LeftView のポインタ取得
      CView* pView = GetNextView( pos ); // AutoACView のポインタ取得
      UpdateAllViews( pView, ( LPARAM )nIndex, pRoom );
      delete pRoom;
    }
  m_bSerialized = TRUE;
  }
}

 

一部コードは省略してありますが、シリアライズ関数でのファイル入出力の流れです。 


ページ先頭に戻る
最終更新日: 2020/02/04