⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmdialog.cpp

📁 通过一个学校考试信息管理系统介绍了以较为模块化的方式视线数据库应用系统的方式
💻 CPP
字号:
// BMDialog.cpp : 实现文件
//

#include "stdafx.h"
#include "StudentScore.h"
#include "BMDialog.h"


// CBMDialog 对话框

IMPLEMENT_DYNAMIC(CBMDialog, CDialog)
CBMDialog::CBMDialog(CWnd* pParent /*=NULL*/)
	: CDialog(CBMDialog::IDD, pParent)
{
}

CBMDialog::~CBMDialog()
{
}

void CBMDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CBMDialog, CDialog)
	ON_BN_CLICKED(IDOK, OnBnClickedOk)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_BUTTON1, OnAddRec)
END_MESSAGE_MAP()


// CBMDialog 消息处理程序

BOOL CBMDialog::OnInitDialog()
{
	CDialog::OnInitDialog();
	
	//动态创建控件
	CFieldRecord* pRecord;
	int top=0;
	for(int i=1;i<=RecordArray.GetSize();i++)
	{
		
        top=(i-1)*22; 
        pRecord=(CFieldRecord*)RecordArray.GetAt(i-1); 
        CreateStatic(pRecord,top,70+i);
		
		if((pRecord->IsBool)||(pRecord->pFK!=NULL))//布尔或有关联外键
		{
			CreateCombo(pRecord,top,10+i);
		}
		else
		{
			CreateEdit(pRecord,top,10+i);
		}
		
	}
	
	CWnd* pWnd;
	CRect rect;
	
	pWnd=GetDlgItem(IDC_BUTTON1);
    pWnd->GetWindowRect(&rect);
	rect.top=top+30;
	rect.bottom=rect.top+25;
	pWnd->MoveWindow(&rect);
	
	pWnd=GetDlgItem(IDOK);
    pWnd->GetWindowRect(&rect);
	rect.top=top+30;
	rect.bottom=rect.top+25;
	pWnd->MoveWindow(&rect);
    
	pWnd=GetDlgItem(IDCANCEL);
    pWnd->GetWindowRect(&rect);
	rect.top=top+30;
	rect.bottom=rect.top+25;
	pWnd->MoveWindow(&rect);
    
	GetWindowRect(&rect);
	int width=rect.right-rect.left; 
    MoveWindow(rect.left,rect.top,width,top+100);  
	
	if(!ISADD)
	{
		GetDlgItem(IDC_BUTTON1)->EnableWindow(false);
		SetWindowText("修改记录");
	}
	else
	{   
		GetDlgItem(IDOK)->EnableWindow(false);
		GetDlgItem(IDCANCEL)->SetWindowText("关闭");
		SetWindowText("添加记录");
	}
	
	return TRUE;  
}


void CBMDialog::PostNcDestroy()
{

	CDialog::PostNcDestroy();
}

void CBMDialog::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	//判断添加内容(编辑框)是否为空
    SendChangeMsg();		
	OnOK();
}
//释放创建的组件
void CBMDialog::FreeControls(void)
{
	CWnd *pWnd;
    for(int i=1;i<=RecordArray.GetSize();i++)
	{
		//释放静态框
	   	pWnd=GetDlgItem(70+i);
		if (pWnd)
		{
			pWnd->DestroyWindow();
			delete pWnd;
			pWnd=NULL;
		}
		//释放文本框或其它
		pWnd=GetDlgItem(10+i);
		if(pWnd)
		{
			if (pWnd->IsKindOf(RUNTIME_CLASS(CComboBox)))
			{
			   CComboBox* pComboBox=(CComboBox*) pWnd;
			   void* p;
			   for(int j=0;j<pComboBox->GetCount();j++)
			   {
				   p=pComboBox->GetItemDataPtr(j);
				   if(p)
				   delete p;
			   }
               for(j=0;j<pComboBox->GetCount();j++)
			   {
			      	pComboBox->DeleteString(0);
			   }
			   
			}
			pWnd->DestroyWindow();
			delete pWnd;
			pWnd=NULL;		
		}
	}
	//释放数组
    i=0;
	CFieldRecord* pRecord=NULL;
	while(i<RecordArray.GetSize()) 
	{
      pRecord=(CFieldRecord*)RecordArray.GetAt(i); 
      if(pRecord->pFK)//如果有外键,释放外键
	  {
	     delete pRecord->pFK; 
	  }
	  delete pRecord;
	  i++;
   }
   RecordArray.RemoveAll();
}

