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

📄 manager.cpp

📁 在VC6.0下开发的员工管理系统源码
💻 CPP
字号:
// Manager.cpp: implementation of the CManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "employee.h"
#include "Manager.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


////////////////////////////////////////////
//   设计人: 徐钢 
///////////////////////////////////////////

//文件名称:Manager.cpp
//创建时间:2007-06-11
//最后修改时间:2007-06-24
//类名称:CManager
//定义该类的目的:实现界面与文件之间的信息处理,是 CEmployeeDlg 类与 CMMFile 类之间的信息交换中介
//与其他类的关系:与 CEmployeeDlg 类是被调用关系
//                与 CMMFile 类、AEmployee 类和 MyList 类是调用关系。


#include "AEmployee.h"	// 包函 AEmployee 头文件
#include "MMFile.h" 	// 包函 MMFile.h 头文件

CManager::CManager()
{
	pMMFile=NULL;
	dwSize=sizeof(AEmployee)*1000+sizeof(short);
}

CManager::~CManager()
{
	CloseFile();
}

// 功能:打开员工信息文件
BOOL CManager::OpenFile(LPCTSTR FileName)
{
	if(pMMFile) // 如果已经有文件被打开,则弹出提示信息
	{
		MessageBox(NULL,"已经打开,请关闭重试!","系统提示",MB_OK);
		return FALSE;
	}
	pMMFile=new CMMFile();
	if(!pMMFile->OpenMem(FileName,"Employee_map")) // 创建映象
		if(!pMMFile->OpenNewMem(FileName,"Employee_map",dwSize))
		{
			delete pMMFile;
			pMMFile = NULL;
			return FALSE;
		}
	if(!LoadData()) // 加载数据
	{
		return FALSE;
	}
	return TRUE;
}
// 功能:加载数据
BOOL CManager::LoadData()
{
	short Count;
	pMMFile->ReadFromFile(&Count,0,sizeof(short));
	int i;
	AEmployee *employee;
	myList.RemoveAll();
	DWORD dwOffset = sizeof(short);
	for(i=0;i<Count;i++)
	{
		employee=new AEmployee;
		employee->Clear();
		pMMFile->ReadFromFile(employee,dwOffset,sizeof(AEmployee));
		dwOffset+=sizeof(AEmployee);
		myList.AddTail(employee);
	}
	return TRUE;
}
// 功能:释放数据
BOOL CManager::UnLoadData()
{
	AEmployee *employee;
	while(!myList.IsEmpty())
	{
		employee=(AEmployee*)myList.RemoveHead();
		if(employee)
		{
			employee->Clear();
		}
	}
	return TRUE;
}
// 功能:关闭员工信息文件
void CManager::CloseFile()
{
	if(!pMMFile)
	{
		return;
	}
	UnLoadData();
	if(pMMFile)
	{
		pMMFile->CloseMem(); 
		delete pMMFile;
		pMMFile=NULL;
	}
}
// 功能:添加成员
BOOL CManager::Add(AEmployee *employee)
{
	if(!pMMFile) // 如果没有文件打开则弹出提示信息
	{
		MessageBox(NULL,"请先打开信息薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	if(!employee)
		return FALSE;
	if(myList.GetCount()>=1000)
		return FALSE;
	AEmployee *pTmpPeople=new AEmployee();
	memcpy(pTmpPeople,employee,sizeof(AEmployee)); 
	myList.AddTail(pTmpPeople);  
	return TRUE;
}
// 功能:存入文件
BOOL CManager::SaveToFile(LPCTSTR FileName)
{
	if(!pMMFile) // 如果没有文件打开则弹出提示信息
	{
		MessageBox(NULL,"请先打开信息薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	DWORD sz=sizeof(short)+1000*sizeof(AEmployee);
	CMMFile* pmmf=new CMMFile(); 
	if(!pmmf->OpenNewMem(FileName,"svsfile",sz)) // 先新建一个映象
	{
		delete pmmf;
		return FALSE;
	}
	POSITION pos=myList.GetHeadPosition();
	short cn=myList.GetCount();
	pmmf->WriteToFile(&cn,0,sizeof(short));  // 然后先将 “员工个数” 存入文件
	DWORD dwOffset=sizeof(short);
	AEmployee *employee;
	while(pos)
	{
		employee=(AEmployee*)myList.GetNext(pos);
		pmmf->WriteToFile(employee,dwOffset,sizeof(AEmployee));  // 然后再将 “员工信息” 依次存入文件
		dwOffset+=sizeof(AEmployee);
	} 
	pmmf->CloseMem();  // 最后关闭这个映象
	delete pmmf;
	return TRUE;
}
// 功能:对指定字段进行 升序/降序 排列
BOOL CManager::Sort(LPCTSTR szFieldName, BOOL bDestSort)
{
	if(!pMMFile) // 如果没有文件打开则弹出提示信息
	{
		MessageBox(NULL,"请先打开信息薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	POSITION pos,pos1,pos2;
	pos=myList.GetHeadPosition();
	AEmployee *p1;
	AEmployee n1;
	CString s1,s2;
	while(pos) 
	{
		pos1=pos;
		pos2=pos;
		p1=(AEmployee*)myList.GetAt(pos);  
		memcpy(&n1,p1,sizeof(AEmployee)); 
		while(pos1)  
		{ 
			// 思路:将筛选出的最大(或最小)的值存到 n1 中,并将其对应的下标放到 pos2 中
			p1=(AEmployee*)myList.GetAt(pos1);
			s1=n1.Fields(szFieldName); 
			s2=p1->Fields(szFieldName); 
			if(bDestSort)  // 降序排列
			{
				if(s1<s2)
				{
					memcpy(&n1,p1,sizeof(AEmployee));
					pos2=pos1;
				}
			}
			else // 升序排列
			{
				if(s1>s2)
				{
					memcpy(&n1,p1,sizeof(AEmployee));
					pos2=pos1;
				}
			}
			myList.GetNext(pos1);
		}
		p1=(AEmployee*)myList.GetAt(pos2);
		if(pos2!=pos) 
		{
			myList.RemoveAt(pos2);
			myList.InsertBefore(pos,p1); 
		}
		pos=pos2;
		myList.GetNext(pos);
	}
	return TRUE;
}
// 功能:按照指定员工字段信息,在网格控件中,查找包含指定内容的员工的信息
BOOL CManager::Search(LPCTSTR szFieldName, LPCTSTR szSchValue)
{
	if(!pMMFile)  // 如果没有文件打开则弹出提示信息
	{
		MessageBox(NULL,"请先打开信息薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	AEmployee* employee;
	while(!myList.IsEmpty()) // 首先把链表清空
	{
		employee=(AEmployee*)myList.RemoveHead();
		if(employee)
		{
			employee->Clear();
		}
	}
	short Count;
	pMMFile->ReadFromFile(&Count,0,sizeof(short)); // 再读取员工的个数
	int i;
	AEmployee aPeople;
	myList.RemoveAll(); // 释放所有结点
	CString s;
	DWORD dwOffset=sizeof(short);
	// 思路:采用的是顺序搜索法
	for(i=0;i<Count;i++)
	{
		pMMFile->ReadFromFile(&aPeople,dwOffset,sizeof(AEmployee)); 
		s.Format("%s",aPeople.Fields(szFieldName)); 
		if(s.Find(szSchValue)>=0) 
		{
			employee=new AEmployee;
			memcpy(employee,&aPeople,sizeof(AEmployee));
			myList.AddTail(employee);
		}
		dwOffset+=sizeof(AEmployee);
	}
	return TRUE;
}
// 功能:删除在网格控件中指定下标的信息
BOOL CManager::Delete(POSITION pos)
{
	if(!pMMFile) // 如果没有文件打开则弹出提示信息
	{
		MessageBox(NULL,"请先打开信息薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	AEmployee *employee=(AEmployee*)myList.GetAt(pos);
	myList.RemoveAt(pos);
	return TRUE;
}
// 功能:保存"网格控件"中员工信息到磁盘文件
BOOL CManager::Save()
{
	if(!pMMFile) // 如果没有文件打开则弹出提示信息
	{
		MessageBox(NULL,"请先打开信息薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	POSITION pos=myList.GetHeadPosition();
	short cn=myList.GetCount();
	pMMFile->WriteToFile(&cn,0,sizeof(short)); // 先把员工个数存入文件的开头
	DWORD dwOffset=sizeof(short);
	AEmployee *employee;
	while(pos) 
	{
		employee=(AEmployee*)myList.GetNext(pos);
		pMMFile->WriteToFile(employee,dwOffset,sizeof(AEmployee)); // 再把员工信息逐个依次存入文件
		dwOffset+=sizeof(AEmployee);
	}
	return TRUE;
}
// 功能:得到(当前下标+nIndex)的下标
POSITION CManager::GetPositionWithIndex(int nIndex)
{
	if(!pMMFile) // 如果没有文件打开则弹出提示信息
	{
		MessageBox(NULL,"请先打开信息薄文件!","系统提示",MB_OK);
		return FALSE;
	}
	POSITION pos=myList.GetHeadPosition();
	int i;
	for(i=0;i<nIndex;i++)
		myList.GetNext(pos);
	return pos;
}

⌨️ 快捷键说明

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