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

📄 dblistview.cpp

📁 ADO查看数据库工具的原码
💻 CPP
字号:
// DBFileListView.cpp : implementation file
//

#include "stdafx.h"
#include "..\DHDBView.h"
#include "DBListView.h"
#include "..\DHDBViewDoc.h"
#include "..\MainFrm.h"
#include "..\BinaryViewDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDBListView

IMPLEMENT_DYNCREATE(CDBListView, CListView)
int CompareInOrder( const void *arg1, const void *arg2 )
{
	return memcmp(((TagPosInFile*)arg1)->strSort,((TagPosInFile*)arg2)->strSort,30);
}

int CompareInReverse( const void *arg1, const void *arg2 )
{
	return memcmp(((TagPosInFile*)arg2)->strSort,((TagPosInFile*)arg1)->strSort,30);
}
CDBListView::CDBListView()
{
	m_bIsFileOpen	= FALSE;
	m_flagOrder		= FALSE;
	m_bBreakFlag	= FALSE;
	m_sizeList		= 0;
	m_sizePage		= 30;
	m_totalPage		= 0;
	m_pageNum		= 0;
	m_arraySort		= NULL;
	m_pRecord		= NULL;
	m_lastCol		= -1;
	m_bOpenFile = false;
}

CDBListView::~CDBListView()
{
	CloseFile();
	if(m_arraySort!=NULL) 
	{
		delete m_arraySort;	
		m_arraySort = NULL;
	}
	if(m_pRecord!=NULL)
	{
		delete m_pRecord;
		m_pRecord = NULL;
	}
}


BEGIN_MESSAGE_MAP(CDBListView, CListView)
	//{{AFX_MSG_MAP(CDBListView)
	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
	ON_COMMAND(ID_SHOW_NEXT_PAGE, OnShowNextPage)
	ON_COMMAND(ID_SHOW_PREV_PAGE, OnShowPrevPage)
	ON_COMMAND(ID_TABLE_OPEN_FILE, OnTableOpenFile)
	ON_COMMAND(ID_TABLE_OPEN_SAVE, OnTableOpenSave)
	ON_COMMAND(ID_SHOW_START_PAGE, OnShowStartPage)
	ON_COMMAND(ID_SHOW_END_PAGE, OnShowEndPage)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDBListView drawing

void CDBListView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CDBListView diagnostics

#ifdef _DEBUG
void CDBListView::AssertValid() const
{
	CListView::AssertValid();
}

void CDBListView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDBListView message handlers
int CDBListView::DisplayFirstPage()
{
	if(m_bBreakFlag)
	{
		Reset();
		return 0;
	}
	OpenFile();
	m_pageNum = 0;
	BOOL bDisplayFinsh = DisplayCurPage();
	return bDisplayFinsh;
}

int CDBListView::DisplayNextPage()
{
	if((m_pageNum+1)>=m_totalPage) return -1;
	m_pageNum++;
	BOOL bDisplayFinsh = DisplayCurPage();
	return bDisplayFinsh;
}

int CDBListView::DisplayPrevPage()
{
	if((m_pageNum-1)<0) return -1;
	m_pageNum--;
	BOOL bDisplayFinsh = DisplayCurPage();
	return bDisplayFinsh;
}

int CDBListView::GetPageSize()
{
	return m_sizePage;
}

int CDBListView::GetTotalPage()
{
	return m_totalPage;
}

int CDBListView::GetCurPage()
{
	return m_pageNum;
}

void CDBListView::SetPageSize(int nPageSize)
{
	m_sizePage	= nPageSize;
	m_totalPage = (m_sizeList%m_sizePage)?(m_sizeList/m_sizePage+1):(m_sizeList/m_sizePage);
}

BOOL CDBListView::DisplayCurPage()
{
	GetListCtrl( ).DeleteAllItems();
	if(m_sizeList==0) return -1;
	if(m_bBreakFlag) return -1;
	ASSERT(m_pageNum<m_totalPage);
	
	BOOL bIsNotBreak = TRUE;
#ifdef _PROG_DLG
	CProgressDlg *pDlg=new CProgressDlg();
	pDlg->Create(this);
	pDlg->ShowWindow(SW_SHOW);
#endif
	CString tmpStr;
	tmpStr.Format("正在准备第%d页,请稍候....",m_pageNum+1);

#ifdef _PROG_DLG
	pDlg->SetPromptText(tmpStr.GetBuffer(0));
	pDlg->SetRange(0,m_sizePage);
	pDlg->SetStep(1);
#endif

	CString info;
	int pos = m_pageNum*m_sizePage;
	for(int i=0;i<m_sizePage;++i)
	{
		if(pos>=m_sizeList) break;
		m_fileSource.GetRecord(m_arraySort[pos].nOldIndex);
		for(int j=0;j<m_sizeCol;j++) 
		{
			info = info + m_fileSource.GetFieldData(j);
			info = info + " | ";
		}
		AddItem(info.GetBuffer(0),i,pos);
		info.Empty();
		pos++;

#ifdef _PROG_DLG
		pDlg->StepIt();
#endif


		MSG msg;
		if (PeekMessage(&msg,0,0,0,PM_REMOVE)) 
		{
			::TranslateMessage(&msg);
			::DispatchMessage(&msg);
		};

#ifdef _PROG_DLG
		//非正常结束
		if(pDlg->CheckCancelButton()) 
		{
			bIsNotBreak = FALSE;
			break;
		}
#endif
	}
#ifdef _PROG_DLG	
	pDlg->DestroyWindow();
	delete pDlg;
#endif
	return bIsNotBreak;
}


BOOL CDBListView::IsFileOpen()
{
	return m_bIsFileOpen;
}

int CDBListView::AddHead(char *item)
{
	char *pTok;
	CListCtrl& listCtrl = GetListCtrl( );
	listCtrl.DeleteAllItems();

	while(listCtrl.DeleteColumn(0)) ;

	int i ;
	i = 0;
	pTok=strtok(item,"|");
	while(pTok) {
		i++;
		listCtrl.InsertColumn(i,pTok,LVCFMT_LEFT,strlen(pTok)*10);
		pTok=strtok(NULL,"|");
		if (pTok ==NULL) break;
	}
	return 0;
}

int CDBListView::AddItem(char *item,int line,int pos)
{
	CListCtrl& listCtrl = GetListCtrl( );
	char *pTok;
	int i = 0;
	pTok=strtok(item,"|");
	listCtrl.InsertItem(line,pTok);
	i++;
	CString tmp;
	while(pTok) {
		pTok=strtok(NULL,"|");
		if (pTok ==NULL) break;
		tmp = pTok;
		tmp.TrimRight();
		listCtrl.SetItemText(line,i,tmp);
		tmp.Empty();
		i++;
	}
	listCtrl.SetItemData(line, pos);
	return 0;
}

void CDBListView::Reset()
{
	m_sizeList		= 0;
	m_totalPage		= 0;
	m_pageNum		= 0;
}

int CDBListView::OpenFile()
{
	int i = 0;
	//打开文件
	int flag = m_fileSource.Open(CDBFileExt::DB_MODE_READ);
	if(flag==-1) 
	{
		AfxMessageBox("打开文件失败!");
		return -1;
	}
	m_bIsFileOpen = TRUE;

	//设置属性
	Reset();
	m_sizeList = m_fileSource.GetCount();
	if(m_sizeList==0) return -2;
	m_totalPage = (m_sizeList%m_sizePage)?(m_sizeList/m_sizePage+1):(m_sizeList/m_sizePage);
	m_sizeCol = m_fileSource.GetFieldNum();

	//分配记录数组
	if(m_pRecord!=NULL)	
	{
		delete m_pRecord;
		m_pRecord = NULL;
	}
	m_pRecord = new int[m_sizeCol];
	for(i=0;i<m_sizeCol;++i)
		m_pRecord[i] = 0;
	
	//分配排序数组
	if(m_arraySort!=NULL) 
	{
		delete m_arraySort;
		m_arraySort = NULL;
	}
	m_arraySort = new TagPosInFile[m_sizeList];

	//初始化排序数组
	InitArraySort();
		
	//表头设置
	CString info;
	for(i=0;i<m_sizeCol;i++)
	{
		 info = info + m_fileSource.GetFieldName(i);
		 info = info + " |";
	}
	AddHead(info.GetBuffer(0));
	info.Empty();

	return 0;
}

