8.2.1显示记录总数和当前记录号
在“数据库编程”的记录浏览过程中,用户并不能知道表中的记录总数
及当前的记录位置,这就造成了交互的不完善,因此必须将这些信息显示出来。这时就需要使用CRecordset类的成员函数GetRecordCount和GetStatus,它们分别用来获得表中的记录总数和当前记录的索引,其原型如下:
long GetRecordCount()const;
void GetStatus(CRecordsetStatus&rStatus)const;
其中:参数rStatus是指向下列的CRecordsetStatus结构的对象:
structCRecordsetStatus
{ longm_lCurrentRecord; //当前记录的索引,0表示第一个记录1表示第二个记录
//依次类推,但-1表示第一记录之前,-2表示不确定
BOOL m_bRecordCountFinal;//记录总数是否是最终结果
};
需注意的是,GetRecordCount函数所返回的记录总数在表打开时或调用Requery函数后是不确定的,因而必须经过下列的代码才能获得最终有效的记录总数:
while (!m_pSet->lsEOF())
{ m_pSet->MoveNext();
m_pSet->GetRecordCount();
}
例:显示记录信息(总的记录数和当前记录数)
(1)调入前面的“数据库”单文档应用程序
(2)打开MainFrm.cpp文件,将原先的indicators数组修改如下:
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator第一个信息行窗口
ID_SEPARATOR, // status line indicator第二个信息行窗口
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
(3)用ClassWizard为CMyView类添加OnCommand消息处理函数,并增加下列代码。该函数先获得状态栏对象的指针,然后调用SetPaneText函数更新第2个窗格的文本。
CString str;
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CStatusBar *pStatus =&pFrame->m_wndStatusBar;
if(pStatus)
{
CRecordsetStatus rStatus;
m_pSet->GetStatus(rStatus);//获得当前记录信息
str.Format("当前记录:%d/总记录:%d",1+rStatus.m_lCurrentRecord,
m_pSet->GetRecordCount());
pStatus->SetPaneText(1,str);//更新第2个窗格的文本
}
(4)在CMyView的OnInitialUpdate函数处添加下列代码:
while (!m_pSet->IsEOF())
{
m_pSet->MoveNext();
m_pSet->GetRecordCount();
}
m_pSet->MoveFirst();
(5)#include"MainFrm.h"
(6)将MainFrm.h文件中的保护型变量m_wndStatusBar变成公共变量。
(7)编译并运行,见下面的状态栏中,你若向前翻页,它就变化。有数据库总条数,和你翻的页数。