void CBMDialog::OnFinalRelease()
{
	// TODO: 在此添加专用代码和/或调用基类
	CDialog::OnFinalRelease();
}

void CBMDialog::OnDestroy()
{
    FreeControls();//释放组件
	CDialog::OnDestroy();

	// TODO: 在此添加消息处理程序代码
}

CString CBMDialog::GenerateInsertSql(void)
{
	CString sqlstr,fldlist,valuelist;
	CFieldRecord* pRecord;
	ASSERT(m_OprTblName!=""); 
	
	for(int i=0;i<RecordArray.GetSize();i++)
	{
		pRecord=(CFieldRecord*)RecordArray.GetAt(i);
		//获得值
		if (pRecord->IsBool)
		{
			if(_stricmp(pRecord->Value,"是")==0) 
				valuelist=valuelist+"TRUE";
			else if(_stricmp(pRecord->Value,"否")==0)
				valuelist=valuelist+"FALSE";
			
		}
		else if(pRecord->IsStrType)
		{
			valuelist=valuelist+"'"+pRecord->Value+"'";
		}
		else
		{
			valuelist=valuelist+pRecord->Value; 
		}
		//字段
		fldlist=fldlist+pRecord->FieldName;
		//判断,
		if(i!=RecordArray.GetSize()-1)
		{
			fldlist=fldlist+",";
			valuelist=valuelist+",";
		}
	}	
	sqlstr="insert into "+m_OprTblName+"("+fldlist+") values("+valuelist+")";
	return sqlstr;
}

CString CBMDialog::GenerateUpdateSql(void)
{
	CString sqlstr,updatestr,valuelist,constr;
	CFieldRecord* pRecord;
	ASSERT(m_OprTblName!=""); 
	
	pRecord=(CFieldRecord*)RecordArray.GetAt(0);
    if(pRecord->IsStrType)
	{
		valuelist="'";
		valuelist=valuelist+pRecord->Value;
		valuelist=valuelist+"'";
	}
	else
	{
		valuelist=pRecord->Value; 
	}
    constr="where ";
	constr=constr+pRecord->FieldName+"="+valuelist; 
	
	for(int i=1;i<RecordArray.GetSize();i++)
	{
		pRecord=	(CFieldRecord*)RecordArray.GetAt(i);
		//获得值
		if (pRecord->IsBool)
		{
			if(_stricmp(pRecord->Value,"是")==0) 
				valuelist="TRUE";
			else if(_stricmp(pRecord->Value,"否")==0)
				valuelist="FALSE";
			
		}
		else if(pRecord->IsStrType)
		{
			valuelist="'";
			valuelist=valuelist+pRecord->Value;
			valuelist=valuelist+"'";
		}
		else
		{
			valuelist=pRecord->Value; 
		}
		//字段
		updatestr=updatestr+pRecord->FieldName+"="+valuelist;
		//判断,
		if(i!=RecordArray.GetSize()-1)
		{
			updatestr=updatestr+",";
		}
	}
	
	sqlstr="update "+m_OprTblName+" set "+updatestr+" "+constr;
	return sqlstr;
}

void CBMDialog::OnAddRec()
{
	// TODO: 在此添加控件通知处理程序代码
	SendChangeMsg();	
}

void CBMDialog::CreateStatic(CFieldRecord* pRecord,int top,UINT CtlID)
{  	
	CStatic *pText;
    pText=new CStatic();
    pText->Create(pRecord->FieldName, WS_CHILD|WS_VISIBLE|SS_CENTER, 
		CRect(10,2+top, 110, 23+top), this,CtlID);
	pText->ShowWindow(SW_SHOW);
	pText->SetFont(GetFont());
}