int CDBListView::CloseFile()
{
	if(m_bIsFileOpen) m_fileSource.Close();
	m_bIsFileOpen = FALSE;
	return 0;
}

void CDBListView::InitArraySort()
{
	ASSERT(m_arraySort!=NULL);
#ifdef _PROG_DLG
	CProgressDlg *pDlg=new CProgressDlg();
	pDlg->Create(this);
	pDlg->ShowWindow(SW_SHOW);
#endif
	CString tmpStr;
	tmpStr.Format("正在准备数据,请稍候....");

#ifdef _PROG_DLG
	pDlg->SetPromptText(tmpStr.GetBuffer(0));
	pDlg->SetRange(0,100);
	pDlg->SetStep(1);
#endif
	int nCounter = 0;


	for(int i=0;i<m_sizeList;++i) 
	{
		m_arraySort[i].nOldIndex = i;
		int size = sizeof(m_arraySort->strSort);
		memset(m_arraySort[i].strSort,0,size);

		if(nCounter>=m_sizeList/100)
		{
#ifdef _PROG_DLG
			pDlg->StepIt();
#endif
			nCounter = 0;
		}
		else
			nCounter++;
	}
#ifdef _PROG_DLG
	pDlg->DestroyWindow();
	delete pDlg;
#endif
}

void CDBListView::SetArraySort(int nCol)
{//三种情况按顺序:1与上次相同,2曾经有过,3第一次
	//1
	if(m_lastCol==nCol)
		return;
	//2
//	if(m_pRecord[nCol]==1)
//	{
//		return;
//	}
	//3
#ifdef _PROG_DLG
	CProgressDlg *pDlg=new CProgressDlg();
	pDlg->Create(this);
	pDlg->ShowWindow(SW_SHOW);
#endif
	CString tmpStr;
	tmpStr.Format("正在准备数据,请稍候....");

#ifdef _PROG_DLG
	pDlg->SetPromptText(tmpStr.GetBuffer(0));
	pDlg->SetRange(0,100);
	pDlg->SetStep(1);
#endif

	int nCounter = 0;
	int size = 0;
	for(int i=0;i<m_sizeList;i++) 
	{
		m_fileSource.GetRecord(i);
		m_arraySort[i].nOldIndex = i;
		m_fileSource.GetFieldDataBin(nCol,&size);
		memset(m_arraySort[i].strSort,0,sizeof(m_arraySort[i].strSort));
		memcpy(m_arraySort[i].strSort,m_fileSource.GetFieldData(nCol),size);

		if(nCounter>=m_sizeList/100)
		{
#ifdef _PROG_DLG
			pDlg->StepIt();
#endif
			nCounter = 0;
		}
		else
			nCounter++;
	}
#ifdef _PROG_DLG
	pDlg->DestroyWindow();
	delete pDlg;
#endif

}

void CDBListView::SetBreakFlag(BOOL bFlag)
{
	m_bBreakFlag = bFlag;
}

int CDBListView::GetSizeList()
{
	return m_sizeList;
}

int CDBListView::GetColNum()
{
	return m_sizeCol;
}

