📄 databaseview.cpp
字号:
// dataBaseView.cpp : implementation of the CDataBaseView class
//
#include "StdAfx.h"
#include "dataBase.h"
#include "dataBaseDoc.h"
#include "dataBaseView.h"
#include "FindDlg.h"
#include "TableInsert.h"
#include "RebuildDlg.h"
#include "Dlg1.h"
#include <fstream.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDataBaseView
IMPLEMENT_DYNCREATE(CDataBaseView, CView)
BEGIN_MESSAGE_MAP(CDataBaseView, CView)
//{{AFX_MSG_MAP(CDataBaseView)
ON_WM_CREATE()
ON_WM_CHAR()
ON_COMMAND(ID_COMPLIER_FILE, OnComplierFile)
ON_COMMAND(ID_READ_INDEX, OnReadIndex)
ON_COMMAND(ID_READ_TABLE, OnReadTable)
ON_COMMAND(ID_FIND, OnFind)
ON_COMMAND(IDR_READ_CIDIAN, OnReadCidian)
ON_COMMAND(ID_DEL, OnDel)
ON_COMMAND(ID_ALTER, OnAlter)
ON_COMMAND(ID_SHOW, OnShow)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDataBaseView construction/destruction
CDataBaseView::CDataBaseView()
{
// TODO: add construction code here
m_ptCaret.x=0;
m_ptCaret.y=0;
m_sTemp = "";
}
CDataBaseView::~CDataBaseView()
{
}
BOOL CDataBaseView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDataBaseView drawing
void CDataBaseView::OnDraw(CDC* pDC)
{
CDataBaseDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CDataBaseView printing
BOOL CDataBaseView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CDataBaseView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CDataBaseView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CDataBaseView diagnostics
#ifdef _DEBUG
void CDataBaseView::AssertValid() const
{
CView::AssertValid();
}
void CDataBaseView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDataBaseDoc* CDataBaseView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDataBaseDoc)));
return (CDataBaseDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDataBaseView message handlers
int CDataBaseView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
TEXTMETRIC tm;
CClientDC dc(this);
dc.TextOut(0,0,">",1);
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/ 8,tm.tmHeight);
ShowCaret();
CSize sz;
sz = dc.GetTextExtent(">",1);
POINT pt;
pt.y=sz.cy;
pt.x=sz.cx;
m_ptCaret.x=pt.x;
m_ptCaret.y=pt.y;
SetCaretPos(pt);
return 0;
}
void CDataBaseView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CSize sz;
CClientDC dc(this);
sz = dc.GetTextExtent(">",1);
POINT caretStartPoint;
caretStartPoint.x = sz.cx;
caretStartPoint.y = m_ptCaret.y;
if(0xd == nChar)
{
m_anylise.SetString(m_sTemp);
m_anylise.go();
m_sTemp.Empty();
caretStartPoint.x = sz.cx;
caretStartPoint.y += sz.cy;
m_ptCaret.x = caretStartPoint.x;
m_ptCaret.y = caretStartPoint.y;
}
else if('\b' == nChar)
{
if(m_ptCaret.x != sz.cx)
{
dc.SetTextColor(RGB(255,255,255));
dc.TextOut(caretStartPoint.x,caretStartPoint.y,m_sTemp);
dc.SetTextColor(RGB(255,0,255));
m_sTemp = m_sTemp.Left(m_sTemp.GetLength() - 1);
}
}
else
{
m_sTemp += (char)nChar;
}
if(m_sTemp != "")
dc.TextOut(caretStartPoint.x,caretStartPoint.y,m_sTemp);
else
{
m_sTemp = ">";
dc.TextOut(0,caretStartPoint.y,m_sTemp);
m_sTemp.Empty();
}
sz = dc.GetTextExtent(m_sTemp);
m_ptCaret.x = caretStartPoint.x + sz.cx;
m_ptCaret.y = caretStartPoint.y;
SetCaretPos(m_ptCaret);
CView::OnChar(nChar, nRepCnt, nFlags);
}
void CDataBaseView::OnComplierFile()
{
// TODO: Add your command handler code here
CFileDialog fileDlg(true);
ifstream file;
char readBuff[150];
CClientDC dc(this);
CPoint point;
CSize sz = dc.GetTextExtent("*******");
CMyAnylise anylse;
if(fileDlg.DoModal() == IDOK)
{
file.open(fileDlg.GetPathName());
char ctemp;
while(file.read(&ctemp,1) != 0)
{
m_sTemp.Empty();
memset(readBuff,0,150);
file.seekg(file.tellg() - 1);
file.getline(readBuff,150);
m_sTemp = readBuff;
if(m_sTemp != "")
{
anylse.SetString(m_sTemp);
anylse.go();
m_ptCaret.x += sz.cx;
anylse.ComplingOutPut(m_ptCaret,m_sTemp);
m_ptCaret.x -= sz.cx;
}
}
CRect rect;
GetClientRect(&rect);
dc.TextOut(0, rect.Height() - 20, "Compling is end!");
m_sTemp.Empty();
m_ptCaret.y += sz.cy;
m_ptCaret.x = sz.cx;
point.x = sz.cx;
point.y = m_ptCaret.y;
SetCaretPos(point);
ShowCaret();
}
}
void CDataBaseView::OnReadIndex()
{
// TODO: Add your command handler code here
CDBControl cdb;
IndexForCiDian index;
cdb.ReadFromIndex();
}
void CDataBaseView::OnFind()
{
// TODO: Add your command handler code here
CFindDlg dlg;
if(IDOK == dlg.DoModal())
{
int i = 0;
IndexForCiDian index;
CDBControl control;
CString str;
char temp[10];///用于存储类型名称
memset(temp, 0, 10);
strcpy(index.name, dlg.m_str);
switch(dlg.m_type)
{
case TABLE:index.indexType = TABLE;strcpy(temp, "TABLE");break;
case VIEW: index.indexType = VIEW;strcpy(temp, "VIEW");break;
case INDEX:index.indexType = INDEX;strcpy(temp, "INDEX");break;
}
switch(dlg.m_findType)
{
case 0:
{
IndexForCiDian index;
memset(&index, 0, sizeof(IndexForCiDian));
if(control.ReadFromIndex(atoi(dlg.m_str), index))
{
str.Empty();
str.Format("type = %s, name = %s, len = %ld, startOffset = %ld", temp, index.name, index.item_len,
index.startOffset);
}
else
{
str.Empty();
str.Format("标号%s越界! ", dlg.m_str);
}
break;
}
case 1:
{
if(control.findInIndexFile(index) != -1){
str.Empty();
str.Format("type = %s, name = %s, len = %ld, startOffset = %ld", temp, index.name, index.item_len,
index.startOffset);
}
else
{
str.Empty();
str.Format("%s不在索引表中! ", index.name);
}
break;
}
default:
MessageBox("系统错误!");
break;
}
MessageBox(str);
}
}
void CDataBaseView::OnReadCidian()
{
// TODO: Add your command handler code here
CDBControl db;
int i = 0, j = 0;
Data data;
memset(&data, 0, sizeof(Data));
CString str, temp;
while(db.ReadFromCiDian(i, data))
{
str.Format("name = %s,", data.name);
for(j = 0; j < data.pDataArray_len; j++)
{
str += "( 属性 ";
str += data.pDataArray[j].name;
switch(data.pDataArray[j].type)
{
case 0:temp = "INTEGER";break;//int
case 2:temp.Format("CHAR(%d)", data.pDataArray[j].len);break;//char
}
str += " 类型 ";
str += temp;
str += ");";
temp.Empty();
}
AfxMessageBox(str);
str.Empty();
delete [] data.pDataArray;
memset(&data, 0, sizeof(Data));
i++;
}
}
////////afasfafafasf
void CDataBaseView::OnReadTable()
{
// TODO: Add your command handler code here
CDlg1 dlg;
CString strTemp;
if(IDOK == dlg.DoModal())
{
strTemp = dlg.m_str;
if(strTemp.IsEmpty()){
AfxMessageBox("表名为空!");
return;
}else if(strTemp.Find(".tab",0) == -1)
strTemp += ".tab";
}
ifstream file;
file.open(strTemp);
Data data;
memset(&data, 0, sizeof(Data));
char countBuff[10];
char buff[100];
memset(buff, 0, 100);
memset(countBuff, 0, 10);
file.read(countBuff, 10);
file.read(buff, 1);
// file.read(data.name, NAME_LEN);
char ch[2];
memset(ch, 0, 2);
int count = atoi(countBuff);
char a[10][ITEM_LEN + 1];//此语句限定程序只能处理最大10个属性
memset(a, 0, 10 * ITEM_LEN + 1);
int i;
CString str;
while(file.read(buff, 1))
{
str.Empty();
file.seekg(-1, ios::cur);
int offset = file.tellg();
file.read(data.name, NAME_LEN);
offset = file.tellg();
str.Format("表名:%s, 属性数据: ", data.name);
i = 0;
for(i = 0; i < count; i++)
{
file.getline(a[i], ITEM_LEN + 2, ';');//数据项最大ITEM_LEN但为了能读到‘;’所以加长一个单位,加长一个结束符。
offset = file.tellg();
str += a[i];
str += "; ";
}
if(data.name[0] != 0)//如果是空数据则不显示。
{
AfxMessageBox(str);
}
file.read(buff, 1);//读取回车
}
file.close();
}
//////////////////////////
void CDataBaseView::OnDel()
{
// TODO: Add your command handler code here
CTableInsert table;
ifstream file;
file.open("T.tab");
char countBuff[10];
char buff[100];
memset(buff, 0, 100);
memset(countBuff, 0, 10);
file.read(countBuff, 10);
file.read(buff, 1);
file.close();
// file.read(data.name, NAME_LEN);
char ch[2];
memset(ch, 0, 2);
int count = atoi(countBuff);
fstream ff;
if(IDOK == table.DoModal())
{
ff.open("T.tab", ios::in | ios::out);
ff.seekg(10 + 2, ios::beg);//跳过表头信息;
int off = ff.tellg();
ff.seekg(ff.tellg() + table.m_index * ((NAME_LEN + (ITEM_LEN + 1) * count ) + 2), ios::beg);
off = ff.tellg();
long len = NAME_LEN + (ITEM_LEN + 1) * count;
memset(buff, 0, 200);
off = ff.tellg();
ff.write(buff, NAME_LEN);
int i = 0;
i= 0;
for(i = 0; i < count; i++)
{
ff.write(buff, ITEM_LEN );
ff.write(";", 1);
}
off = ff.tellg();
if(ff.fail())
{
AfxMessageBox("删除操作失败!");
}
else
AfxMessageBox("删除操作成功!");
ff<<endl;
}
ff.close();
}
void CDataBaseView::OnAlter()
{
// TODO: Add your command handler code here
ifstream file;
file.open("T.tab");
Data data;
memset(&data, 0, sizeof(Data));
char countBuff[10];
char buff[100];
memset(buff, 0, 100);
memset(countBuff, 0, 10);
file.read(countBuff, 10);
file.read(buff, 1);
// file.read(data.name, NAME_LEN);
char ch[2];
memset(ch, 0, 2);
int count = atoi(countBuff);
char a[10][ITEM_LEN + 1];//此语句限定程序只能处理最大10个属性
memset(a, 0, 10 * ITEM_LEN + 1);
//char (*a)[count] = new char[NAME_LEN][count];
int i;
CString str;
while(file.read(buff, 1))
{
str.Empty();
file.seekg(-1, ios::cur);
int offset = file.tellg();
file.read(data.name, NAME_LEN);
offset = file.tellg();
str.Format("表名:%s, 属性数据: ", data.name);
i = 0;
for(i = 0; i < count; i++)
{
file.getline(a[i], ITEM_LEN + 2, ';');//数据项最大ITEM_LEN但为了能读到‘;’所以加长一个单位,加长一个结束符。
offset = file.tellg();
str += a[i];
str += "; ";
}
CRebuildDlg dlg;
dlg.DoModal();
if(data.name[0] != 0)//如果是空数据则不显示。
{
AfxMessageBox("空项!");
}
else
{
}
file.read(buff, 1);//读取回车
}
file.close();
}
void CDataBaseView::OnShow(CString str, Word word[], int len)
{
// TODO: Add your command handler code here
char temp[20];
strcpy(temp, "display ");
strcat(temp, word[3].name);
WinExec(temp, SW_SHOW);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -