📄 managerview.cpp
字号:
// managerView.cpp : implementation of the CManagerView class
//
#include "stdafx.h"
#include "manager.h"
#include "AddrSetup.h"
#include "MoneySetup.h"
#include "MainFrm.h"
#include "managerDoc.h"
#include "managerView.h"
#include "DAOTDlg1.h"
#include "database.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CManagerView
IMPLEMENT_DYNCREATE(CManagerView, CFormView)
BEGIN_MESSAGE_MAP(CManagerView, CFormView)
//{{AFX_MSG_MAP(CManagerView)
ON_NOTIFY(NM_DBLCLK, IDC_ADDRESS_LIST, OnDblclkAddressList)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_MODIFY, OnModify)
ON_BN_CLICKED(IDC_DEL, OnDel)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_ADDRESS_LIST, OnColumnclickAddressList)
ON_UPDATE_COMMAND_UI(IDC_ADD, OnUpdateAdd)
ON_UPDATE_COMMAND_UI(IDC_DEL, OnUpdateDel)
ON_UPDATE_COMMAND_UI(IDC_MODIFY, OnUpdateModify)
ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(IDC_UPDATE, OnUpdate)
ON_WM_CONTEXTMENU()
ON_UPDATE_COMMAND_UI(IDC_UPDATE, OnUpdateUpdate)
ON_COMMAND(IDC_ADDRESS, OnAddress)
ON_UPDATE_COMMAND_UI(IDC_ADDRESS, OnUpdateAddress)
ON_COMMAND(IDC_MONEY, OnMoney)
ON_UPDATE_COMMAND_UI(IDC_MONEY, OnUpdateMoney)
ON_COMMAND(ID_NEW_DATABASE, OnNewDatabase)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
ON_CBN_SELENDOK(ID_EMPTY,OnNewAddress)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CManagerView construction/destruction
//构造函数
CManagerView::CManagerView()
: CFormView(CManagerView::IDD)
{
//{{AFX_DATA_INIT(CManagerView)
//}}AFX_DATA_INIT
// TODO: add construction code here
m_pDatabase=NULL;//数据库指针为空
m_pTableDef=NULL;//数据库表定义为空
m_bIsOpen=FALSE;//没有数据库打开
m_bIsNewDatabase=FALSE;//没有打开新数据库
m_nFieldIndex=0;//数据库表的字段数为零
m_bIsMoney=FALSE;//没有打开帐簿
m_bIsAddress=FALSE;//没有打开通讯录
}
//构析函数
CManagerView::~CManagerView()
{
}
void CManagerView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CManagerView)
DDX_Control(pDX, IDC_ADDRESS_LIST, m_list);
//}}AFX_DATA_MAP
}
BOOL CManagerView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CFormView::PreCreateWindow(cs);
}
//初始化视图
void CManagerView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
m_list.SetExtendedStyle(LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT
|LVS_EX_GRIDLINES|LVS_EX_TRACKSELECT);
OnAddress();//初始化时进入通讯录
}
/////////////////////////////////////////////////////////////////////////////
// CManagerView printing
BOOL CManagerView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CManagerView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CManagerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
void CManagerView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
// TODO: add customized printing code here
}
/////////////////////////////////////////////////////////////////////////////
// CManagerView diagnostics
#ifdef _DEBUG
void CManagerView::AssertValid() const
{
CFormView::AssertValid();
}
void CManagerView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CManagerDoc* CManagerView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CManagerDoc)));
return (CManagerDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CManagerView message handlers
//在列表框中显示数据库数据
void CManagerView::LoadDatabaseData()
{
m_list.DeleteAllItems();//删除列表中所有内容(行)
while (m_list.DeleteColumn(0));//删除列表中所有列
int m_nFieldIndex=0;
int index=0;
CMainFrame *pWnd=(CMainFrame *)AfxGetMainWnd();
CDaoTableDefInfo TableInfo;
//如果是新打开的数据库
if(!m_bIsNewDatabase)
{
pWnd->m_wndComboBox.ResetContent();//新打开数据库时要清空组合框中内容
//如果数据库中还有表信息为取出
while(index<m_pDatabase->GetTableDefCount())
{
//获得表信息
m_pDatabase->GetTableDefInfo(index,TableInfo,AFX_DAO_ALL_INFO);
// 如果不是系统表或是隐藏表则将表名添加到组合框中,以备后用
if (!(TableInfo.m_lAttributes & dbSystemObject)
&& !(TableInfo.m_lAttributes & dbHiddenObject))
pWnd->m_wndComboBox.AddString(TableInfo.m_strName);
index += 1;
}
//设置组合框选项
pWnd->m_wndComboBox.SetCurSel(0);
}
//获得组合框中当前所选表名
pWnd->m_wndComboBox.GetLBText(pWnd->m_wndComboBox.GetCurSel(),m_strTableName);
//创建新的表定义
if (m_pTableDef!= NULL)
{
if (m_pTableDef->IsOpen())
m_pTableDef->Close();
delete m_pTableDef;
}
m_pTableDef = new CDaoTableDef(m_pDatabase);
//表定义创建失败
if ((m_pTableDef) == NULL)
return ;
//打开指定的表定义
m_pTableDef->Open(m_strTableName);
int where;
COleVariant var;
if(m_strTableName=="帐簿")//如果打开的表是“帐簿”
where=0;
else
where=1;
switch(where)
{
case 0:
//向列表框中添加列,对于“帐簿”不需要将所有字段都显示
m_list.AddColumn(_T("日期"),0);
m_list.AddColumn(_T("收入"),1);
m_list.AddColumn(_T("支出"),2);
m_list.AddColumn(_T("合计"),3);
if(!m_moneySet.IsOpen())//打开“帐簿”记录集
m_moneySet.Open();
int j;
//将表中记录显示到列表框中
for(j=0;j<m_moneySet.GetRecordCount();j++)
{
m_list.AddItem(j,0,VariantToStr(m_moneySet.m_date));
m_list.AddItem(j,1,VariantToStr(m_moneySet.m_sumIn));
m_list.AddItem(j,2,VariantToStr(m_moneySet.m_sumOut));
m_list.AddItem(j,3,VariantToStr(m_moneySet.m_sumAll));
m_moneySet.MoveNext();
}
m_moneySet.Close();
break;
//如果是其它数据库表,则将所有字段信息都显示在列表框中
default:
int i=0;
while(i<m_pTableDef->GetFieldCount())//如果字段信息未取完
{
//取出表中字段的信息
m_pTableDef->GetFieldInfo(m_nFieldIndex,m_FieldInfo,AFX_DAO_ALL_INFO);
//在列表中为每一个字段添加一列
m_list.AddColumn(_T(m_FieldInfo.m_strName),m_nFieldIndex);
i+=1;
m_nFieldIndex+=1;
}
m_pTableDef->Close();//关闭数据库表定义对象
if(m_strTableName!="通讯录")
{
//创建记录集对象
CDaoRecordset m_pSet(m_pDatabase);
CString sqlSelect(_T("Select * From ["));
sqlSelect += m_strTableName;
sqlSelect += _T("]");
//打开记录集
m_pSet.Open(dbOpenDynaset,sqlSelect);
COleVariant var;
int j,s;
for(j=0;j<m_pSet.GetRecordCount();j++)
{
m_pSet.GetFieldValue(0,var);
for(s=0;s<m_nFieldIndex;s++)
{
m_pSet.GetFieldValue(s,var);//得到字段数据
m_list.AddItem(j,s,VariantToStr(var));//向列表框中显示字段数据
}
m_pSet.MoveNext();
}
m_pSet.Close();
}
else
{
if(!m_addrSet.IsOpen())
m_addrSet.Open();
COleVariant var;
int j,s;
for(j=0;j<m_addrSet.GetRecordCount();j++)
{
m_addrSet.GetFieldValue(0,var);
for(s=0;s<m_nFieldIndex;s++)
{
m_addrSet.GetFieldValue(s,var);
m_list.AddItem(j,s,VariantToStr(var));
}
m_addrSet.MoveNext();
}
m_addrSet.Close();
}
}
//如果打开的是通讯录或是家财管理时才能够对记录进行删除或添加操作
if(m_strTableName=="通讯录")
{
m_bIsOpen=TRUE;
m_bIsAddress=TRUE;
m_bIsMoney=FALSE;
}
if(m_strTableName=="帐簿")
{
m_bIsOpen=TRUE;
m_bIsMoney=TRUE;
m_bIsAddress=FALSE;
}
m_bIsNewDatabase=TRUE;
//设置窗口标题
GetParent()->SetWindowText(m_strTableName);
//更新窗口
UpdateWindow();
}
//处理双击列表框消息
void CManagerView::OnDblclkAddressList(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
if(m_bIsAddress)
ModifyAddress();
else if(m_bIsMoney)
ModifyMoney();
*pResult = 0;
}
//打开数据库
BOOL CManagerView::OpenDatabase()
{
// 如果数据库已被打开则关闭并删除之
if (m_pDatabase!= NULL)
{
if (m_pDatabase->IsOpen())
m_pDatabase->Close();
delete m_pDatabase;
}
// 创建新的数据库对象
m_pDatabase = new CDaoDatabase;
// 数据库指针创建失败
if (&(*m_pDatabase) == NULL)
return FALSE; // fatal error
// 如果创建成功则打开该数据库
try
{
m_pDatabase->Open(m_strDatabaseName);
}
catch (CDaoException *e)
{
// 如果文件不存在
if (e->m_pErrorInfo->m_lErrorCode == 3024)
{
// 生成输出信息
CString message = _T("不能打开数据库--例外: ");
message += e->m_pErrorInfo->m_strDescription;
// 输出到消息对话框
AfxMessageBox(message);
// 返回
return FALSE;
}
else // 如果是其它错误
{
// 生成输出信息
CString message = _T("数据库打开失败--例外: ");
message += e->m_pErrorInfo->m_strDescription;
// 输出消息对话框
AfxMessageBox(message);
// 返回
return FALSE;
}
// 删除例外
e->Delete();
delete m_pDatabase;
m_pDatabase = NULL;
}
catch (CMemoryException *e)
{
// 输出到消息对话框
AfxMessageBox(_T("数据库打开失败--内存出错!"));
// 删除例外
e->Delete();
delete m_pDatabase;
m_pDatabase = NULL;
// 返回
return FALSE;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -