データの保存方法は?
- ◆プログラム作成ガイド
- ◆プログラムの開始
- ◆初期表示のデザイン
- ◆データの入力方法
- ◆クラスの作り方
- ◆データをメモリーに
- ◆ファイル読み書き
- ◆データの保存方法
- ◆ツリービューマウス右
- ◆画面表示インプリメント
- ◆複数のページ印字
- ◆DLL化する
- ◆エクセル似の入力
ここに紹介するプログラムは、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 |
-
WallDataは、CWallData クラスで構成されるm_WallDataArray に一旦格納される。
-
GlassDataは、CGlassData クラスで構成されるm_GlassDataArray に一旦格納される。
-
OtherDataは、COtherData クラスで構成されるm_OtherData に一旦格納される。
-
RoomDataは、CRoomData クラスで構成されるm_ArrayRoom に、上記の m_WallDataArray, m_GlassDataArray, m_OtherData と供にひとつのアレーに格納される。
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