C++物流管理系统(功能结构图+源代码+论文参考文献) 第7页
(2)当用户单击“查询”按钮时,根据用户选择的字段和条件进行查询:
void CDBaseQuery::OnButquery()
{
Cstring sSQL,sField,sEmblem,sCondition;
this->m_ComField.GetWindowText(sField);
this->m_ComEmblem.GetWindowText(sEmblem);
this->m_EdtCondition.GetWindowText(sCondition);
//判断查询字段的类型
if(m_ComField.m_CurrentFieldType==”数值型”)
sSQL.Format(“SELECT * FROM (%s) DERIVEDTBL WHERE %s %s %s”,\n
m_DateBaseName,sField,sEmblem,sCondition);
else{
if(sEmblem!=”LIKE”)
sSQL.Format(“SELECT * FROM (%s) DERIVEDTBL WHERE %s %s ‘%s’”,\n
m_DateBaseName,sField,sEmblem,sCondition);
else
sSQL.Format(“SELECT * FROM (%s) DERIVEDTBL WHERE %s %s ‘%%%s%%’”,\n
m_DateBaseName,sField,sEmblem,sCondition);
}
rst.Open(sSQL,adCmdText);
m_Grid.AddCellValue(rst);
}
(3)当用户单击“打印”按钮时,通过全局变量m_ps设置打印结构:
void CDBaseQuery::OnButprint()
{
Cstring sCount;
m_ps.MainCaptionFontSize=400;
m_ps.DeckCaptionFontSize=180;
Cstring sText;
this->GetWindowText(sText);
sText=sText.Left(sText.GetLength()-4);
sText=sText+”报表”;
m_ps.MainCaption=sText;
sCount.Format(“%d”,rst.GetRecordCount());
m_ps.TotalNumber=1;
m_ps.Totals[0]=”共计 “+sCount+” 条记录”;
m_ps.Totals[1]=””;
m_ps.Grid=&m_Grid;
CmyApp* theApp;
theApp=(CmyApp*)::AfxGetApp();
theApp->Print(); //执行打印
}
(4)当用户双击表格中某条记录时,对选中记录进行编辑:
void CDBaseQuery::OnDblclkGrid(NMHDR* pNMHDR, LRESULT* pResult)
{
if(m_Grid.GetSelectionMark()==-1 && m_Grid.GetRows()>0)
return;
CDBaseDlg dlg(&m_Grid,m_Identify,m_NumberStyle); //声明CDBaseDlg类对象
dlg.DoModal();
this->m_Grid.DeleteAllItems();
RxRecordset rst;
rst.Open(m_DateBaseName,adCmdText);
this->m_Grid.AddCellValue(rst);
*pResult = 0;
}
从上段代码中可以看出,m_Identify和m_NumberStyle这两个成员变量都是为CDBaseDlg类成员准备的。
2.辑子模块
实现目标
编辑子模块可以完成的功能如下:
根据指定数据表中的内容动态生成界面。
可以自动生成基础信息的惟一标识。
完成添加、修改、复制、删除基础信息的功能。
编辑子模块的运行界面如图7所示。
图7 编辑子模块的运行界面
设计步骤
向项目中添加一个新Dialog资源,资源ID为IDD_BASE。从Controls面板上向Dialog资源中添加5个Button控件。
代码分析
(1)此模块的一个难点就是怎样根据指定数据表中字段的不同动态生成界面。在程序中,笔者通过查询子模块中表格的列数来确定对象数组的长度,再通过处理对象数组实现动态地在对话框资源中显示编辑控件的数量。关键代码如下:
BOOL CDBaseDlg::OnInitDialog()
{
Cdialog::OnInitDialog();
//根据表格信息创建窗口
const int nCol=m_pGrid->GetCols();
m_ColCount=nCol;
//取出表头
LVCOLUMN column;
Cstring sColCaption;
column.mask=LVCF_TEXT;
column.pszText=sColCaption.GetBuffer(sColCaption.GetLength());
column.cchTextMax=20;
//根据列数分配在表单上的位置
//取出屏幕分辨率
int xPix=::GetSystemMetrics(SM_CXSCREEN);
int yPix=::GetSystemMetrics(SM_CYSCREEN);
int nWidth,nHeight;
nWidth=xPix/4;
nHeight=(yPix-200)/(12+5);
Crect rcSta,rcEdit;
Cstring ColCaption;
//分配空间
pSta=new Cstatic[nCol];
pEdt=new CbaseEdit[nCol];
rcSta.left=12;
rcSta.top=70+10;
rcSta.right=rcSta.left+(nWidth*2/5);
rcSta.bottom=rcSta.top+nHeight;
rcEdit.left=rcSta.right;
rcEdit.right=rcEdit.left+(nWidth*1/2);
rcEdit.top=rcSta.top;
rcEdit.bottom=rcSta.bottom;
if(nCol<=13)
rcEdit.right=490;
for(int I=0;I<nCol;I++){
//取出表头
m_pGrid->GetColumn(I,&column);
ColCaption.Format(“%s:”,column.pszText);
www.751com.cn WS_CHILD,rcSta,this,WM_USER+I);
pSta[I].ShowWindow(SW_SHOW);
//计算下一个标签位置
if((I+1)%13==0){ //每列最多显示13个
rcSta.top=70+10;
rcSta.bottom=rcSta.top+nHeight;
rcSta.left=rcSta.left+nWidth-5;
rcSta.right=rcSta.left+(nWidth*1/2);
}
else{
rcSta.top=rcSta.bottom+5;
rcSta.bottom=rcSta.top+nHeight;
}
pEdt[I].Create(WS_CHILD|WS_BORDER|WS_TABSTOP|ES_AUTOHSCROLL,rcEdit,this,\
WM_USER+100+I);
pEdt[I].ShowWindow(SW_SHOW);
pEdt[I].SetDlgCtrlID(i);
pEdt[I].SetReadOnly(); //计算下一个文本框的位置
if((I+1)%13==0) {
rcEdit.top=70+10;
rcEdit.bottom=rcEdit.top+nHeight;
rcEdit.left=rcEdit.left+nWidth-5;
rcEdit.right=rcEdit.left+(nWidth*1/2);
}
else{
rcEdit.top=rcEdit.bottom+5;
rcEdit.bottom=rcEdit.top+nHeight;
}
}
//重新调整窗口大小
Crect rcWnd,rcNewWindow;
rcWnd.top=0;
rcWnd.left=0;
rcWnd.bottom=rcEdit.bottom+46;
rcWnd.right=516;
//居中显示
rcNewWindow.left=xPix/2-rcWnd.Width()/2;
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>