⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xkdbmsview.cpp

📁 简单数据库管理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// xkDBMSView.cpp : implementation of the CxkDBMSView class
//

#include "stdafx.h"
#include "xkDBMS.h"
#include "xkDBMSDoc.h"
#include "xkDBMSView.h"
#include "EditCell.h"
#include "Vector.h"
#include "xkExecEngine.h"
#include "xkDict.h"
#include "xkDelRecDlg.h"
#include "xkInputSource.h"
#include "xkSQLParser.h"
#include "Shlwapi.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CxkDBMSView
extern CxkDBMSApp theApp;
IMPLEMENT_DYNCREATE(CxkDBMSView, CFormView)

BEGIN_MESSAGE_MAP(CxkDBMSView, CFormView)
	//{{AFX_MSG_MAP(CxkDBMSView)
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnSelchangeTab1)
	ON_CBN_SELCHANGE(IDC_ATTRIBUTE, OnSelchangeAttribute)
	ON_NOTIFY(NM_CLICK, IDC_RECORDLIST, OnClickRecordlist)
	ON_BN_CLICKED(IDC_INSERTFIELD, OnInsertField)
	ON_BN_CLICKED(IDC_CREATETABLE, OnCreatetable)
	ON_COMMAND(ID_SAVEDICT, OnSavedict)
	ON_COMMAND(ID_SAVETABLE, OnSavetable)
	ON_COMMAND(ID_LOADDICT, OnLoaddict)
	ON_BN_CLICKED(IDC_INSERTRECORD, OnInsertRecord)
	ON_LBN_SELCHANGE(IDC_TABLESET, OnSelchangeTableset)
	ON_NOTIFY(LVN_ENDLABELEDIT, IDC_RECORDLIST, OnEndlabeleditRecordlist)
	ON_BN_CLICKED(IDC_DELETERECORD, OnDeleteRecord)
	ON_BN_CLICKED(IDC_UPDATERECORD, OnUpdateRecord)
	ON_BN_CLICKED(IDC_UPDATETABLE, OnUpdateTableList)
	ON_BN_CLICKED(IDC_SQLEXEC, OnSqlExec)
	//}}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)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CxkDBMSView construction/destruction
extern xkExecEngine* pEngine_;
CxkDBMSView::CxkDBMSView()
	: CFormView(CxkDBMSView::IDD)
{
	//{{AFX_DATA_INIT(CxkDBMSView)
	//}}AFX_DATA_INIT
	// TODO: add construction code here
	
}

CxkDBMSView::~CxkDBMSView()
{
}

void CxkDBMSView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CxkDBMSView)
	DDX_Control(pDX, IDC_NEWTABLENAME, m_newtablename);
	DDX_Control(pDX, IDC_CHECK1, m_iskeyword);
	DDX_Control(pDX, IDC_CREATETABLE, m_createtable);
	DDX_Control(pDX, IDC_TAB1, m_tab);
	DDX_Control(pDX, IDC_UPDATERECORD, m_updateRecord);
	DDX_Control(pDX, IDC_ATTRIBUTE, m_attribute);
	DDX_Control(pDX, IDC_INSERTFIELD, m_insertField);
	DDX_Control(pDX, IDC_DELETERECORD, m_deleteRecord);
	DDX_Control(pDX, IDC_INSERTRECORD, m_insertRecord);
	DDX_Control(pDX, IDC_FIELDSET, m_fieldSet);
	DDX_Control(pDX, IDC_FIELD, m_field);
	DDX_Control(pDX, IDC_SQLSTATEMENT, m_sql);
	DDX_Control(pDX, IDC_UPDATETABLE, m_updateTables);
	DDX_Control(pDX, IDC_TABLESET, m_tableset);
	DDX_Control(pDX, IDC_SQLEXEC, m_execSql);
	DDX_Control(pDX, IDC_RECORDLIST, m_recordset);
	//}}AFX_DATA_MAP
}

BOOL CxkDBMSView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	return CFormView::PreCreateWindow(cs);
}

void CxkDBMSView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();
	this->m_tab.InsertItem(0,"记录集");
	this->m_tab.InsertItem(1,"表定义");
	this->m_attribute.InsertString(0,"整数");
	this->m_attribute.InsertString(1,"浮点数");
	this->m_attribute.InsertString(2,"字符串");
	this->m_attribute.InsertString(3,"字符");
	this->m_attribute.SetCurSel(0);
	this->m_fieldSet.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
	this->m_recordset.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
	m_recordset.ShowWindow(SW_SHOW);
	m_recordset.Invalidate(FALSE);
	m_field.ShowWindow(SW_HIDE);
	this->m_field.ShowWindow(SW_HIDE);
	this->m_attribute.ShowWindow(SW_HIDE);
	this->m_insertField.ShowWindow(SW_HIDE);
	this->m_createtable.ShowWindow(SW_HIDE);
	m_iskeyword.ShowWindow(SW_HIDE);
	CStatic* ps_ = (CStatic*)GetDlgItem(IDC_STATIC3);
	ps_->ShowWindow(SW_HIDE);
	ps_ =(CStatic*)GetDlgItem(IDC_STATIC4);
	ps_->ShowWindow(SW_HIDE);
	ps_ =(CStatic*)GetDlgItem(IDC_STATIC5);
	ps_->ShowWindow(SW_HIDE);
	ps_ =(CStatic*)GetDlgItem(IDC_STATIC6);
	ps_->ShowWindow(SW_HIDE);
	m_newtablename.ShowWindow(SW_HIDE);
}

/////////////////////////////////////////////////////////////////////////////
// CxkDBMSView printing

BOOL CxkDBMSView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CxkDBMSView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CxkDBMSView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

void CxkDBMSView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
	// TODO: add customized printing code here
}

/////////////////////////////////////////////////////////////////////////////
// CxkDBMSView diagnostics

#ifdef _DEBUG
void CxkDBMSView::AssertValid() const
{
	CFormView::AssertValid();
}

void CxkDBMSView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

CxkDBMSDoc* CxkDBMSView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CxkDBMSDoc)));
	return (CxkDBMSDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CxkDBMSView message handlers

void CxkDBMSView::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	int i = m_tab.GetCurSel();
	CStatic* ps_ = 0;
	if(i == 0)
	{
		m_recordset.ShowWindow(SW_SHOW);
		m_fieldSet.ShowWindow(SW_HIDE);
		m_field.ShowWindow(SW_HIDE);
		m_attribute.ShowWindow(SW_HIDE);
		m_insertField.ShowWindow(SW_HIDE);
		m_createtable.ShowWindow(SW_HIDE);
		m_newtablename.ShowWindow(SW_HIDE);
		ps_ = (CStatic*)GetDlgItem(IDC_STATIC3);
		ps_->ShowWindow(SW_HIDE);
		ps_ = (CStatic*)GetDlgItem(IDC_STATIC4);
		ps_->ShowWindow(SW_HIDE);
		ps_ = (CStatic*)GetDlgItem(IDC_STATIC5);
		ps_->ShowWindow(SW_HIDE);
		ps_ = (CStatic*)GetDlgItem(IDC_STATIC6);
		ps_->ShowWindow(SW_HIDE);
		m_iskeyword.ShowWindow(SW_HIDE);
		m_insertRecord.ShowWindow(SW_SHOW);
		m_updateRecord.ShowWindow(SW_SHOW);
		m_deleteRecord.ShowWindow(SW_SHOW);
		ShowRecord();
	}
	else
	{
		m_recordset.ShowWindow(SW_HIDE);
		m_fieldSet.ShowWindow(SW_SHOW);
		m_field.ShowWindow(SW_SHOW);
		m_attribute.ShowWindow(SW_SHOW);
		m_insertField.ShowWindow(SW_SHOW);
		m_createtable.ShowWindow(SW_SHOW);
		m_newtablename.ShowWindow(SW_SHOW);
		ps_ = (CStatic*)GetDlgItem(IDC_STATIC3);
		ps_->ShowWindow(SW_SHOW);
		ps_ = (CStatic*)GetDlgItem(IDC_STATIC4);
		ps_->ShowWindow(SW_SHOW);
		ps_ = (CStatic*)GetDlgItem(IDC_STATIC5);
		ps_->ShowWindow(SW_SHOW);
		ps_ = (CStatic*)GetDlgItem(IDC_STATIC6);
		ps_->ShowWindow(SW_SHOW);
		m_iskeyword.ShowWindow(SW_SHOW);
		m_insertRecord.ShowWindow(SW_HIDE);
		m_updateRecord.ShowWindow(SW_HIDE);
		m_deleteRecord.ShowWindow(SW_HIDE);
		InitFieldSet();
		ShowField();
	}
	*pResult = 0;
}

void CxkDBMSView::OnSelchangeAttribute() 
{
	// TODO: Add your control notification handler code here
	int i = m_attribute.GetCurSel();
	switch(i)
	{
		case 0:
			break;
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		default:
			break;

	}
}



void CxkDBMSView::OnClickRecordlist(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	LPNMITEMACTIVATE pos_ = (LPNMITEMACTIVATE) pNMHDR;
	size_t nitem_, nsubitem_;
	nitem_ = pos_->iItem;
	nsubitem_ = pos_->iSubItem;
	CHeaderCtrl* pheader_ = (CHeaderCtrl*)m_recordset.GetDlgItem(0);
	size_t ncolumncount_ = pheader_->GetItemCount();
	size_t nitemcount_ = m_recordset.GetItemCount();
	LV_ITEM item_;
	item_.mask = LVIF_TEXT;
	if(nitemcount_ == 0)
	{
		item_.iItem = 0;
		item_.iSubItem = 0;
		item_.pszText = "";
		m_recordset.InsertItem(&item_);
		for(size_t i = 1; i < ncolumncount_; i++)
		{
			item_.iSubItem = i;
			m_recordset.SetItem(&item_);
		}
	}
	else if(nitem_ >= nitemcount_ || nsubitem_ >= ncolumncount_)
	{
		//当前一行有值时,才新建新一行
		CString s;
		for(size_t ii = 0; ii < ncolumncount_; ii++)
		{
			s = m_recordset.GetItemText(nitemcount_-1, ii);
			if(s == "")
				return;
		}
		item_.iItem = nitemcount_;
		item_.iSubItem = 0;
		item_.pszText = "";
		m_recordset.InsertItem(&item_);
		for(size_t i = 1; i < ncolumncount_; i++)
		{
			item_.iSubItem = i;
			m_recordset.SetItem(&item_);
		}
	}
	
	
	CRect rect_;
	m_recordset.GetSubItemRect(pos_->iItem, pos_->iSubItem, LVIR_BOUNDS, rect_);
	//若是第一列则将矩形长度除以列数
	if(pos_->iSubItem == 0)
	{
		rect_.right = rect_.right / ncolumncount_;
	}
	DWORD style_ = ES_LEFT| WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL;
	CEdit *pedit_ = new CEditCell(&m_recordset, nitem_, nsubitem_, m_recordset.GetItemText(nitem_, nsubitem_));
	pedit_->Create(style_, rect_, &m_recordset, IDC_EDITCELL);
	pedit_->ShowWindow(SW_SHOW);
	*pResult = 0;
}

