INDEX UP-BEAT

Visual C++ 日々の泡(仮)
12月17日
12月14日


『データーベース的データ処理方法』(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








12月13日


『基礎テクニック・用語 あれこれ』(06)

− 「複数のViewを切り替え表示する」 −


********************************************************************

 MDIで複数のViewを切り替え表示する。

********************************************************************
<キーワード> 

<参照>

MDI 子フォームの作成

12月10日


『基礎テクニック・用語 あれこれ』(05)

− 「ダイアログのコントロールに対するメンバ変数を配列にする」 −


********************************************************************

 コントロールのIDを変数化する!

********************************************************************
<キーワード> 

<参照>

VC++関係[詳細]

コントロール編 + DDX 変数の配列






<注意点>

1.

//{{AFX_DATA(CControlDlg)
enum { IDD = IDD_CONTROL_DIALOG };
//}}AFX_DATA

//{{AFX_DATA_INIT(CControlDlg)
//}}AFX_DATA_INIT

//{{AFX_DATA_MAP(CControlDlg)
//}}AFX_DATA_MAP

の 外側 に書くようだ!

2.

 さらにメンバ変数・DDXを「ClassWizard」で追加すると

 エラーが出る。 [手書き]と「ClassWizard」との混在はどうすれば??




[ClassWiard]



<br><H3>フローティングフレームはIE3.0x以上でないとご覧になれません。</H3><br>・<a href="http://up-beat.pos.to/linux/data/control_01.htm" target="_blank">ソース</a><br>



[DDXの配列化]



<br><H3>フローティングフレームはIE3.0x以上でないとご覧になれません。</H3><br>・<a href="http://up-beat.pos.to/linux/data/control_02.htm" target="_blank">ソース</a><br>


12月9日


『データーベース的データ処理方法』(10)

− 日経ソフトウェア Meibo その2 −

********************************************************************

 シリアライズ・保存をこのソフトで学ぶ(まとめ)

********************************************************************

コレクション・クラスの作成


[データ構造]

 m_iDataCount       データ数
 +・・・・
 +CMeiboData +・
 +m_strName +・・・ 名前
 +m_strAddress +・・・ 住所
 +m_strTelephone+・・・ 電話番号








 CMeiboData * m_pMeiboData[100];

 m_pMeiboData[i]->m_strName
 m_pMeiboData[i]->m_strAddress
 m_pMeiboData[i]->m_strTelephone



MFCのAppWizardで作ったスケルトンには

[ファイル]-[開く]や[ファイル]-[上書き保存]などのメニューがある。

このメニューからは自動的にドキュメントクラスのシリアライズ関数が

呼ばれる。その部分に書き足せばよい。



// CMeiboDoc シリアライゼーション


void CMeiboDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
 {
  ar << m_iDataCount;
  for(int i = 0; i < m_iDataCount; i++){
    ar << m_pMeiboData[i];
  }
 }
 else
 {
  ar >> m_iDataCount;
  for(int i = 0; i < m_iDataCount; i++){
    ar >> m_pMeiboData[i];
   }
 }
}


 上記の部分から下記が呼び出される。

 二重のシリアライズ化と言う感じ。



MeiboData.cpp


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;
  }
}

12月8日


『データーベース的データ処理方法』(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;


2005年12月
2005年11月
2005年10月
2005年9月
2005年5月
2005年4月
2005年3月
2004年12月
2003年11月
2003年9月
2003年8月
2003年7月
2003年5月
2003年4月
2003年1月
2002年12月
2002年11月
2002年10月
2002年9月
2002年8月
2002年7月

admin.

Produced by Cute Girls Interface