現在我們開始討論優化的問題,在討論之前,建議先看看《一個簡單的學生成績管理系統》這篇文章。我看過《一個簡單的學生成績管理系統》後,覺他其中的show()這個函數用得不是很好。
show()函數的代碼如下:
show()
大家可以看出來,這個函數的作用是用來顯示和列表控件綁定的數據庫表的內容,並且這個函數在初始化的時候就調用了,這一點我覺得沒有問題,問題是我覺得他在使用添加記錄功能的時候會再次調用這個show()函數,我覺得這樣做在效率上面會有很大的損失,為什麼這麼說呢?因為,每次調用show()函數以前都要清空列表中的內容,然後再把數據庫表的內容又重新顯示一次,這樣我想在效率上面是有影響的。那我們是否可以並不要每次添加記錄的時候都要show()函數呢? 有這個想法就按這個想法做下去,我仔細看過後有了新的想法,我覺得可以只要每次都顯示添加的記錄那不就可以了嗎?而且還可以解決調用show()函數帶來了抖動.
{
m_Set.MoveFirst();
do
{
CString s;
s.Format("%d",m_Set.m_column1);
m_ListCtrlx.InsertItem(i,s,0);
m_ListCtrlx.SetItemText(i,1,m_Set.m_column2);
s.Format("%.1f",m_Set.m_column3);
m_ListCtrlx.SetItemText(i,2,s);
s.Format("%.1f",m_Set.m_column4);
m_ListCtrlx.SetItemText(i,3,s);
s.Format("%.1f",m_Set.m_column5);
m_ListCtrlx.SetItemText(i,4,s);
s.Format("%.1f",m_Set.m_column6);
m_ListCtrlx.SetItemText(i,5,s);
s.Format("%.1f",m_Set.m_column7);
m_ListCtrlx.SetItemText(i,6,s);
s.Format("%.1f",m_Set.m_column8);
m_ListCtrlx.SetItemText(i,7,s);
s.Format("%.2f",m_Set.m_column9);
m_ListCtrlx.SetItemText(i,8,s);
i++;
m_Set.MoveNext();
}while(!m_Set.IsEOF());
m_Set.Close();
}
下面我就具體說說我的解決辦法,其實,很簡單,我們只要在添加記錄的時候不要調用show()函數就可以了,而用代碼直接來顯示就可以了。
void CBaDialog::OnAdd()
我們可以不要調Xuan()這個函數,因為這個函數就是用來調用show()函數的,但是Xuan()函數中還調用了一個和show()功能一樣的diaplay()函數,請讀者注意,好了,我們可以添加如下代碼
{
Selec=TRUE;
CAddialog dlg;
if( dlg.DoModal()==IDOK)
{
if(this->Select()=="一班")
{
if(dlg.m_nxue>=200)
{
AfxMessageBox("一班學號在1—200之間");
return;
}
}
else
{
if(dlg.m_nxue<200||dlg.m_nxue>=400)
{
AfxMessageBox("二班學號在200—400之間");
return;
}
}
m_Set.AddNew();
m_nRecordCount+=1;
m_Set.m_column1=dlg.m_nxue;
m_Set.m_column2=dlg.m_strName;
m_Set.m_column3=dlg.m_fmaths;
m_Set.m_column4=dlg.m_fphysical;
m_Set.m_column5=dlg.m_fchemistry;
m_Set.m_column6=dlg.m_fenglish;
m_Set.m_column7=dlg.m_fpolitic;
m_Set.m_column8=dlg.m_fmaths+dlg.m_fphysical+dlg.m_fchemistry+dlg.m_fenglish+dlg.m_fpolitic;
m_Set.m_column9=(float)(m_Set.m_column8/5);
this->Equal();
m_Set.Update();//Update()一定放在Equal()後
m_Set.Requery();
this->Xuan();
}
}
CString s;
s.Format("%d",m_dlg.m1);
m_ListCtrlx.InsertItem(i,s,0);
m_ListCtrlx.SetItemText(i,1,m_dlg.m2);
s.Format("%.1f",m_dlg.m3);
m_ListCtrlx.SetItemText(i,2,s);
s.Format("%.1f",m_dlg.m4);
m_ListCtrlx.SetItemText(i,3,s);
s.Format("%.1f",m_dlg.m5);
m_ListCtrlx.SetItemText(i,4,s);
s.Format("%.1f",m_dlg.m6);
m_ListCtrlx.SetItemText(i,5,s);
s.Format("%.1f",m_dlg.m7);
m_ListCtrlx.SetItemText(i,6,s);
s.Format("%.1f",m_dlg.m8);
m_ListCtrlx.SetItemText(i,7,s);
s.Format("%.2f",m_dlg.m9);
m_ListCtrlx.SetItemText(i,8,s);
細心的人一定發現了這就是show()函數中的部分代碼,這確實是的,只是我將他對話框中的內容直接用列表顯示出來了,其中 m_dlg.m1~m9分別是對話框中編輯框中的內容,還有一點就是要將他定義的變量 i 變成類的成員,這樣就可以獲得插入的准確的位置了。這樣修改後的問題就是代碼會增加不少,如何取捨就看各位的需要了。
這是我對這個系統的一點不成熟的意見,希望和各位高手交流看法。更希望和劉永超聯系,一起解決問題。