void CxkDBMSView::OnInsertField() 
{
	// TODO: Add your control notification handler code here
	CString field_ , attr_ , key_;
	m_field.GetWindowText(field_);
	if(field_ == "")
	{	
		AfxMessageBox("请输入字段名!");
		return;
	}

	int i = m_attribute.GetCurSel();
	switch(i) 
	{
		case 0:
			attr_ = _T("整数");
			break;
		case 1:
			attr_ = _T("浮点数");
			break;
		case 2:
			attr_ = _T("字符串");
			break;
		case 3:
			attr_ = _T("字符");
			break;
		default:
			break;
	}
	if(m_iskeyword.GetCheck() == 1)
	{
		key_ = _T("是");
		m_iskeyword.SetCheck(0);
		m_iskeyword.EnableWindow(FALSE);
	}
	else
		key_ = _T("否");
	int itemcount_ = m_fieldSet.GetItemCount();
	LV_ITEM pitem_;
	pitem_.mask = LVIF_TEXT;
	pitem_.iItem = itemcount_;
	pitem_.pszText = field_.GetBuffer(field_.GetLength());
	pitem_.iSubItem = 0;
	m_fieldSet.InsertItem(&pitem_);
	pitem_.pszText = attr_.GetBuffer(attr_.GetLength());
	pitem_.iSubItem = 1;
	m_fieldSet.SetItem(&pitem_);
	pitem_.pszText = key_.GetBuffer(key_.GetLength());
	pitem_.iSubItem = 2;
	m_fieldSet.SetItem(&pitem_);
	m_field.SetWindowText("");
	m_newtablename.SetWindowText("");
}

void CxkDBMSView::InitFieldSet()
{
	unsigned count_ = m_fieldSet.GetHeaderCtrl()->GetItemCount();
	for(unsigned i = 0; i < count_; i++)
	{
		m_fieldSet.DeleteColumn(0);
	}
	count_ = m_fieldSet.GetItemCount();
	for(i = 0; i < count_; i++)
	{
		m_fieldSet.DeleteItem(0);
	}
	m_fieldSet.InsertColumn(0, "字段名", LVCFMT_LEFT, 100);
	m_fieldSet.InsertColumn(1, "字段类型", LVCFMT_LEFT, 100);
	m_fieldSet.InsertColumn(2, "是否关键字", LVCFMT_LEFT, 100);
}

void CxkDBMSView::OnCreatetable() 
{
	// TODO: Add your control notification handler code here
	CString tname_;
	m_newtablename.GetWindowText(tname_);
	if(tname_ == "")
	{
		AfxMessageBox("请输入新建表名!");
		return;
	}
	char* tablename_ = new char[tname_.GetLength() + 1];
	strcpy(tablename_, tname_.GetBuffer(tname_.GetLength()));

	int count_ = m_fieldSet.GetItemCount();
	if(count_ <= 0)
	{
		AfxMessageBox("请输入新建字段!");
		return;
	}
	Vector<char*> fieldname_;
	Vector<int> attrtype_;
	Vector<bool> iskey_;
	CString tmp_;
	for(size_t i = 0; i < count_; i++)
	{
		tmp_ = m_fieldSet.GetItemText(i, 0);
		fieldname_.push_back(new char[tmp_.GetLength() + 1]);
		strcpy(fieldname_[i], tmp_.GetBuffer(tmp_.GetLength()));

		tmp_ = m_fieldSet.GetItemText(i, 1);
		if(tmp_ == _T("整数"))
			attrtype_.push_back(0);
		else if(tmp_ == _T("浮点数"))
			attrtype_.push_back(1);
		else if(tmp_ == _T("字符串"))
			attrtype_.push_back(2);
		else if(tmp_ == _T("字符"))
			attrtype_.push_back(3);

		tmp_ = m_fieldSet.GetItemText(i, 2);
		if(tmp_ == _T("是"))
			iskey_.push_back(true);
		else
			iskey_.push_back(false);
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -