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

📄 controlunit.cpp

📁 是一个集网络技术与数据库技术于一体的软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -