『データーベース的データ処理方法』(11)
− THE CODE PROJECT [ListEditor] その1 −
********************************************************************
SDIのCListCtrl・シリアライズをこのソフトで学ぶ
********************************************************************
[参照]
■Easy Navigation Through an Editable List View
1.AppWizard で SDIのスケルトン を作成。
2.View は CView(CListViewでなく) を選択。
3.ListEditorDoc でメンバ関数追加。
ClassWizardで
・OnOpenDocument(LPCTSTR lpszPathName) ・OnSaveDocument(LPCTSTR lpszPathName) ・SetTitle(LPCTSTR lpszTitle)
ドキュメントのタイトルをを決定
4.ListEditorDoc でメンバ変数追加。
CListEditorView* pView;
5.ListEditorDoc でシリアライゼーション変更。
POSITION Pos = GetFirstViewPosition (); CView* pView = GetNextView (Pos); pView->Serialize (ar);
6.ListEditorView でインクルードを追加。
#include "ListCtrl.h"
7.ListEditorView でメンバ変数追加。
BOOL FirstTime; BOOL Flush;
gxListCtrl m_ListCtrl;
8.ListEditorView でメンバ関数追加。
ClassWizardで WM_SIZE
void OnSize(UINT nType, int cx, int cy)
内容追加 if (m_ListCtrl.m_hWnd != NULL) m_ListCtrl.Resize (cx, cy);
9.ListEditorView でメンバ関数追加。
ClassWizardで
virtual BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL );
virtual void OnInitialUpdate();
virtual void Serialize(CArchive& ar);
中身を編集追加する。
10.CListEditorView でコンストラクタでメンバ変数初期化。
FirstTime = TRUE; Flush = TRUE;
11.MainFrm でコントロール用メンバ変数追加。
CReBar m_wndReBar; CDialogBar m_wndDlgBar;
12.新規クラスの追加。
クラスの種類 MFCクラス クラス名 gxEditCell 基本クラス CEdit
13.新規クラスの追加。
クラスの種類 MFCクラス クラス名 gxListCtrl 基本クラス CListCtrl
|
|
『データーベース的データ処理方法』(09)
− 日経ソフトウェア Meibo −
********************************************************************
シリアライズ・保存をこのソフトで学ぶ(作ってみよう!)
********************************************************************
■コレクション・クラスの作成
1.AppWizard の SDI を作成。
2.View は CScrollView を選択。
3.データ入力用・削除用の2つのダイアログを作成。
4.上記ダイアログの2つのクラスを作成。 ↑ (リソースをクリックしClassWizard)
5.メンバ変数を追加(上記クラスに)
ClassWizardで [削除用] int m_iDelNo
[入力用] CString m_strAddress; CString m_strName; int m_iNo; CString m_strTelephone;
6.新規クラスを追加。
クラスクラスの種類 Generic クラス クラス名 CMeiboData ファイル名 MeiboData 派生元 CObject 用途 public 注意文が出るが気にせずOK!?
7.DECLARE_SERIAL マクロ・メンバ関数 Serialize をオーバーライド
MeiboData.h に手動で書き込む!
class CMeiboData : public CObject {
// ↓↓ 追加 ↓↓ DECLARE_SERIAL(CMeiboData) // ↑↑ 追加 ↑↑
public:
// ↓↓ 追加 ↓↓ virtual void Serialize(CArchive& ar); CString m_strTelephone; CString m_strAddress; CString m_strName; // ↑↑ 追加 ↑↑
CMeiboData(); virtual ~CMeiboData();
};
MeiboData.cpp に手動で書き込む!
// ↓↓ 追加 ↓↓ IMPLEMENT_SERIAL(CMeiboData, CObject, 1) // ↑↑ 追加 ↑↑
// ↓↓ 追加 ↓↓
void CMeiboData::Serialize(CArchive &ar) { if(ar.IsStoring()){ // ファイルに書き込む ar << m_strName; ar << m_strAddress; ar << m_strTelephone; } else{ // ファイルから読み出す ar >> m_strName; ar >> m_strAddress; ar >> m_strTelephone; } }
// ↑↑ 追加 ↑↑
8.MeiboDoc.h 変更
メンバ変数の追加 CMeiboData * m_pMeiboData[100]; int m_iDataCount;
ClassWizard で 関数追加 (オーバーライド)
オブジェクト CMeiboDoc メッセージ DeleteContents
virtual void DeleteContents();
9.MeiboDoc.cpp に追加
// CMeiboDoc シリアライゼーション
void CMeiboDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: この位置に保存用のコードを追加してください。 // ↓↓ 追加 ↓↓ ar << m_iDataCount;
for(int i = 0; i < m_iDataCount; i++){ ar << m_pMeiboData[i]; // ↑↑ 追加 ↑↑ } else { // TODO: この位置に読み込み用のコードを追加してください。
// ↓↓ 追加 ↓↓ ar >> m_iDataCount; for(int i = 0; i < m_iDataCount; i++){ ar >> m_pMeiboData[i]; } // ↑↑ 追加 ↑↑ } }
// CMeiboDoc コマンド
// ↓↓ 追加 ↓↓
void CMeiboDoc::DeleteContents() { // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
for(int i = 0; i < m_iDataCount; i++) delete m_pMeiboData[i]; m_iDataCount = 0;
CDocument::DeleteContents(); }
// ↑↑ 追加 ↑↑ 10.メニューの追加
名簿データ入力 IDM_INPUT 名簿データ削除 IDM_DELETE
上記メニューに MeiboView ClassWizard で関数追加
// ↓↓ 追加 ↓↓ #include "InputDlg.h" #include "DeleteDlg.h" // ↑↑ 追加 ↑↑
// CMeiboView クラスのメッセージ ハンドラ
void CMeiboView::OnInput() { // TODO: この位置にコマンド ハンドラ用のコードを追加してください // ↓↓ 追加 ↓↓ CMeiboDoc* pDoc = GetDocument(); CInputDlg dlg; dlg.m_iNo = pDoc->m_iDataCount + 1; if(dlg.DoModal() == IDOK){ if((dlg.m_iNo >= 1) && (dlg.m_iNo <= 100) && (dlg.m_iNo <= pDoc->m_iDataCount + 1)){ if(dlg.m_iNo == pDoc->m_iDataCount + 1){ pDoc->m_pMeiboData[dlg.m_iNo - 1] = new CMeiboData; pDoc->m_iDataCount++; } pDoc->m_pMeiboData[dlg.m_iNo - 1]->m_strName = dlg.m_strName; pDoc->m_pMeiboData[dlg.m_iNo - 1]->m_strAddress = dlg.m_strAddress; pDoc->m_pMeiboData[dlg.m_iNo - 1]->m_strTelephone = dlg.m_strTelephone; pDoc->SetModifiedFlag(); Invalidate(); } else{ MessageBox("不正なデータNo.です。", "Meibo", MB_ICONSTOP | MB_OK); } }
// ↑↑ 追加 ↑↑ }
void CMeiboView::OnDelete() { // TODO: この位置にコマンド ハンドラ用のコードを追加してください // ↓↓ 追加 ↓↓ CMeiboDoc* pDoc = GetDocument(); CDeleteDlg deldlg;
if((deldlg.DoModal() == IDOK) && (deldlg.m_iDelNo > 0) && (deldlg.m_iDelNo <= pDoc->m_iDataCount)){ delete pDoc->m_pMeiboData[deldlg.m_iDelNo -1]; for(int i =deldlg.m_iDelNo - 1; i < pDoc->m_iDataCount - 1; i++){ pDoc->m_pMeiboData[i] = pDoc->m_pMeiboData[i + 1]; } pDoc->m_iDataCount--; pDoc->SetModifiedFlag(); Invalidate(); } else{ MessageBox("不正なデータNo.です。", "Meibo", MB_ICONSTOP | MB_OK); }
// ↑↑ 追加 ↑↑ }
11.初期画面
// CMeiboView クラスの描画
void CMeiboView::OnDraw(CDC* pDC) { CMeiboDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。
// ↓↓ 追加 ↓↓ // 固定行を描画 pDC->TextOut(10, 3, "No"); pDC->TextOut(60, 3, "名前"); pDC->TextOut(200, 3, "住所"); pDC->TextOut(550, 3, "電話番号"); pDC->MoveTo(CPoint(5, m_iFontHeight + 5)); pDC->LineTo(CPoint(700, m_iFontHeight + 5));
// データ行を描画 CString strNo; for(int i = 0; i < pDoc->m_iDataCount; i++){ strNo.Format("%d", i + 1); pDC->TextOut(10, (m_iFontHeight + 10) * (i + 1), strNo); pDC->TextOut(60, (m_iFontHeight + 10) * (i + 1), pDoc->m_pMeiboData[i]->m_strName); pDC->TextOut(200, (m_iFontHeight + 10) * (i + 1), pDoc->m_pMeiboData[i]->m_strAddress); pDC->TextOut(550, (m_iFontHeight + 10) * (i + 1), pDoc->m_pMeiboData[i]->m_strTelephone); } // ↑↑ 追加 ↑↑
}
void CMeiboView::OnInitialUpdate() { CScrollView::OnInitialUpdate();
// CSize sizeTotal; // TODO: このビューのサイズの合計を計算します。 // sizeTotal.cx = sizeTotal.cy = 100; // SetScrollSizes(MM_TEXT, sizeTotal);
// ↓↓ 追加 ↓↓
// TODO: このビューのサイズの合計を計算します。 CDC* pDC = GetDC(); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); // フォントの高さを取得 m_iFontHeight = tm.tmHeight;
SetScrollSizes(MM_TEXT, CSize(700, (m_iFontHeight + 10) * 101));
// ↑↑ 追加 ↑↑
}
メンバ変数追加 int m_iFontHeight;
|
|