📄 data_transdlg.cpp
字号:
// Data_TransDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Data_Trans.h"
#include "Data_TransDlg.h"
#include "VirtualInfoFile.h"
//#include "resource.h"
#include "Step11.h"
#include "Step22.h"
#include "Step33.h"
#include "Set3Database.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CData_TransDlg dialog
CData_TransDlg::CData_TransDlg(CWnd* pParent /*=NULL*/)
: CDialog(CData_TransDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CData_TransDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
pPageLink=NULL;
nPageCount=0;
nCurrentPage=0;
m_Type = 1;
m_pDBSave = NULL;
m_RemoveFirst = false; //
m_bFinish = false;
m_timer = NULL;
m_databaseType = -1;
}
void CData_TransDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CData_TransDlg)
DDX_Control(pDX, IDC_PROGRESS1, m_ctrlprocess);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CData_TransDlg, CDialog)
//{{AFX_MSG_MAP(CData_TransDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_PREV, OnPrev)
ON_BN_CLICKED(IDC_NEXT, OnNext)
ON_BN_CLICKED(IDC_FINISH, OnFinish)
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_CANCEL, OnCancel)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CData_TransDlg message handlers
BOOL CData_TransDlg::OnInitDialog()
{
SetWindowText(_T("生成MDB数据库"));
CDialog::OnInitDialog();
{ //初始化开始时间和结束时间
CString strstartTime("2002-2-2 2:2:2");
CString strendTime("2004-2-2 2:2:2");
m_startTime = COleDateTime(2002,2,2,2,2,2) ;
m_endTime = COleDateTime(2006,2,2,2,2,2) ;
m_iDesOrder = 0; //默认的是降序
m_iType = -1;
// m_startTime.ParseDateTime (strstartTime,LOCALE_NOUSEROVERRIDE);
// m_endTime.ParseDateTime (strendTime,LOCALE_NOUSEROVERRIDE);
}
//获得每页显示的范围
CRect Rect1;
GetWindowRect(&Rect1); //获得主窗口的位置
int nCaption = ::GetSystemMetrics(SM_CYCAPTION);
int nXEdge = ::GetSystemMetrics(SM_CXEDGE);
int nYEdge = ::GetSystemMetrics(SM_CYEDGE);
CRect Rect2;
GetDlgItem(IDC_POS)->GetWindowRect(&Rect2); //获得框架的位置
Rect1.top=Rect1.top+nCaption+nYEdge; //相对坐标
Rect1.left=Rect1.left+2*nXEdge;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&m_DrawRect); //获得框架的位置
//计算机位置
rectPage.top=Rect2.top-Rect1.top;
rectPage.left=Rect2.left-Rect1.left;
rectPage.bottom=Rect2.bottom-Rect1.top;
rectPage.right=Rect2.right-Rect1.left;
//添加要显示的页
CStep11* pStep1 = new CStep11(this);
CStep22* pStep2 = new CStep22(this);
CStep33* pStep3 = new CStep33(this);
CSet3Database* pStep4 = new CSet3Database(this);
AddPage(pStep1, IDD_STEP1);
AddPage(pStep2, IDD_STEP2);
AddPage(pStep3, IDD_STEP3);
AddPage(pStep4, IDD_SET3DATABASE_DIALOG);
//显示第一页
ShowPage(4);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CData_TransDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CData_TransDlg::SetWizButton(UINT uFlag)
{
GetDlgItem(IDC_CANCEL)->EnableWindow(TRUE);
GetDlgItem(IDC_PREV)->EnableWindow(TRUE);
GetDlgItem(IDC_NEXT)->EnableWindow(TRUE);
GetDlgItem(IDC_FINISH)->EnableWindow(TRUE);
m_bFinish = false;
switch(uFlag)
{
case 0: //第一步
GetDlgItem(IDC_PREV)->EnableWindow(FALSE);
GetDlgItem(IDC_FINISH)->EnableWindow(FALSE);
break;
case 1: //中间步,隐藏向下一步
GetDlgItem(IDC_FINISH)->EnableWindow(FALSE);
GetDlgItem(IDC_NEXT)->EnableWindow(FALSE);
break;
case 3: //中间步,允许向下一步
GetDlgItem(IDC_FINISH)->EnableWindow(FALSE);
break;
case 2://最后一步
GetDlgItem(IDC_NEXT)->EnableWindow(FALSE);
GetDlgItem(IDC_FINISH)->EnableWindow(FALSE);
break;
case 4: //开始的时候
GetDlgItem(IDC_PREV)->EnableWindow(FALSE);
GetDlgItem(IDC_NEXT)->EnableWindow(FALSE);
GetDlgItem(IDC_FINISH)->EnableWindow(FALSE);
break;
case 5:
m_bFinish = true;
GetDlgItem(IDC_NEXT)->EnableWindow(FALSE);
break;
default:
break;
}
}
void CData_TransDlg::OnPaint()
{
CPaintDC dc(this);
CBitmap BmpBack,*pOldBack;
BmpBack.LoadBitmap(IDB_BITMAP1);
CDC dcBack;
dcBack.CreateCompatibleDC(&dc);
pOldBack=dcBack.SelectObject(&BmpBack);
dc.BitBlt(m_DrawRect.left-5,m_DrawRect.top-21,m_DrawRect.Width(),m_DrawRect.Height(),&dcBack,0,0,SRCCOPY);
// DrawTransparentBitmap(&dc,IDB_BITMAPA,CRect(0,0,48,48),RGB(192,192,0));
dcBack.SelectObject(pOldBack);
if(m_ctrlprocess.m_hWnd != NULL)
{
if (!m_bFinish)
m_ctrlprocess.ShowWindow(FALSE);
else
m_ctrlprocess.ShowWindow(TRUE);
}
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
void CData_TransDlg::ShowPage(UINT nPos)
{
struct PAGELINK* pTemp=pPageLink;
while(pTemp)
{
if (pTemp->nNum==nPos)
{
pTemp->pDialog->ShowWindow(SW_SHOW);
}
else
//不显示
pTemp->pDialog->ShowWindow(SW_HIDE);
pTemp=pTemp->Next;
}
if (nPos>=nPageCount) //最后一页
{
nCurrentPage=nPageCount;
SetWizButton(2);
return;
}
if (nPos<=1) //首页
{
nCurrentPage=1;
SetWizButton(4);
return;
}
//中间步
SetWizButton(1);
}
void CData_TransDlg::AddPage(CDialog* pDialog, UINT nID)
{
struct PAGELINK* pTemp = pPageLink;
//插入新生成的结点
struct PAGELINK* pNewPage = new PAGELINK;
pNewPage->pDialog = pDialog;
pNewPage->pDialog->Create(nID,this);
// Is window created
ASSERT(::IsWindow(pNewPage->pDialog->m_hWnd));
// 检查每页的样式
DWORD dwStyle = pNewPage->pDialog->GetStyle();
ASSERT((dwStyle & WS_CHILD) != 0); //子窗体
ASSERT((dwStyle & WS_BORDER) == 0); //无边界
//显示
pNewPage->pDialog->ShowWindow(SW_HIDE);
pNewPage->pDialog->MoveWindow(rectPage);
/*pNewPage->pDialog->SetWindowPos(&CWnd::wndTop,
rectPage.left,rectPage.top,
rectPage.Width(),rectPage.Height(),
SWP_NOMOVE);*/
pNewPage->Next=NULL;
pNewPage->nNum=++nPageCount; //计数器加1
if (pTemp)
{
while (pTemp->Next) pTemp=pTemp->Next; //移动链表末尾
pTemp->Next=pNewPage;
}
else
pPageLink=pNewPage; //若是第一个接点
}
void CData_TransDlg::OnCancel()
{
// TODO: Add your control notification handler code here
CDialog::OnCancel();
}
void CData_TransDlg::OnPrev()
{
// TODO: Add your control notification handler code here
switch(m_Type)
{
case 0:
--nCurrentPage;
break;
case 1:
--nCurrentPage;
break;
case 2:
if (nCurrentPage == 2)
nCurrentPage=1;
else
nCurrentPage = 2;
break;
}
ShowPage(nCurrentPage);
}
void CData_TransDlg::OnNext()
{
// TODO: Add your control notification handler code here
switch(m_Type)
{
case 0:
ASSERT(FALSE);
++nCurrentPage;
break;
case 1:
++nCurrentPage;
break;
case 2:
nCurrentPage = 4;
break;
}
ShowPage(nCurrentPage);
}
void CData_TransDlg::OnFinish()
{
// TODO: Add your control notification handler code here
//进行数据库的测试
OnPaint();
//设置进度条
m_ctrlprocess.SetRange(0,100);
m_ctrlprocess.SetPos(0);
switch(m_iType) //转换类型
{
case 0: //转换成文本文件
{
struct PAGELINK* pTemp=pPageLink;
while(pTemp)
{
if (pTemp->nNum==nCurrentPage)
{
pTemp->pDialog->ShowWindow(SW_SHOW);
//先进行测试
if (((CStep33*)pTemp->pDialog)->SvrSetPar()!=0)
{
return ;
}
break;
}
pTemp=pTemp->Next;
}
}
break;
//进行读取数据
break;
case 1: //转换成数据库文件
{
struct PAGELINK* pTemp=pPageLink;
while(pTemp)
{
if (pTemp->nNum==nCurrentPage)
{
pTemp->pDialog->ShowWindow(SW_SHOW);
//先进行测试
if (((CSet3Database*)pTemp->pDialog)->SvrConnectDatabase()!=0)
{
m_ctrlprocess.ShowWindow(FALSE);
return ;
}
}
pTemp=pTemp->Next;
}
}
break;
default:
return ;
}
m_iStep = 0;
if (m_timer != NULL)
{
KillTimer(m_timer);
}
m_timer = SetTimer(1,500,NULL);
int iRet = SvrFecthData(m_strDataName,m_startTime,m_endTime,m_iType);
if (iRet>=0)
{
AfxMessageBox("convert success!");
}
else if (iRet==-1)
{
m_ctrlprocess.SetPos(100);
}
if (m_timer != NULL)
{
KillTimer(m_timer);
m_timer = NULL;
}
}
BOOL CData_TransDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
CDialog::OnDestroy();
// TODO: Add your message handler code here
//依次消除每页
struct PAGELINK* pTemp = pPageLink;
while(pTemp)
{
struct PAGELINK* pNextTemp = pTemp->Next;
pTemp->pDialog->DestroyWindow();
delete pTemp->pDialog;
delete pTemp;
pTemp = pNextTemp;
}
return CDialog::DestroyWindow();
}
void CData_TransDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
CDialog::OnClose();
}
void CData_TransDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
//依次消除每页
/* struct PAGELINK* pTemp = pPageLink;
while(pTemp)
{
struct PAGELINK* pNextTemp = pTemp->Next;
pTemp->pDialog->DestroyWindow();
delete pTemp->pDialog;
delete pTemp;
pTemp = pNextTemp;
}*/
for (int i=0;i<m_arrayInfoFile.GetSize();++i)
{
delete m_arrayInfoFile[i];
}
POSITION pos = m_TableDef.GetStartPosition();
while (NULL != pos)
{
TABLESTRUCT* pDef = NULL;
CString str;
m_TableDef.GetNextAssoc(pos,str,pDef);
ASSERT(pDef != NULL);
if (pDef != NULL)
{
delete pDef;
}
}
m_TableDef.RemoveAll();
pos = m_pTableDef.GetStartPosition();
while (NULL != pos)
{
CDaoTableDef* pDef = NULL;
CString str;
m_pTableDef.GetNextAssoc(pos,str,pDef);
ASSERT(pDef != NULL);
if (pDef != NULL)
{
delete pDef;
}
}
m_pTableDef.RemoveAll();
if (m_pDBSave!=NULL)
{
if (m_pDBSave->IsOpen())
{
m_pDBSave->Close();
}
delete m_pDBSave;
}
}
//读取对应的对象的历史数据
//1。历史数据对象名称,2。读取数据的开始时间,3。结束时间,4.转换程序的类型0:文本文件
//返回值>=0表示读取数据成功,小于0表示失败
int CData_TransDlg::SvrFecthData(CString DataName ,COleDateTime &startTime,\
COleDateTime &endTime,int iType)
{
if (startTime > endTime)
{
return -1;
}
for (int iPos=0;iPos<m_arrayInfoFile.GetSize();++iPos)
{
if (DataName.CompareNoCase(m_arrayInfoFile[iPos]->SvrGetFileName()) == 0)
break;
}
COleDateTime timeBegin,timeEnd,tmpTime;
switch(iType)
{
case 0: //转换成文本文件
//进行读取数据
{
//penghong add
CFile file;
if (!file.Open(m_strFileName , CFile::modeWrite|CFile::modeCreate))
{
return -4;
}
file.Close();
}
break;
case 1: //转换成数据库文件
if(m_iDesOrder == 0)
{
tmpTime = startTime;
}
else
{
tmpTime = endTime;
}
if (mfQueryFromDatabase(iPos,DataName,tmpTime)<0)
{
AfxMessageBox("ensure the database connected?");
}
if(m_iDesOrder == 0)
{
startTime = tmpTime;
}
else
{
endTime = tmpTime;
}
break;
default:
return -2;
}
//定义一个保存查询数据的数组
CArray<CList<COleVariant,COleVariant>*,CList<COleVariant,COleVariant>*> listValueBuffer;
if (ARRAYSIZE ( m_strArray[iPos] )<=0)
{
return -5;
}
listValueBuffer.SetSize (ARRAYSIZE ( m_strArray[iPos] ) +2);
WORD wOld = CVirtualInfoFile::m_wInvRead;
CVirtualInfoFile::EXSTATUS exOld = CVirtualInfoFile::m_exStatus;
long iTotalOld = CVirtualInfoFile::m_iTotalReadRecords;
long iRequiredRecordsOld = CVirtualInfoFile::m_iRequiredRecords;
//计算装载的时间起点和装载的记录数目
int m_iRequiredRecords = 512; //256条是目前默认的条数
CVirtualInfoFile::m_exStatus = CVirtualInfoFile::MCGS_FORSAVEDATA;
CVirtualInfoFile::m_iTotalReadRecords = 0;
CVirtualInfoFile::m_iRequiredRecords = m_iRequiredRecords;
timeBegin = startTime;
timeEnd = endTime;
int iSumNun=0;
//remain old values
while(TRUE)
{
for (int i = 0; i < ARRAYSIZE ( listValueBuffer); i++ ) //分配保存的空间
{
listValueBuffer[i] = new CList<COleVariant,COleVariant>;
}
if (m_iDesOrder == 0)
{
CVirtualInfoFile::m_wInvRead = MCGS_READDATA_O2N | MCGS_READDATA_ASC;
}
else //降序
{
CVirtualInfoFile::m_wInvRead = MCGS_READDATA_N2O | MCGS_READDATA_DEC;
}
// timeEnd = timeEnd > m_tIniEndTime ? m_tIniEndTime : timeEnd;
//此函数应当是一个安全函数,但是主要有一些变量没有弄成线程安全型,如CVirtualInfoFile::m_wInvRead等静态变量
m_arrayInfoFile[iPos]->SvrGetDBDataEx( DataName, m_strArray[iPos], timeBegin, timeEnd, listValueBuffer);
if (listValueBuffer[0]->GetCount()<m_iRequiredRecords)
{
if (m_iStep+30<100 )
m_iStep += 30;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -