📄 xkdbmsview.cpp
字号:
// 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 + -