void CDBListView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	if(m_bOpenFile)
	{
		int k = m_fileSource.GetFieldType(pNMListView->iSubItem);
		if(m_fileSource.GetFieldType(pNMListView->iSubItem)!=DBVT_BINARY)
		{
			RECORD_BEGIN_TIME
			//没有内容返回
			if(m_sizeList==0) return;
			//交换正反排序
			if(m_flagOrder==FALSE) m_flagOrder = TRUE;
			else 
				m_flagOrder = FALSE;

			RECORD_END_TIME
			LOG_PAST_TIME("准备时间")

			//设置排序数组
			SetArraySort(pNMListView->iSubItem);

			//记录记录数组
			m_pRecord[pNMListView->iSubItem] = 1;

			RECORD_END_TIME
			LOG_PAST_TIME("准备排序数组时间")
			
			//排序数组
			if(m_flagOrder)
				qsort((void*)m_arraySort,m_sizeList,sizeof(TagPosInFile),CompareInOrder);
			else
				qsort((void*)m_arraySort,m_sizeList,sizeof(TagPosInFile),CompareInReverse);

			RECORD_END_TIME
			LOG_PAST_TIME("排序时间")

			//显示第一页
			m_pageNum = 0;
			DisplayCurPage();

			RECORD_END_TIME
			LOG_PAST_TIME("显示时间")

			m_lastCol = pNMListView->iSubItem;
		}
		else
		{
			POSITION pos;
			pos = GetListCtrl().GetFirstSelectedItemPosition();
			if(pos == NULL)
				 return;
			int nItem = GetListCtrl().GetNextSelectedItem(pos);
			int nIndex = GetListCtrl().GetItemData(nItem);
			m_fileSource.GetRecord(nIndex);
			int len;
			BYTE* binData;
			m_fileSource.GetFieldDataBin(pNMListView->iSubItem,&len);
			binData = new BYTE[len];
			memcpy(binData, m_fileSource.GetFieldDataBin(pNMListView->iSubItem,&len), len);
			CBinaryViewDlg dlg;
			dlg.SetBinary((LPBYTE)binData,len);
			dlg.DoModal();
			delete []binData;
		}
	}
	else
	{
		m_ListBind.OnColumnclick(pNMListView->iSubItem);
	}
	((CDHDBViewDoc*)GetDocument())->m_strCmd = m_ListBind.GetCmd();
	GetDocument()->UpdateAllViews (this, 0x8A, NULL);
	*pResult = 0;
}

void CDBListView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{	
	m_ListBind.SetPageSize(((CDHDBViewDoc*)GetDocument())->m_nPageNum);
	m_sizePage = ((CDHDBViewDoc*)GetDocument())->m_nPageNum;
	if (lHint == 0x7A) 
	{
		GetListCtrl().DeleteAllItems();
		ReflashList();
		((CDHDBViewDoc*)GetDocument())->m_strCmd = m_ListBind.GetCmd();
		GetDocument()->UpdateAllViews (this, 0x8A, NULL);
		return;
	}
	if (lHint == 0x7B) 
	{
		CString strCmd;
		strCmd.Format("SELECT TOP 1 * FROM %s",((CDHDBViewDoc*)GetDocument())->m_strTableName);
		GetListCtrl().DeleteAllItems();
		ReflashList(strCmd);
		((CDHDBViewDoc*)GetDocument())->m_strCmd = m_ListBind.GetCmd();
		GetDocument()->UpdateAllViews (this, 0x8A, NULL);
		return;
	}
	if (lHint == 0x7C) 
	{
		CString strCmd;
		strCmd.Format("%s",((CDHDBViewDoc*)GetDocument())->m_strCmd);
		GetListCtrl().DeleteAllItems();
		ReflashList(strCmd);
		GetDocument()->UpdateAllViews (this, 0x8A, NULL);
		return;
	}
	if (lHint == 0x5A) 
	{
		GetListCtrl().SetExtendedStyle(LVS_EX_FULLROWSELECT);
		GetListCtrl().DeleteAllItems();
		while(GetListCtrl().DeleteColumn(0));
		((CMainFrame*)::AfxGetMainWnd())->SetPromatText("");
		return;
	}
}

BOOL CDBListView::ReflashList(CString strCmd)
{
	m_bOpenFile = false;
	m_ListBind.BindListToTable(((CDHDBViewDoc*)GetDocument())->m_strCon,strCmd, ((CDHDBViewDoc*)GetDocument())->m_strTableName, &GetListCtrl());
	CString strPromat;
	strPromat.Format("%s表 共%d页 当前显示第%d页", m_ListBind.GetTableName(), m_ListBind.GetTotalPage(), m_ListBind.GetCurPage());
	((CMainFrame*)::AfxGetMainWnd())->SetPromatText(strPromat);
	return TRUE;
}

