프로그램 구성

Download Report

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
……….
}
};