📄 controlunit.cpp
字号:
// ControlUnit.cpp: implementation of the CControlUnit class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ControlUnit.h"
#include "DataManagerDoc.h"
#include "MainFrm.h"
#include "LeftView.h"
#include "DataManagerView.h"
#include "DataManager.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define ProgressMessage MSG message;while(::PeekMessage(&message,NULL,0,0,PM_REMOVE)){::TranslateMessage(&message);::DispatchMessage(&message);}
CString OleVariantToString(COleVariant varValue)
{
TCHAR szValue[MAX_PATH];
const VARIANT* variant = LPCVARIANT(varValue);
switch(variant->vt)
{
case VT_I2:
{
wsprintf(szValue, "%d", variant->iVal);
break;
}
case VT_I4:
{
wsprintf(szValue, "%d", variant->lVal);
break;
}
case VT_R4:
{
wsprintf(szValue, "%f", variant->fltVal);
break;
}
case VT_R8:
{
wsprintf(szValue, "%f", variant->dblVal);
break;
}
case VT_CY:
{
COleCurrency c(varValue);
CString s = c.Format();//ie. 1.00
strcpy(szValue, s.GetBuffer(s.GetLength()));
s.ReleaseBuffer();
break;
}
case VT_DATE:
{
COleDateTime t(variant->date);
//Day of Week, Month Day, Year
CString s = t.Format( "%A, %B %d, %Y" );
strcpy(szValue, s.GetBuffer(s.GetLength()));
s.ReleaseBuffer();
break;
}
case VT_BSTR:
{
//convert BSTR to Cstring
CString str = V_BSTRT( &varValue );
strcpy(szValue, str.GetBuffer(str.GetLength()));
str.ReleaseBuffer();
break;
}
case VT_BOOL:
{
if(variant->boolVal)
strcpy(szValue, "TRUE");
else
strcpy(szValue, "FALSE");
break;
}
case VT_UI1:
{
strcpy(szValue, (char*)variant->bVal);
break;
}
default: break;
}
return szValue;
}
//////////////////////////////////////////////////////////////////////
// CControlModule Class
CControlModule::CControlModule()
{
m_strModuleName = "DataManager";
//查找数据库文件
WIN32_FIND_DATA fd;
HANDLE hd=FindFirstFile(GetDefaultDBName(),&fd);
if (hd==INVALID_HANDLE_VALUE)
{
//如果数据库不存在,创建新数据库
m_Database.Create(GetDefaultDBName());
}
else
{
//如果数据库存在,那么打开数据库
m_Database.Open(GetDefaultDBName());
}
//调用BuildMemTree在内存中建立管理结构
BuildMemTree();
}
CControlModule::~CControlModule()
{
CControlSegment* pCtrlSegment = NULL;
while(m_plSegmentList.GetCount() > 0)
{
pCtrlSegment = (CControlSegment*)m_plSegmentList.RemoveHead();
delete pCtrlSegment;
}
m_Database.Close();
}
CString CControlModule::GetModuleName()
{
return m_strModuleName;
}
int CControlModule::GetSegmentCount()
{
return m_plSegmentList.GetCount();
}
CControlSegment* CControlModule::GetSegment(int nIndex)
{
if(nIndex < 0 || nIndex >= m_plSegmentList.GetCount())
return NULL;
return (CControlSegment*)m_plSegmentList.GetAt
(m_plSegmentList.FindIndex(nIndex));
}
CControlSegment* CControlModule::GetSegment(CString strSegmentName)
{
POSITION pos = m_plSegmentList.GetHeadPosition();
CControlSegment* pCtrlSegment = NULL;
while(pos != NULL)
{
pCtrlSegment = (CControlSegment*)m_plSegmentList.GetNext(pos);
if(pCtrlSegment != NULL)
{
if(pCtrlSegment->GetSegmentName() == strSegmentName)
return pCtrlSegment;
}
}
return NULL;
}
CControlSegment* CControlModule::GetSegment(WORD wSegmentID)
{
if(m_plSegmentList.GetCount() <= 0)
return NULL;
POSITION pos = m_plSegmentList.GetHeadPosition();
CControlSegment* pCtrlSegment = NULL;
while(pos != NULL)
{
pCtrlSegment = (CControlSegment*)m_plSegmentList.GetNext(pos);
if(pCtrlSegment != NULL)
{
if(pCtrlSegment->GetSegmentID() == wSegmentID)
return pCtrlSegment;
}
}
return NULL;
}
BOOL CControlModule::AddSegment(CControlSegment* pSegment)
{
if(m_plSegmentList.Find(pSegment) != NULL)
return FALSE;
if(GetSegment(pSegment->GetSegmentName()) != NULL)
return FALSE;
if(GetSegment(pSegment->GetSegmentID()) != NULL)
return FALSE;
CDaoRecordset m_Recordset(&m_Database);
m_Recordset.Open(dbOpenDynaset,"Select * from Segments");
m_Recordset.AddNew();
CString strTemp;
strTemp=pSegment->GetSegmentName();
m_Recordset.SetFieldValue("SegmentName",(char*)(LPCTSTR)strTemp);
m_Recordset.Update();
m_Recordset.Close();
CString strSQL="Select * from Segments where SegmentName ='"+
(CString)strTemp+"'";
m_Recordset.Open(dbOpenDynaset,strSQL);
if (m_Recordset.IsBOF() && m_Recordset.IsEOF())
{
delete pSegment;
return FALSE;
}
COleVariant varValue=m_Recordset.GetFieldValue("SegmentID");
pSegment->SetSegmentID(atoi(OleVariantToString(varValue)));
m_plSegmentList.AddTail(pSegment);
pSegment->SetControlModule(this);
pSegment->BuildMemTree();
CDataManagerDoc* m_pDoc=(CDataManagerDoc*)((CMainFrame*)
AfxGetApp()->m_pMainWnd)->GetActiveDocument();
POSITION pos=m_pDoc->GetFirstViewPosition();
CLeftView* p_TreeView;
while (pos != NULL)
{
CView* pView = m_pDoc->GetNextView(pos);
if(pView->IsKindOf(RUNTIME_CLASS(CLeftView)))
{
p_TreeView=(CLeftView*)pView;
}
}
CTreeCtrl& m_tree=p_TreeView->GetTreeCtrl();
HTREEITEM hItem;
hItem=m_tree.InsertItem(pSegment->GetSegmentName(),0,0,
TVI_ROOT,TVI_LAST);
m_tree.SetItemData(hItem,0);
pSegment->hItem=hItem;
return TRUE;
}
BOOL CControlModule::AddSegment(CString strSegmentName)
{
CControlSegment* pCtrlSegment = new CControlSegment;
pCtrlSegment->SetSegmentName(strSegmentName);
return AddSegment(pCtrlSegment);
}
BOOL CControlModule::DeleteSegment(CControlSegment* pSegment)
{
POSITION pos = m_plSegmentList.Find(pSegment);
if(pos != NULL)
{
for(int i=pSegment->GetUnitCount()-1;i>=0;i--)
{
pSegment->DeleteUnit(i);
}
CString strSQL="Drop Table "+pSegment->GetUnitTableName();
m_Database.Execute(strSQL);
strSQL="Drop Table "+pSegment->GetHisTableName();
m_Database.Execute(strSQL);
strSQL="Drop Table "+pSegment->GetPointNameID();
m_Database.Execute(strSQL);
strSQL="Delete From Segments Where SegmentName ='"+
pSegment->GetSegmentName()+"'";
m_Database.Execute(strSQL);
CDataManagerDoc* m_pDoc=(CDataManagerDoc*)((CMainFrame*)
AfxGetApp()->m_pMainWnd)->GetActiveDocument();
POSITION viewpos=m_pDoc->GetFirstViewPosition();
CLeftView* p_TreeView;
while (viewpos != NULL)
{
CView* pView = m_pDoc->GetNextView(viewpos);
if(pView->IsKindOf(RUNTIME_CLASS(CLeftView)))
{
p_TreeView=(CLeftView*)pView;
}
}
CTreeCtrl& m_tree=p_TreeView->GetTreeCtrl();
m_tree.DeleteItem(m_tree.GetSelectedItem());
m_plSegmentList.RemoveAt(pos);
pSegment->SetControlModule(NULL);
delete pSegment;
return TRUE;
}
else
return FALSE;
}
BOOL CControlModule::DeleteSegment(int nIndex)
{
POSITION pos = m_plSegmentList.FindIndex(nIndex);
CControlSegment* pCtrlSegment = NULL;
if(pos != NULL)
{
pCtrlSegment = (CControlSegment*)m_plSegmentList.GetAt(pos);
return DeleteSegment(pCtrlSegment);
}
else
return FALSE;
}
void CControlModule::BuildMemTree()
{
CControlSegment *TempCtrlSegment;
if(!CheckTable("Segments"))
{
CString strSQL;
strSQL="Create Table Segments ( SegmentID AUTOINCREMENT,";
strSQL=strSQL+"SegmentName VarChar(30) not Null,";
strSQL=strSQL+"SegmentMemo VarChar(255) NULL)";
m_Database.Execute(strSQL);
}
CDaoRecordset m_Recordset(&m_Database);
m_Recordset.Open(dbOpenDynaset,"Select * from Segments");
if (!(m_Recordset.IsBOF() && m_Recordset.IsEOF()))
{
m_Recordset.MoveFirst();
while(!m_Recordset.IsEOF())
{
TempCtrlSegment=new CControlSegment();
COleVariant varValue=m_Recordset.GetFieldValue("SegmentName");
TempCtrlSegment->SetSegmentName(OleVariantToString(varValue));
varValue=m_Recordset.GetFieldValue("SegmentID");
TempCtrlSegment->SetSegmentID(atoi(OleVariantToString(varValue)));
TempCtrlSegment->SetControlModule(this);
m_plSegmentList.AddTail(TempCtrlSegment);
m_Recordset.MoveNext();
}
}
for (int i=0;i<GetSegmentCount();i++)
{
TempCtrlSegment=GetSegment(i);
TempCtrlSegment->BuildMemTree();
}
}
//////////////////////////////////////////////////////////////////////
// CControlSegment Class
CControlSegment::CControlSegment()
{
m_strSysName.Empty();
m_SegmentSocket=new CClientSocket(NULL);
}
CControlSegment::~CControlSegment()
{
CControlUnit* pCtrlUnit = NULL;
while(m_plUnitList.GetCount() > 0)
{
pCtrlUnit = (CControlUnit*)m_plUnitList.RemoveHead();
delete pCtrlUnit;
}
delete m_SegmentSocket;
}
CString CControlSegment::GetSegmentName()
{
return m_strSysName;
}
BOOL CControlSegment::SetSegmentName(CString strSysName)
{
if(strSysName.IsEmpty())
return FALSE;
if(m_strSysName == strSysName)
return FALSE;
m_strSysName = strSysName;
return TRUE;
}
WORD CControlSegment::GetSegmentID()
{
return m_wSegmentID;
}
BOOL CControlSegment::SetSegmentID(WORD wSegmentID)
{
if(m_wSegmentID == wSegmentID)
return FALSE;
m_wSegmentID = wSegmentID;
return TRUE;
}
int CControlSegment::GetUnitCount()
{
return m_plUnitList.GetCount();
}
CControlUnit* CControlSegment::GetUnit(int nIndex)
{
if(nIndex < 0 || nIndex >= m_plUnitList.GetCount())
return NULL;
return (CControlUnit*)m_plUnitList.GetAt
(m_plUnitList.FindIndex(nIndex));
}
CControlUnit* CControlSegment::GetUnit(CString strUnitName)
{
POSITION pos = m_plUnitList.GetHeadPosition();
CControlUnit* pCtrlUnit = NULL;
while(pos != NULL)
{
pCtrlUnit = (CControlUnit*)m_plUnitList.GetNext(pos);
if(pCtrlUnit != NULL)
{
if(pCtrlUnit->GetUnitName() == strUnitName)
return pCtrlUnit;
}
}
return NULL;
}
CControlUnit* CControlSegment::GetUnit(WORD wUnitID)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -