Transcript 프로그램 구성
프로젝트 보고서
학과 : 임학과
학번 : 9541916
성명 : 조성환
Windows 프로그래밍
프로그램 개요
개 요
SDI를 이용한 데이터 베이스 프로그램으로 우리 생활에 쉽게 접할수 있는 주소록을 데
이터 베이스화하는 프로그램이다. 주소록을 데이터베이스화 함으로써 손쉽게 연락처
나 개인정보등을 쉽게 열람할 수 있다.
특징 및 강조점
일반적인 주소 및 전화번호, 생일, 기타 정보를 입력하는 프로그램이다.
그리고 데이터를 입력하면 리스트박스에 이름이 추가되어 손쉽게 데이터를 검색할수
있다.
기법적인 면에서는 이번 강의에서 배운 것인Serialize를 사용하였다.
개발자 소개
현재 전산과 복수전공을 하고 있으며 임학과 4학년에 재학하고 있다.
Windows 프로그래밍
프로그램 사용법
프로그램 사용법 #1
데이터추가시 이름이 리스트
박스에 추가된다.
데이터를 입력하는 버튼
데이터를 삭제하는 버튼
데이터를 수정하는 버튼
Windows 프로그래밍
프로그램 사용법
프로그램 사용법 #2
이름에 해당하는 변수가 없을
경우 메시지를 보낸다.
입력변수들을 모두 초기화
시킨다.
Windows 프로그래밍
프로그램 구성
프로그램 클래스 구조
Address 클래스
CAboutDlg
CAddressApp
CAddressDoc
구조체를 배열로 저장
CAddressView
Cdata
파일 입출력 관련과 구조체를 배열로 정의
CMainFrame
ADD
Windows 프로그래밍
각 변수들을 구조체로 저장
프로그램 구성
프로그램 코딩
CAdressView 부분
void CAddressView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
CAddressDoc* ptrDoc = (CAddressDoc*)GetDocument();
int Index = ptrDoc->GetDataNumber();
int i;
if(Index > 0) //data있으면 {
//list box에 화일에서 불러온 이름넣기
for(i=0;i<Index;i++)
{
address = ptrDoc->GetData(i)->GetAddress();
m_ListName.AddString(address.strName);
};
//셀의 위치를 첫번째로
m_ListName.SetCurSel(0);
OnSelchangeListName(); }
}
셀의 위치가 바뀌면 dialog의 변수 바꾸기
void CAddressView::OnSelchangeListName()
{
CAddressDoc* ptrDoc = (CAddressDoc *)GetDocument();
//데이타 얻기
address = ptrDoc->GetData(m_ListName.GetCurSel())>GetAddress();
//dailog의 변수들을 얻은 데이타의 값으로 바꾼다.
Updateaddress(FALSE);
UpdateData(FALSE);
}
Windows 프로그래밍
프로그램 구성
void CAddressView::Updateaddress(BOOL bool)
{
if(bool==TRUE)
{
// address의 값을 dialog의 값으로 바꾼다.
address.strBirthday=m_strBirthday;
address.strEmail=m_strEmail;
address.strEtc=m_strEtc;
address.strHomeAddress=m_strHomeAddress;
address.strHomePhone=m_strHomePhone;
address.strHomeZip=m_strHomeZip;
address.strName=m_strName;
address.strPager=m_strPager;
}
else
{
//dialog의 값을 address의 값으로 바꾼다.
m_strBirthday=address.strBirthday;
m_strEmail=address.strEmail;
m_strEtc=address.strEtc;
m_strHomeAddress=address.strHomeAddress;
m_strHomePhone=address.strHomePhone;
m_strHomeZip=address.strHomeZip;
m_strName=address.strName;
m_strPager=address.strPager;
}
};
추가 버튼
//데이타를 배열에 추가하고 list box 에도 추가
void CAddressView::OnButtonAdd()
{
CAddressDoc* ptrDoc = (CAddressDoc *)GetDocument();
int position;
//address 구조체의 값을 dialog의 변수값으로 바꾼다.
UpdateData(TRUE);
Updateaddress(TRUE);
if (m_strName == _T(""))
MessageBox("성명란에 입력하시오!!");
else {
m_ListName.AddString(m_strName);
//listbox에 이름 추가
position = m_ListName.SelectString(-1,m_strName);
//방금 추가된것의 위치 리턴
ptrDoc->AddData(position, address);
// 배열에 삽입
}
}
Windows 프로그래밍
프로그램 구성
수정 버튼
삭제 버튼
//데이타 수정하고 list box도 수정
void CAddressView::OnButtonModify()
{
CAddressDoc* ptrDoc = (CAddressDoc *)GetDocument();
int CurSel = m_ListName.GetCurSel();
//데이타가 없거나 셀이 지정되지 않았으면 실행 안함
if(m_ListName.GetCount() <= 0 || CurSel < 0)
return;
//address 구조체의 값을 dialog의 변수값으로 바꾼다.
UpdateData(TRUE);
Updateaddress(TRUE);
//원래의 값을 지운다.
m_ListName.DeleteString(CurSel);
ptrDoc->DeleteData(CurSel);
//현재의 값으로 바꾼다.
m_ListName.AddString(m_strName);
//listbox에 이름 추가
CurSel = m_ListName.SelectString(-1,m_strName);
//방금 추가된것의 위치 리턴
ptrDoc->AddData(CurSel, address);
//배열에 삽입
}
//데이타를 지운다.
void CAddressView::OnButtonDelete()
{
CAddressDoc* ptrDoc = (CAddressDoc *)GetDocument();
int CurSel = m_ListName.GetCurSel();
// 데이타 없으면 실행 안함
if(m_ListName.GetCount() <= 0 || CurSel < 0)
return;
//지운다.
ptrDoc->DeleteData(CurSel);
m_ListName.DeleteString(CurSel);
if(m_ListName.GetCount() > 0)
{ // (지워 졌으니까)셀의 위치 새로 지정
if(CurSel < m_ListName.GetCount())
m_ListName.SetCurSel(CurSel);
else
m_ListName.SetCurSel(CurSel-1); }
else
{ // 데이타 없으면 dialog의 변수 초기화
m_strBirthday = _T("");
m_strEmail = _T("");
…..
UpdateData(FALSE);
}
}
Windows 프로그래밍
프로그램 구성
AddressDoc 부분
ADD 부분
// 자료 구조체
struct ADD{
CString
strName;
……
};
Cdata 부분
//데이타 관리 클래스
class CData : public CObject
{
protected:
//배열에 저장될 구조체 변수
ADD Address;
//화일 입출력 관련
CData()
{}
DECLARE_SERIAL(CData);
public:
//Address값 변경
CData(ADD address)
{
Address = address;
};
ADD GetAddress();
// 화일 입출력 관련
virtual void Serialize(CArchive &ar);
};
class CAddressDoc : public CDocument
{
protected:
// 배열 만드는 것
CTypedPtrArray <CObArray , CData*>m_DataArray;
public:
void AddData(int position, ADD address);
CData* GetData(int Index);
void DeleteData(int Index);
void ModifyData(int Index, ADD address);
int GetDataNumber();
Windows 프로그래밍
프로그램 구성
//(프로그램 시작할 때) 화일을 열어서 배열에 저장
CAddressDoc::CAddressDoc()
{
CFile f;
if(f.Open("FriendAds.dat", CFile::modeRead) ==FALSE)
return;
CArchive ar(&f, CArchive::load);
Serialize(ar);
ar.Close();
f.Close();
Serialize
}
//(프로그램 끝날 때) 배열의 데이타를 화일로 저장
CAddressDoc::~CAddressDoc()
{
//화일 처리 관련
void CAddressDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
m_DataArray.Serialize(ar);
}
else
{
m_DataArray.Serialize(ar);
}
}
// 배열에 데이타 추가하는 함수
void CAddressDoc::AddData(int position, ADD address)
{
CData* PData = new CData(address);
m_DataArray.InsertAt(position, PData);
}
CFile f;
f.Open("FriendAds.dat", CFile::modeCreate
| CFile::modeWrite);
CArchive ar(&f, CArchive::store);
Serialize(ar);
ar.Close();
f.Close();
}
파일을 저장하거나 오픈할 경우 최후에 데이
터가 저장되는 부분은 serialize 함수에 의해
서 설정된다. Seralize 함수는 인자로
Carchive 클래스의 변수인 ar가 넘오온다. 함
수내부에서는 Cfile 클래스를 이용하여 파일
을 오픈합니다. 이렇게 파일을 오픈한 다음
파일과 메모리간에 데이터 전송통로를 만들
어 준다. 이 전송통로가 Carchive 이다.
Windows 프로그래밍
프로그램 구성
// 배열에서 주어진 Index 위치의 값을 가진 클래스의 포인터를 리턴하는 함수
CData* CAddressDoc::GetData(int Index)
{
if(Index<0 || Index > m_DataArray.GetUpperBound())
return 0;
return m_DataArray.GetAt(Index);
}
// 배열에서 주어진 Index 위치의 값을 지우는 함수
void CAddressDoc::DeleteData(int Index)
{
m_DataArray.RemoveAt(Index);
}
// 배열의 Index 위치의 값을 수정하는 함수(현재 사용 안함)
void CAddressDoc::ModifyData(int Index, ADD address)
{
CData* PData = new CData(address);
m_DataArray.SetAt(Index,PData);
}
// 배열의 갯수 리턴
int CAddressDoc::GetDataNumber()
{
return m_DataArray.GetSize();
}
//화일 처리 관련
IMPLEMENT_SERIAL(CData, CObject,1);
//Address 구조체를 리턴
ADD CData::GetAddress()
{
return Address;}
Windows 프로그래밍
//화일처리 관련
void CData::Serialize(CArchive& ar)
{
if(ar.IsStoring())
{
//저장
ar
<< Address.strName
……...
}
else
{
//로드
ar
>> Address.strName
……….
}
};