文章目錄
- 前言
- 一、系統設計功能:
- 二、對應板塊
- 1.登陸板塊
- 2.系統主頁面相應功能
- 總結
前言
隨筆之作,希望通過寫文章的方式加深自己對于C++知識架構和設計程序中出現的一些Bug的印象,如有錯誤,多謝指正,
一、系統設計功能:
-
實作賬號登陸界面,(例如:使用用戶名和密碼來進入界面,如果輸入的用戶名和密碼有一項為慷訓者是輸入的用戶名和密碼是錯誤的,則不能進入系統)
用戶名:可以是學生名字也可以是學生個人學號,




-
實作任意添加學生的資訊,(例如:添加學生的個人學號,姓名,性別,出生日期,專業,年級,添加記錄時,要求學號要唯一,輸入不允許為空,并且有提示功能;如果輸入的時候有一項為空,則提示輸入相關的資訊,如果添加了重復的學號,這提示學號添加重復并且取消添加),

-
實作洗掉學生的資訊,(例如:實作對已添加的學生資訊進行洗掉,如果當前系統中沒有相應的記錄,則提示“記錄為空!”并回傳操作,)
其中洗掉有兩種方式:
第一種洗掉方式是直接在系統主頁面選定單選框,直接“洗掉”
第二種洗掉方式是按“洗掉”,在查詢視窗查詢學生資訊進行洗掉
(系統實作自動判斷洗掉方式)

-
實作查詢學生的資訊,(例如:可根據學號或姓名等資訊對已添加的學生資訊進行查詢,如果未找到,給出相應的提示資訊,如果找到,則顯示相應的記錄資訊),
可以實作學號查詢和姓名查詢(至少要輸入一個,否則將提示“請輸入所需要查詢的學生資訊”)

-
實作編輯學生的資訊,可根據查詢結果對相應的記錄進行修改,(例如:修改時注意學號的唯一性,包括編輯學生的個人學號,姓名,性別,專業,年級,出生日期,輸入不允許為空,并且有提示功能,如果輸入的時候有一項為空則提示輸入相關的資訊),
編輯功能可以在系統主界面通過系統互動(雙擊學生資訊,自動彈出修改視窗)進行修改,同時也可以通過選定單選框按“修改”進行修改(可以選中多個進行同時修改)

-
實作學生的資訊保存功能,(例如:可將學生的資訊存入檔案中,存入方式任意(建立檔案篩選格式),保存學生資訊包括學生個人學號,姓名,性別,專業,年級,出生日期),
-
實作學生的資訊匯入功能,
-
實作注銷功能,(例如:注銷當前用戶后,回傳登陸界面)
在最后我添加了一個事件處理程式(NM-DNLCLK)來實作系統的用戶互動,以至于可以在系統主界面直接雙擊學生資訊既可以實作修改
二、對應板塊
1.登陸板塊
代碼如下:
void CStudentControlManageDlg::OnBnClickedButton1Lgn() //登陸按鈕
{
// TODO: 在此添加控制元件通知處理程式代碼
CString sun;
CString spwd; // 創造兩個字串變數來接受用戶輸入的資訊(用戶名和密碼等)
GetDlgItemText(IDC_EDIT2_UNAME, sun); // 回傳用戶名
GetDlgItemText(IDC_EDIT3_PWD, spwd); // 回傳密碼
/* 判斷輸入的用戶名與密碼是否正確
使用用戶名(可以是學號,也可以是名字)和密碼(唯一)相匹配實作登陸
如果其中一項為慷訓者錯誤都不可加入系統主頁面,并且回傳提示資訊
*/
if (sun.IsEmpty())
{
MessageBox("用戶名不能為空!");
return;
}
if (spwd.IsEmpty())
{
MessageBox("密碼不能為空!");
return;
}
BOOL isSuccess = (!sun.CompareNoCase(_T("莫世冰")) && !spwd.CompareNoCase(_T("123456"))) || (!sun.CompareNoCase(_T("201934410316")) &&
!spwd.CompareNoCase(_T("123456"))); // 注意取反陳述句
// isSuccess = TRUE; //開發程序使用此陳述句,實作直接登陸
if (isSuccess)
{
ShowWindow(SW_HIDE); // 隱藏登陸視窗,但是需要在關閉系統主視窗的時候同時把子視窗也關閉,進入SystemDlg進行編譯,增加WM-CLOSE資訊和OnInitDialogc()函式
// 創造一個對話框,以至于能夠彈出系統主頁面(注意要引入主頁面“SystemDlg”的頭檔案)
SystemDlg Dlg;
Dlg.DoModal(); // 彈出主系統界面,利用DoModal()函式
}
else
{
MessageBox(_T("用戶名或者密碼錯誤"), _T("登陸失敗")); // 回傳提示資訊
}
}
2.系統主頁面相應功能
代碼如下:
void SystemDlg::OnClose()
{
// TODO: 在此添加訊息處理程式代碼和/或呼叫默認值
CDialog* dplg = (CDialog*)AfxGetMainWnd(); // 獲得子視窗的指標
dplg->DestroyWindow(); // 利用指標是操作子視窗(自我銷毀)
CDialogEx::OnClose();
}
// 在程式初始化的時候自動執行的函式
BOOL SystemDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加額外的初始化
Student_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES|LVS_EX_FLATSB); // 擴展樣式,整行選中加復選框
// 資料進行 “行列” 排序 和 表頭設定
// 1. 表頭設定(InsertColumn(下標,表頭,向右對齊0,寬度))
Student_list.InsertColumn(0, _T("年級"), 0, 200);
Student_list.InsertColumn(1, _T("專業班級"), 0, 200);
Student_list.InsertColumn(2, _T("姓名"), 0, 200);
Student_list.InsertColumn(3, _T("個人學號"), 0, 200);
Student_list.InsertColumn(4, _T("性別"), 0, 200);
Student_list.InsertColumn(5, _T("出生日期"), 0, 200);
CString g, z, n, num, m, year;
for (int i = 0; i < 8; i++)
{
g.Format(_T("學生%d"), i);
z.Format(_T("專業班級%d"), i);
n.Format(_T("姓名%d"),i);
num.Format(_T("學號%d"),i);
m.Format(_T("男"));
year.Format(_T("2000.02.%d"), i);
Student_list.InsertItem(i, g);
Student_list.SetItemText(i, 1, z);
Student_list.SetItemText(i, 2, n);
Student_list.SetItemText(i, 3, num);
Student_list.SetItemText(i, 4, m);
Student_list.SetItemText(i, 5, year);
}
Student_list.InsertItem(8, "目前頁面為");
Student_list.SetItemText(8, 1, "示范資料");
Student_list.SetItemText(8, 2, "請選擇全選鍵");
Student_list.SetItemText(8, 3, "進行“洗掉”");
Student_list.SetItemText(8, 4, "然后打開你所需要的");
Student_list.SetItemText(8, 5, "班級資訊");
return TRUE; // return TRUE unless you set the focus to a control
// 例外: OCX 屬性頁應回傳 FALSE
}
// 全部選中功能
void SystemDlg::OnBnClickedButton1()
{
// TODO: 在此添加控制元件通知處理程式代碼
for (int i = 0; i < Student_list.GetItemCount(); i++)
{
Student_list.SetCheck(i, TRUE);
}
}
// 實作反選功能
void SystemDlg::OnBnClickedButtonReverse()
{
// TODO: 在此添加控制元件通知處理程式代碼
for (int i = 0; i < Student_list.GetItemCount(); i++)
{
Student_list.SetCheck(i, !Student_list.GetCheck(i));
}
}
// 增加功能的視窗
void SystemDlg::OnBnClickedButtonAdd()
{
// TODO: 在此添加控制元件通知處理程式代碼
AddDlg dlg; // 創建對話框
if (IDCANCEL == dlg.DoModal()) // 彈出對話框
{
return;
}
/* TODO:可以在這個位置進行資訊的判斷,
1.學號要唯一
2.輸入不允許為空
(并且要有提示功能,提示1.xxx不允許為空 2. 添加資料重復并取消添加)
*/
/*增加視窗的功能要增加新的學生資訊,然后回傳到系統主頁面(主視窗)當中
因此應該要創建視窗之間的傳遞物件
*/
int nCount = Student_list.GetItemCount();
if (dlg.sClass.IsEmpty())
{
AfxMessageBox("年級不能為空!!!");
return;
}
if (dlg.sMajor.IsEmpty())
{
AfxMessageBox("專業班級不能為空");
return;
}
if (dlg.sName.IsEmpty())
{
AfxMessageBox("名字不能為空");
return;
}
if (dlg.sID.IsEmpty())
{
AfxMessageBox("學號不能為空");
return;
}
if (dlg.sSex.IsEmpty())
{
AfxMessageBox("性別不能為空");
return;
}
if (dlg.sBirth.IsEmpty())
{
AfxMessageBox("出生日期不能為空");
return;
}
// 判斷學號是否唯一
for (int i = 0; i < nCount; i++)
{
if (dlg.sID == Student_list.GetItemText(i, 3))
{
AfxMessageBox("學號重復,請輸入正確的學號");
return;
}
}
// 編輯資訊
Student_list.InsertItem(nCount, dlg.sClass);
Student_list.SetItemText(nCount, 1, dlg.sMajor);
Student_list.SetItemText(nCount, 2, dlg.sName);
Student_list.SetItemText(nCount, 3, dlg.sID);
Student_list.SetItemText(nCount, 4, dlg.sSex);
Student_list.SetItemText(nCount, 5, dlg.sBirth);
}
// 洗掉功能
void SystemDlg::OnBnClickedButtonDelete()
{
// TODO: 在此添加控制元件通知處理程式代碼
/*
洗掉功能
1. 實作對已添加的學生資訊進行洗掉,如果當前系統中沒有相應的記錄,則提示為空,并且回傳操作
即可在查詢的基礎上查詢是否有相應資訊
2. 同時也可以通過在界面直接選擇單選框,然后點擊洗掉
*/
int nCount = Student_list.GetItemCount();
int flag = 1;
for (int i = 0; i < nCount; i++) // 判斷是否與單選框得選中,然后再進行洗掉方式的切換
{
if (Student_list.GetCheck(i) == 1)
{
flag = 0;
}
}
if (flag)
{
SystemDlg::OnBnClickedButtonFind();
for (int i = 0; i < Student_list.GetItemCount(); i++) // 遍歷每一項,判斷是否被選中
{
BOOL state = Student_list.GetCheck(i);
if (state)
{
Student_list.DeleteItem(i); // 洗掉選定的專案
i--; // 因為for回圈的原因,會導致程式從1.3.5.7.9這樣子去判斷每一項的狀態,因此讓程式回傳一項判斷,實作每一個專案的一個一個判斷
}
}
}
if (!flag)
{
for (int i = 0; i < Student_list.GetItemCount(); i++) // 遍歷每一項,判斷是否被選中
{
BOOL state = Student_list.GetCheck(i);
if (state)
{
Student_list.DeleteItem(i); // 洗掉選定的專案
i--; // 因為for回圈的原因,會導致程式從1.3.5.7.9這樣子去判斷每一項的狀態,因此讓程式回傳一項判斷,實作每一個專案的一個一個判斷
}
}
}
}
// 查詢功能
void SystemDlg::OnBnClickedButtonFind()
{
// TODO: 在此添加控制元件通知處理程式代碼
int nCount = Student_list.GetItemCount();
for (int i = 0; i < nCount; i++) // 清空上次所選項
{
// ((CButton*)GetDlgItem(IDC_RADIO))->SetCheck(0);
if (Student_list.GetCheck(i) == 1)
{
Student_list.SetCheck(i, 0);
}
}
FindDlg dlg;
if (IDCANCEL == dlg.DoModal()) // 彈出對話框
{
return;
}
if (dlg.fID == "" && dlg.fName == "")
{
AfxMessageBox("請輸入所需要查詢的學生資訊!!!");
}
else
{
int uNum = 1;
for (int i = 0; i < nCount; i++) // 通過和文本比較,選定尋找資訊
{
if ((Student_list.GetItemText(i, 3) == dlg.fID || Student_list.GetItemText(i, 2) == dlg.fName))
{
Student_list.SetCheck(i); // 避免了在用姓名查找時因為名字重復而導致漏選的情況
uNum = 0;
}
if (i == nCount-1)
{
if(uNum)
{
AfxMessageBox("未找到相應記錄!!!");
}
}
}
}
}
// 修改功能
void SystemDlg::OnBnClickedButtonAlter()
{
// TODO: 在此添加控制元件通知處理程式代碼
/*
修改時注意學號的唯一性,而且輸入的內容不能為空,如果重復或者為空這給予相關體現
*/
for (int i = 0; i < Student_list.GetItemCount(); i++) // 遍歷每一項,判斷是否被選中
{
BOOL state = Student_list.GetCheck(i);
if (state)
{
AddDlg dlg;
if (IDCANCEL == dlg.DoModal()) // 彈出對話框
{
return;
}
if (dlg.sClass.IsEmpty())
{
AfxMessageBox("學號不能為空!!!");
return;
}
if (dlg.sMajor.IsEmpty())
{
AfxMessageBox("專業班級不能為空");
return;
}
if (dlg.sName.IsEmpty())
{
AfxMessageBox("名字不能為空");
return;
}
if (dlg.sID.IsEmpty())
{
AfxMessageBox("學號不能為空");
return;
}
if (dlg.sSex.IsEmpty())
{
AfxMessageBox("性別不能為空");
return;
}
if (dlg.sBirth.IsEmpty())
{
AfxMessageBox("出生日期不能為空");
return;
}
// 判斷學號是否唯一
int nCount = Student_list.GetItemCount();
for (int i = 0; i < nCount; i++)
{
if (dlg.sID == Student_list.GetItemText(i, 3))
{
AfxMessageBox("學號重復,請輸入正確的學號");
return;
}
}
// 對已有資訊進行修改(編輯),即在選定的項上,因此不用用InestItem(),直接用SetItemText() 即可
Student_list.SetItemText(i, 0, dlg.sClass);
Student_list.SetItemText(i, 1, dlg.sMajor);
Student_list.SetItemText(i, 2, dlg.sName);
Student_list.SetItemText(i, 3, dlg.sID);
Student_list.SetItemText(i, 4, dlg.sSex);
Student_list.SetItemText(i, 5, dlg.sBirth);
}
}
}
// 保存檔案按鈕
void SystemDlg::OnBnClickedButtonSave()
{
// TODO: 在此添加控制元件通知處理程式代碼
// 建立一個CFileDialog檔案物件(對話框),再進行檔案的讀取,再做出相應的操作,但應該注意的是,“.txt”會報錯,因為字符分字符集和多位元組儲存
// (物件狀態,檔案型別,檔案名字,覆寫功能,檔案格式過濾,檔案指標(這里不需要,用(空)NULL代表))
CFileDialog fDlg(FALSE, ".txt", "saveData", OFN_OVERWRITEPROMPT, "文本檔案(*.txt)|*.txt|保存的資料(*.dat)|*.dat|所有檔案(*.*)|*.*||", NULL);
if (fDlg.DoModal() == IDOK) // 判斷檔案是否打開成功
{
CStdioFile file(fDlg.GetPathName(), CFile::modeWrite | CFile::modeCreate); // 創建一個操作檔案的物件(所獲取的檔案路徑,檔案的讀取方式,寫與新建并寫入)
for (int i = 0; i < Student_list.GetItemCount(); i++) // 實作每一行資料的保持,寫入檔案,并且以逗號隔開
{
CString cs=""; // 創建一個接受字符的空變數
for (int j = 0; j < 6; j++)
{
cs += Student_list.GetItemText(i, j) + "#";
if (j == 4)
{
cs += Student_list.GetItemText(i, 5) + "\n";
j = 6;
}
}
file.WriteString(cs); // 每一行寫入一次
}
file.Close(); // 關閉檔案流
}
}
// 打開檔案按鈕
void SystemDlg::OnBnClickedButtonOpen()
{
// TODO: 在此添加控制元件通知處理程式代碼
// (物件狀態,檔案格式,檔案名,因為打開操作沒有覆寫操作,即用0代替,檔案格式過濾,檔案指標(無))
CFileDialog fDlg(TRUE, ".txt", "saveData", 0, "文本檔案(*.txt)|*.txt|保存的資料(*.dat)|*.dat|所有檔案(*.*)|*.*||", NULL);
if (fDlg.DoModal() == IDOK) // 判斷檔案是否打開成功
{
CStdioFile file(fDlg.GetPathName(), CFile::modeRead); // 創建檔案物件,進行讀取的操作
CString cs; // 創建一個從檔案取字串的變數
int i = 0;
while (file.ReadString(cs)) // 利用C++中的Find() Left() Right() Mid()函式進行截取
{
int x = cs.Find("#");
int x1 = x;
Student_list.InsertItem(i, cs.Left(x));
for (int j = 1; j < 5; j++)
{
int x2 = cs.Find("#", x1 + 1);
Student_list.SetItemText(i, j, cs.Mid(x1 + 1, x2 - x1 - 1));
x1 = x2;
if (j == 4)
{
Student_list.SetItemText(i, j + 1, cs.Right(cs.GetLength() - x1 - 1));
j++;
}
}
i++;
}
}
}
// 實作用戶互動功能的函式
void SystemDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控制元件通知處理程式代碼
*pResult = 0;
int i = pNMItemActivate->iItem;
AddDlg dlg;
if (IDCANCEL == dlg.DoModal()) // 彈出對話框
{
return;
}
if (dlg.sClass.IsEmpty())
{
AfxMessageBox("學號不能為空!!!");
return;
}
if (dlg.sMajor.IsEmpty())
{
AfxMessageBox("專業班級不能為空");
return;
}
if (dlg.sName.IsEmpty())
{
AfxMessageBox("名字不能為空");
return;
}
if (dlg.sID.IsEmpty())
{
AfxMessageBox("學號不能為空");
return;
}
if (dlg.sSex.IsEmpty())
{
AfxMessageBox("性別不能為空");
return;
}
if (dlg.sBirth.IsEmpty())
{
AfxMessageBox("出生日期不能為空");
return;
}
// 判斷學號是否唯一
int nCount = Student_list.GetItemCount();
for (int i = 0; i < nCount; i++)
{
if (dlg.sID == Student_list.GetItemText(i, 3))
{
AfxMessageBox("學號重復,請輸入正確的學號");
return;
}
}
Student_list.SetItemText(i, 0, dlg.sClass);
Student_list.SetItemText(i, 1, dlg.sMajor);
Student_list.SetItemText(i, 2, dlg.sName);
Student_list.SetItemText(i, 3, dlg.sID);
Student_list.SetItemText(i, 4, dlg.sSex);
Student_list.SetItemText(i, 5, dlg.sBirth);
}
// 注銷按鈕
void SystemDlg::OnBnClickedButtonEnd()
{
// TODO: 在此添加控制元件通知處理程式代碼
CDialog::OnOK(); // 消掉子視窗
CStudentControlManageDlg dlg; // 彈出登陸頁面
if (dlg.DoModal() != IDOK)
{
SystemDlg::OnClose(); // 實作關閉程式的功能
}
}
其中需要注意的幾點有:
1.在從登陸視窗彈出系統主頁面時,只是單純地隱藏登陸視窗是不行的,因為程式在任務管理器仍然在運行,因此要利用指標指向登陸視窗,實作DestroyWindow()視窗的自己摧毀
2.在查詢功能板塊,再次選擇查詢功能時要實作資料單項框的全部取消(即取消選定)
3.在保存和打開檔案利用CFileDialog fDlg()函式時,第一個“TURE”或者“FALSE”引數可能會報錯,因為程式實作字串保存時,默認為Unicode字符集,這時候我們只需改成多位元組字符集即可(具體步驟:“檔案屬性”->“常規”->“字符集”->“多位元組字符集”);
4.各種控制元件、視窗等的正確使用、相互參考等問題
總結
雖然是老掉牙的學生管理系統,但是在第一次的學習程序中,可謂是獲益匪淺,同時也希望以此為記錄,相信以后有機會回來寫這個系統,我可以寫的更好看,功能更加齊全,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/241387.html
標籤:其他