BOOL CDBListView::PreCreateWindow(CREATESTRUCT& cs) 
{
	// TODO: Add your specialized code here and/or call the base class
	cs.style = cs.style|LVS_REPORT|LVS_SINGLESEL;
	return CListView::PreCreateWindow(cs);
}

void CDBListView::OnShowNextPage() 
{
	CString strPromat;
	strPromat = "数据未加载!";
	if(m_bOpenFile)
	{
		DisplayNextPage();
		strPromat.Format("文件%s包含数据", m_strFileName);
	}
	else
	{
		m_ListBind.NextPage();
		if(!(m_ListBind.GetTableName().IsEmpty()))
		{
			strPromat.Format("%s表 共%d页 当前显示第%d页", m_ListBind.GetTableName(), m_ListBind.GetTotalPage(), m_ListBind.GetCurPage());
		}
	}
	((CMainFrame*)::AfxGetMainWnd())->SetPromatText(strPromat);
}

void CDBListView::OnShowPrevPage() 
{
	CString strPromat;
	strPromat = "数据未加载!";
	if(m_bOpenFile)
	{
		DisplayPrevPage();
		strPromat.Format("文件%s包含数据", m_strFileName);
	}
	else
	{
		m_ListBind.PrevPage();
		if(!(m_ListBind.GetTableName().IsEmpty()))
		{
			strPromat.Format("%s表 共%d页 当前显示第%d页", m_ListBind.GetTableName(), m_ListBind.GetTotalPage(), m_ListBind.GetCurPage());
		}
	}
	((CMainFrame*)::AfxGetMainWnd())->SetPromatText(strPromat);
}

void CDBListView::OnTableOpenFile() 
{
	m_sizePage = ((CDHDBViewDoc*)GetDocument())->m_nPageNum;
	GetListCtrl().SetExtendedStyle(LVS_EX_FULLROWSELECT);
	char szFilter[] ="Data Files (*.dat)|*.dat|All Files (*.*)|*.*||";
	CFileDialog  dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
	if(dlg.DoModal()!=IDOK) return ;
	CString stPathName;
	stPathName=dlg.GetPathName();
	CDBFileExt dbf;
	dbf.SetFilePath(stPathName.GetBuffer(0));
	
	SetFileName(stPathName.GetBuffer(0));
	DisplayFirstPage();
	m_bOpenFile = true;
	m_strFileName = stPathName;
	m_ListBind.Reset();
	CString strPromat;
	strPromat.Format("文件%s包含数据", stPathName);
	((CMainFrame*)::AfxGetMainWnd())->SetPromatText(strPromat);
}

void CDBListView::OnTableOpenSave() 
{
	m_ListBind.SaveTOFile();
}

void CDBListView::OnShowStartPage() 
{
	CString strPromat;
	strPromat = "数据未加载!";
	if(m_bOpenFile)
	{
		DisplayFirstPage();
		strPromat.Format("文件%s包含数据", m_strFileName);
	}
	else
	{
		m_ListBind.StartPage();
		if(!(m_ListBind.GetTableName().IsEmpty()))
		{
			strPromat.Format("%s表 共%d页 当前显示第%d页", m_ListBind.GetTableName(), m_ListBind.GetTotalPage(), m_ListBind.GetCurPage());
		}
	}
	((CMainFrame*)::AfxGetMainWnd())->SetPromatText(strPromat);
}

void CDBListView::OnShowEndPage() 
{
	CString strPromat;
	strPromat = "数据未加载!";
	if(m_bOpenFile)
	{
		strPromat.Format("文件%s包含数据", m_strFileName);
	}
	else
	{
		m_ListBind.EndPage();	
		if(!(m_ListBind.GetTableName().IsEmpty()))
		{
			strPromat.Format("%s表 共%d页 当前显示第%d页", m_ListBind.GetTableName(), m_ListBind.GetTotalPage(), m_ListBind.GetCurPage());
		}
	}
	((CMainFrame*)::AfxGetMainWnd())->SetPromatText(strPromat);
}


⌨️ 快捷键说明

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