📄 dblistview.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 + -