void CBMDialog::CreateCombo(CFieldRecord* pRecord,int top,UINT CtlID)
{
	CComboBox* pCombo;
    pCombo=new CComboBox();
	pCombo->Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST,
		CRect(110,2+top, 250, 230+top), this, CtlID);
	pCombo->ShowWindow(SW_SHOW);
    pCombo->SetFont(GetFont());
	if(pRecord->IsBool)
	{
		pCombo->AddString("是");
		pCombo->AddString("否");
		if(ISADD)
		{
			pCombo->SetCurSel(0);
		}
		else//不是新增加
		{
			if(_stricmp(pRecord->Value,"TRUE")==0)
			{
				pCombo->SetCurSel(0);
			}
			else
			{
				pCombo->SetCurSel(1);
			}
		}
	}
	else//有外键
	{
		FillComboByDS(pRecord,pCombo);
	}
}

void CBMDialog::CreateEdit(CFieldRecord* pRecord,int top,UINT CtlID)
{
	CEdit *pEdit;
	pEdit=new CEdit();
	pEdit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE 
		| WS_TABSTOP | WS_BORDER,
		CRect(110,2+top, 250, 23+top), this, CtlID);
	pEdit->ShowWindow(SW_SHOW);
	pEdit->SetWindowText(pRecord->Value);
	pEdit->SetFont(GetFont());
}

void CBMDialog::FillComboByDS(CFieldRecord* pRecord,
							  CComboBox* pCombo)
{
	if(pRecord->pFK==NULL)
		return;
	storage1.OpenSql(pRecord->pFK->FKtbl);
	int count=storage1.GetRecordCount();
	if(count==0)
		return;
	CFldValue* pValue ; //用于添加记录指针
	CString value;      
	int index;         
	int selindex=-1;   //选择的记录(用于修改时)
	storage1.MoveFirst();
	
    for(int i=0;i<count;i++)
	{
		pValue=new CFldValue();  
		storage1.GetFieldValue(pRecord->pFK->FieldName,value);
		strcpy(pValue->FieldValue,value);
		storage1.GetFieldValue(pRecord->pFK->DisplayName,value);
		strcpy(pValue->DispalyFieldValue,value);
		index=pCombo->AddString(pValue->DispalyFieldValue);
		pCombo->SetItemDataPtr(index,pValue);
		//判断当前选项
		if(_stricmp(pValue->FieldValue,pRecord->Value)==0)
			selindex=index;
		storage1.MoveNext();
	}
	
	//判断
	if(ISADD)
	{
		pCombo->SetCurSel(0);
	}
	else//不是新增加,为修改时
	{
        pCombo->SetCurSel(selindex);
	}	
}

//发送修改或添加消息
void CBMDialog::SendChangeMsg(void)
{
	CWnd* pWnd;
	CString value,Msg;
	CFieldRecord* pRecord;
	for(int i=1;i<=RecordArray.GetSize();i++)
	{ 
		pWnd=GetDlgItem(10+i);
		
		if(pWnd)
		{
			pRecord=(CFieldRecord*)RecordArray.GetAt(i-1);
			if ((!pRecord->IsBool)&&pWnd->IsKindOf(
				RUNTIME_CLASS(CComboBox)))
			{  	 //非布尔类型,且有关联字段时
				CComboBox* pCombo=(CComboBox*) pWnd;
				CFldValue* p;
				int index=pCombo->GetCurSel();
				p=(CFldValue*)pCombo->GetItemDataPtr(index);
				value=p->FieldValue; 
			}
			else
				pWnd->GetWindowText(value);
			value.TrimRight(); 
			if(value=="")
			{
				Msg=(CString)pRecord->FieldName+"不能为空!"; 
				AfxMessageBox(Msg);
				pWnd->SetFocus();
				return;
			}
			else
			{
				if((i==1)&&(!ISADD))
				{//如果是修改的话,则不对第一字段操作
				}
				else
					strcpy(pRecord->Value,value); 
			}
		}		
	}
	
	//发送字符串
	CString cSend;
	if(ISADD)
	{ 
		cSend=GenerateInsertSql();		
	}
	else
	{
		cSend=GenerateUpdateSql();
	}
	LPARAM lparam=(LPARAM)&cSend; 
	::SendMessage((HWND)m_hParent,WM_UPDATELIST,0,lparam); 	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -