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