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 编辑子模块的运行界面
?
设计步骤
– 17 –
吉林省明日科技有限公司监制
向项目中添加一个新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 //取出表头 } //重新调整窗口大小 Crect rcWnd,rcNewWindow; rcWnd.top=0; rcWnd.left=0; rcWnd.bottom=rcEdit.bottom+46; rcWnd.right=516; //居中显示 rcNewWindow.left=xPix/2-rcWnd.Width()/2; m_pGrid->GetColumn(I,&column); ColCaption.Format(“%s:”,column.pszText); //创建标签 pSta[I].Create(ColCaption,WS_CHILD,rcSta,this,WM_USER+I); pSta[I].ShowWindow(SW_SHOW); //计算下一个标签位置 if((I+1)==0){ //每列最多显示13个 } else{ } rcSta.top=rcSta.bottom+5; rcSta.bottom=rcSta.top+nHeight; rcSta.top=70+10; rcSta.bottom=rcSta.top+nHeight; rcSta.left=rcSta.left+nWidth-5; rcSta.right=rcSta.left+(nWidth*1/2); 吉林省明日科技有限公司监制 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)==0) { } else{ } rcEdit.top=rcEdit.bottom+5; rcEdit.bottom=rcEdit.top+nHeight; rcEdit.top=70+10; rcEdit.bottom=rcEdit.top+nHeight; rcEdit.left=rcEdit.left+nWidth-5; rcEdit.right=rcEdit.left+(nWidth*1/2); //计算下一个文本框的位置 – 19 – rcNewWindow.right=rcNewWindow.left+rcWnd.Width(); } //设置窗口标题 Cstring sCaption; this->GetParent()->GetWindowText(sCaption); sCaption=sCaption.Left(sCaption.GetLength()-4); this->SetWindowText(sCaption+”维护”); m_DataBaseName=sCaption+”表”; //设置字符某些只允许输入数字 RxRecordset rst; rst.Open(m_DataBaseName); rcNewWindow.top=xPix/2-rcWnd.Height()/2-70; rcNewWindow.bottom=rcNewWindow.top+rcWnd.Height(); if(nCol<14) { } else{ this->ShowWindow(SW_SHOWMAXIMIZED); MoveButton(xPix-500,yPix-120); this->MoveWindow(rcNewWindow); MoveButton(13,rcEdit.top); 吉林省明日科技有限公司监制 for(I=0;I } } this->Invalidate(); this->GetClientRect(&rcNewWindow); //调整标题区域大小 this->m_StaTitle.MoveWindow(16,16,rcNewWindow.right-32,38,true); this->m_StaTitle.SetWindowText(sCaption+”维护”); Display(); return TRUE; pEdt[I].IsMoneyOnly(true); pEdt[I].IsBoolOnly(true); if(rst.GetFieldType(i)==”逻辑型”) (2)现在,所有相关数据表中的字段在对话框中都会有一个对应的编辑框,通过Display成员函数将用户选择的记录添加到和编辑框中。 void CDBaseDlg::Display() { Cstring sItemValue; int nSelectMark=m_pGrid->GetSelectionMark();// m_pGrid是指向查询子模块中表格对象的指针 – 20 – if(nSelectMark==-1){ } } for(int I=0;I sItemValue=m_pGrid->GetItemText(nSelectMark,I); m_ButCommand[4].EnableWindow(true); return; 吉林省明日科技有限公司监制 pEdt[I].SetWindowText(sItemValue);//根据用户选择的列,将各字段内容添加到编辑框中 (3)基础的准备工作制作完成,现在可以为程序增加编辑功能了。 void CDBaseDlg::OnButnew() //新增 { } void CDBaseDlg::Clear() { } void CDBaseDlg::OnButchange() { } void CDBaseDlg::OnButdele() //删除 { if(MessageBox(“确定要删除这条记录吗?”,”系统提示”,\\ MB_OKCANCEL|MB_ICONQUESTION)!=1) return; Cstring sSQL,sID,sValue; pSta[0].GetWindowText(sID); sID=sID.Left(sID.GetLength()-1); pEdt[0].GetWindowText(sValue); RxRecordset rst; rst.Open(m_DataBaseName); Cstring sType=rst.GetFieldType(0); if(sType=”字符型”) sSQL.Format(“DELETE FROM %s WHERE %s=?%s?”,m_DataBaseName,sID,sValue); – 21 – m_IsAdd=false; Enabled(true); //记录用户执行的是添加操作还是修改操作,在保存时使用 //修改 for(int m=0;m pEdt[m].SetWindowText(“”); //清空各编辑框内容 Clear(); OnButcopy(); //清空各编辑框的内容