📄 myaddrbook.cpp
字号:
// MyAddrBook.cpp: implementation of the MyAddrBook class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "addr_book.h"
#include "APeople.h" // 包函APeople
#include "MMFile.h"
#include "MyAddrBook.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
MyAddrBook::MyAddrBook()
{
pMMFile=NULL;
dwSize=sizeof(APeople)*1000+sizeof(short);
}
MyAddrBook::~MyAddrBook()
{
CloseFile();
}
BOOL MyAddrBook::OpenFile(LPCTSTR FileName)
{
if(pMMFile)
{
MessageBox(NULL,"已经打开,请关闭重试!","系统提示",MB_OK);
return FALSE;
}
pMMFile=new CMMFile(FALSE);
if(!pMMFile->OpenMem(FileName,"addr_book_map"))
if(!pMMFile->OpenNewMem(FileName,"addr_book_map",dwSize))
{
delete pMMFile;
pMMFile=NULL;
return FALSE;
}
if(!LoadData())
{
return FALSE;
}
return TRUE;
}
BOOL MyAddrBook::LoadData()
{
short Count;
pMMFile->ReadFromFile(&Count,0,sizeof(short));
int i;
APeople *pPeople;
pList.RemoveAll();
DWORD dwOffset=sizeof(short);
for(i=0;i<Count;i++)
{
pPeople=new APeople;
pPeople->Clear();
pMMFile->ReadFromFile(pPeople,dwOffset,sizeof(APeople));
dwOffset+=sizeof(APeople);
pList.AddTail(pPeople);
}
return TRUE;
}
BOOL MyAddrBook::UnLoadData()
{
APeople* pPeople;
while(!pList.IsEmpty())
{
pPeople=(APeople*)pList.RemoveHead();
if(pPeople)
{
pPeople->Clear();
delete pPeople;
pPeople=NULL;
}
}
return TRUE;
}
void MyAddrBook::CloseFile()
{
if(!pMMFile)
{
return;
}
UnLoadData();
if(pMMFile)
{
pMMFile->CloseMem();
delete pMMFile;
pMMFile=NULL;
}
}
BOOL MyAddrBook::Add(APeople *pPeople)
{
if(!pMMFile)
{
MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
return FALSE;
}
if(!pPeople)
return FALSE;
if(pList.GetCount()>=1000)
return FALSE;
APeople *pTmpPeople=new APeople();
memcpy(pTmpPeople,pPeople,sizeof(APeople));
pList.AddTail(pTmpPeople);
return TRUE;
}
BOOL MyAddrBook::SaveToFile(LPCTSTR FileName)
{
if(!pMMFile)
{
MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
return FALSE;
}
DWORD sz=sizeof(short)+1000*sizeof(APeople);
CMMFile* pmmf=new CMMFile(FALSE);
if(!pmmf->OpenNewMem(FileName,"svsfile",sz))
{
delete pmmf;
return FALSE;
}
POSITION pos=pList.GetHeadPosition();
short cn=pList.GetCount();
pmmf->WriteToFile(&cn,0,sizeof(short));
DWORD dwOffset=sizeof(short);
APeople *pPeople;
while(pos)
{
pPeople=(APeople*)pList.GetNext(pos);
pmmf->WriteToFile(pPeople,dwOffset,sizeof(APeople));
dwOffset+=sizeof(APeople);
}
pmmf->CloseMem();
delete pmmf;
return TRUE;
}
BOOL MyAddrBook::Sort(LPCTSTR szFieldName, BOOL bDestSort)
{
if(!pMMFile)
{
MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
return FALSE;
}
POSITION pos,pos1,pos2;
pos=pList.GetHeadPosition();
APeople *p1;
p1=(APeople*)pList.GetAt(pos);
if(!p1->Fields(szFieldName))
return FALSE;
APeople n1;
CString s1,s2;
while(pos)
{
pos1=pos;
pos2=pos;
p1=(APeople*)pList.GetAt(pos);
memcpy(&n1,p1,sizeof(APeople));
while(pos1)
{
p1=(APeople*)pList.GetAt(pos1);
s1=n1.Fields(szFieldName);
s2=p1->Fields(szFieldName);
if(bDestSort)
{
if(s1<s2)
{
memcpy(&n1,p1,sizeof(APeople));
pos2=pos1;
}
}
else
{
if(s1>s2)
{
memcpy(&n1,p1,sizeof(APeople));
pos2=pos1;
}
}
pList.GetNext(pos1);
}
p1=(APeople*)pList.GetAt(pos2);
if(pos2!=pos)
{
pList.RemoveAt(pos2);
pList.InsertBefore(pos,p1);
}
pos=pos2;
pList.GetNext(pos);
}
return TRUE;
}
BOOL MyAddrBook::Search(LPCTSTR szFieldName, LPCTSTR szSchValue)
{
if(!pMMFile)
{
MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
return FALSE;
}
APeople* pPeople;
while(!pList.IsEmpty())
{
pPeople=(APeople*)pList.RemoveHead();
if(pPeople)
{
pPeople->Clear();
delete pPeople;
pPeople=NULL;
}
}
short Count;
pMMFile->ReadFromFile(&Count,0,sizeof(short));
int i;
APeople aPeople;
pList.RemoveAll();
CString s;
DWORD dwOffset=sizeof(short);
for(i=0;i<Count;i++)
{
pMMFile->ReadFromFile(&aPeople,dwOffset,sizeof(APeople));
s.Format("%s",aPeople.Fields(szFieldName));
if(s.Find(szSchValue)>=0)
{
pPeople=new APeople;
memcpy(pPeople,&aPeople,sizeof(APeople));
pList.AddTail(pPeople);
}
dwOffset+=sizeof(APeople);
}
return TRUE;
}
BOOL MyAddrBook::Modify(POSITION pos,APeople *pPeople)
{
if(!pMMFile)
{
MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
return FALSE;
}
if(!pPeople)
return FALSE;
pList.SetAt(pos,pPeople);
return TRUE;
}
BOOL MyAddrBook::Delete(POSITION pos)
{
if(!pMMFile)
{
MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
return FALSE;
}
APeople* pPeople=(APeople*)pList.GetAt(pos);
pList.RemoveAt(pos);
delete pPeople;
return TRUE;
}
BOOL MyAddrBook::Save()
{
if(!pMMFile)
{
MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
return FALSE;
}
POSITION pos=pList.GetHeadPosition();
short cn=pList.GetCount();
pMMFile->WriteToFile(&cn,0,sizeof(short));
DWORD dwOffset=sizeof(short);
APeople *pPeople;
while(pos)
{
pPeople=(APeople*)pList.GetNext(pos);
pMMFile->WriteToFile(pPeople,dwOffset,sizeof(APeople));
dwOffset+=sizeof(APeople);
}
return TRUE;
}
POSITION MyAddrBook::GetPositionWithIndex(DWORD nIndex)
{
if(!pMMFile)
{
MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK);
return FALSE;
}
POSITION pos=pList.GetHeadPosition();
DWORD i;
for(i=0;i<nIndex;i++)
pList.GetNext(pos);
return pos;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -