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

📄 addtbdlg1.cpp

📁 VC6数据库开发指南
💻 CPP
字号:
#include "stdafx.h"
#include "resource.h"
#include "tabledef.h"
#include "field.h"
#include "AddTbDlg1.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
CDlgAddTable::CDlgAddTable(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgAddTable::IDD, pParent)
{
	initializer();
}

CDlgAddTable::CDlgAddTable(CDaoDatabase *pDatabase, CString strTableName,
						   CWnd * pParent)
	: CDialog(CDlgAddTable::IDD, pParent)
{
	m_pDatabase = pDatabase;

	m_strTableName = strTableName;

	initializer();
}

void CDlgAddTable::initializer()
{
	fieldInitializer(TRUE);

	m_bFirstFieldAdded = FALSE;
	m_bCheckDDV = TRUE;
	m_pTableDef = NULL;

	m_nFieldIndex = 0;

	m_nTypeMap[Boolean] = dbBoolean;
	m_nTypeMap[Byte] = dbByte;
	m_nTypeMap[Currency] = dbCurrency;
	m_nTypeMap[Date] = dbDate;
	m_nTypeMap[Double] = dbDouble;
	m_nTypeMap[Long] = dbLong;
	m_nTypeMap[LongBinary] = dbLongBinary;
	m_nTypeMap[Memo] = dbMemo;
	m_nTypeMap[Short] = dbInteger;  
	m_nTypeMap[Single] = dbSingle;
	m_nTypeMap[Text] = dbText;
}

void CDlgAddTable::fieldInitializer(BOOL bInitOrdPos /* = TRUE */)
{
	if (bInitOrdPos)
		m_FI.m_nOrdinalPosition = 0;

	m_FI.m_strName = _T("");
	m_FI.m_nType = -1;      
	m_FI.m_lSize = 0;
	m_FI.m_strDefaultValue = _T("");
	m_FI.m_bRequired = FALSE;
	m_FI.m_lAttributes = dbUpdatableField;
#if _MFC_VER == 0x400
	m_FI.m_bAllowZeroLength = TRUE;
#else
	m_FI.m_bAllowZeroLength = FALSE;
#endif;
	m_FI.m_strValidationRule = _T("");
	m_FI.m_strValidationText = _T("");
}

void CDlgAddTable::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgAddTable)
	DDX_Control(pDX, IDC_VALIDATION_TEXT, m_ValidationTextControl);
	DDX_Control(pDX, IDC_VALIDATION_RULE, m_ValidationRuleControl);
	DDX_Control(pDX, IDC_REQUIRED, m_RequireControl);
	DDX_Control(pDX, IDC_POSITION, m_OrdinalPositionControl);
	DDX_Control(pDX, IDC_NAME, m_NameControl);
	DDX_Control(pDX, IDC_THE_SIZE, m_SizeControl);
	DDX_Control(pDX, IDC_DEFAULT_VALUE, m_DefaultValueControl);
	DDX_Control(pDX, IDC_AUTO_INCR_FIELD, m_AutoIncrFieldControl);
	DDX_Control(pDX, IDC_FIXED_FIELD, m_FieldVariabilityControl);
	DDX_Text(pDX, IDC_TABLE_NAME, m_strTableName);
	//}}AFX_DATA_MAP


	DDX_Control(pDX, IDC_TYPE, m_TypeControl);
	if (m_bCheckDDV)
		DDV_NoSel(pDX, &m_TypeControl);

	DDX_Text(pDX, IDC_POSITION, m_FI.m_nOrdinalPosition);
	DDX_Text(pDX, IDC_NAME, m_FI.m_strName);
	DDX_Text(pDX, IDC_VALIDATION_RULE, m_FI.m_strValidationRule);
	DDX_Text(pDX, IDC_VALIDATION_TEXT, m_FI.m_strValidationText);
	DDX_Text(pDX, IDC_THE_SIZE, m_FI.m_lSize);
	DDX_Text(pDX, IDC_DEFAULT_VALUE, m_FI.m_strDefaultValue);
	DDX_Check(pDX, IDC_REQUIRED, m_FI.m_bRequired);

	if (pDX->m_bSaveAndValidate)
	{
		theTypes selectedType = (theTypes) m_TypeControl.GetCurSel();
		m_FI.m_nType = m_nTypeMap[selectedType];
	}
	else
	{
		if (m_FI.m_nType == -1)
		{
			m_TypeControl.SetCurSel(m_FI.m_nType);
		}
		else
		{
			for (int i = 0; (i < MAX_TYPES) && (m_nTypeMap[i] != m_FI.m_nType); i++)
				;

			m_TypeControl.SetCurSel(i);
		}
	}

	if (pDX->m_bSaveAndValidate)
	{
		DDX_Radio(pDX, IDC_FIXED_FIELD, m_FieldVariability);
		DDX_Check(pDX, IDC_AUTO_INCR_FIELD, m_bAutoIncrField);

		if (m_bAutoIncrField)
			m_FI.m_lAttributes |= dbAutoIncrField;
		else
			m_FI.m_lAttributes &= ~dbAutoIncrField;

		if (m_FI.m_nType == dbText)
			if (m_FieldVariability == 0)
				m_FI.m_lAttributes |= dbFixedField;
			else
				m_FI.m_lAttributes |= dbVariableField;
	}
	else
	{
		m_bAutoIncrField = (m_FI.m_lAttributes & dbAutoIncrField) == dbAutoIncrField;

		if ((m_FI.m_lAttributes & dbFixedField) == dbFixedField)
			m_FieldVariability = 0;
		else
			m_FieldVariability = 1;

		DDX_Radio(pDX, IDC_FIXED_FIELD, m_FieldVariability);
		DDX_Check(pDX, IDC_AUTO_INCR_FIELD, m_bAutoIncrField);
	}
}

void CDlgAddTable::DDV_NoSel(CDataExchange* pDX, CComboBox *theControl)
{
	if (pDX->m_bSaveAndValidate && (CB_ERR == theControl->GetCurSel()))
	{
		AfxMessageBox(_T("必须选择数据类型!"), MB_ICONEXCLAMATION);
		pDX->m_hWndLastControl = theControl->m_hWnd;
		pDX->Fail();
	}
}

BEGIN_MESSAGE_MAP(CDlgAddTable, CDialog)
	//{{AFX_MSG_MAP(CDlgAddTable)
	ON_BN_CLICKED(IDC_NEXT_FIELD, OnNextField)
	ON_CBN_SELENDOK(IDC_TYPE, OnSelendokType)
	ON_BN_CLICKED(IDOK, OnDone)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_PREVIOUS_FIELD, OnPreviousField)
	ON_BN_CLICKED(IDC_DELETE_FIELD, OnDeleteField)
	ON_BN_CLICKED(IDC_ADD_FIELD, OnAddField)
	ON_CBN_CLOSEUP(IDC_TYPE, OnCloseupType)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgAddTable message handlers

BOOL CDlgAddTable::OnInitDialog()
{
	CDialog::OnInitDialog();

	if(!IsExistentTable(m_pDatabase, m_strTableName))
	{
		m_SizeControl.EnableWindow(FALSE);

		CButton *pButton = (CButton *)GetDlgItem(IDOK);
		pButton->EnableWindow(FALSE);
	}
	else
	{
		if (!openTableDef(m_pDatabase, &m_pTableDef, m_strTableName))
			return TRUE;

		if (getFieldInfo(m_pTableDef, &m_FI, m_nFieldIndex, FALSE))
		{
			setTypeDependentStatesAndExisting(m_FI.m_nType, TRUE);
		}
		else
		{
			fieldInitializer(FALSE);
			setTypeDependentStatesAndExisting(m_FI.m_nType, FALSE);
		}

		m_bFirstFieldAdded = TRUE;

		UpdateData(FALSE);
	}

	CEdit *pEdit = (CEdit *)GetDlgItem(IDC_NAME);
	pEdit->SetFocus();

	CSpinButtonCtrl* pOrdPosSpin =
		(CSpinButtonCtrl*) GetDlgItem(IDC_SPIN_ORDINAL_POSITION);
	pOrdPosSpin->SetRange(0,100);

	return FALSE; 
}

void CDlgAddTable::OnNextField()
{
	m_bCheckDDV = FALSE;    // turn validity checking off
	UpdateData(TRUE);
	m_bCheckDDV = TRUE;     // turn checking back on--don't forget this!

	if ((m_FI.m_strName != _T("")) && (!IsExistentField(m_pTableDef, m_FI.m_strName)))
		if (IDYES != AfxMessageBox(_T("当前字段如不添加,则被忽略,是否继续?"),
								MB_YESNO))
			return;

	if (getFieldInfo(m_pTableDef, &m_FI, m_nFieldIndex, FALSE))
		m_nFieldIndex += 1;

	if (getFieldInfo(m_pTableDef, &m_FI, m_nFieldIndex, FALSE))
	{
		setTypeDependentStatesAndExisting(m_FI.m_nType, TRUE);
	}
	else
	{
		fieldInitializer(FALSE);

		m_FI.m_nOrdinalPosition = m_nFieldIndex;

		setTypeDependentStatesAndExisting(m_FI.m_nType, FALSE);
	}

	UpdateData(FALSE);

	CEdit *pEdit = (CEdit *)GetDlgItem(IDC_NAME);
	pEdit->SetFocus();
}

void CDlgAddTable::OnSelendokType()
{
	m_bCheckDDV = FALSE;   
	UpdateData(TRUE);
	m_bCheckDDV = TRUE;   

	m_SizeControl.EnableWindow();

	setTypeDependentStatesAndExisting(m_FI.m_nType, FALSE);

	UpdateData(FALSE);
}

void CDlgAddTable::OnCloseupType()
{
	OnSelendokType();
}


void CDlgAddTable::OnDone()
{
	int retCode = IDYES;

	CString name;
	CEdit *pEdit = (CEdit *)GetDlgItem(IDC_NAME);
	pEdit->GetWindowText(name);
	if (name.GetLength() != 0)
	{
		if (!IsExistentField(m_pTableDef, name))
			retCode = AfxMessageBox(_T("当前字段如不添加,则被忽略,是否继续?"),
								MB_YESNO);
	}
	if (retCode == IDYES)
	{
		delete m_pTableDef;

		CDialog::EndDialog(0);
	}
}

void CDlgAddTable::OnClose()
{
	if (m_pTableDef != NULL)
		delete m_pTableDef;

	CDialog::OnClose();
}

void CDlgAddTable::OnPreviousField()
{
	if (m_nFieldIndex >= 1)
	{
		m_bCheckDDV = FALSE;    
		UpdateData(TRUE);
		m_bCheckDDV = TRUE;     

		int retCode = IDYES;

		if (m_FI.m_strName != _T(""))
		{
			if (!IsExistentField(m_pTableDef, m_FI.m_strName))
				retCode = AfxMessageBox(_T("当前字段如不添加,则被忽略,是否继续?"),
									MB_YESNO);
		}

		if (retCode == IDYES)
		{
			m_nFieldIndex -= 1;

			if(getFieldInfo(m_pTableDef, &m_FI, m_nFieldIndex, FALSE))
			{
				setTypeDependentStatesAndExisting(m_FI.m_nType, TRUE);
			}
			else
			{
				fieldInitializer(FALSE);

				m_FI.m_nOrdinalPosition = m_nFieldIndex;

				setTypeDependentStatesAndExisting(m_FI.m_nType, FALSE);
			}

			UpdateData(FALSE);
		}
	}
}

void CDlgAddTable::OnDeleteField()
{
	if (!UpdateData(TRUE))
		return;

	if (IsExistentField(m_pTableDef, m_FI.m_strName))
	{
		if (IDYES == AfxMessageBox(_T("Delete current field?"), MB_YESNO))
		{
			if (deleteField(m_pTableDef, m_FI.m_strName))
			{
				if (getFieldInfo(m_pTableDef, &m_FI, m_nFieldIndex, FALSE))
				{
					setTypeDependentStatesAndExisting(m_FI.m_nType, TRUE);
				}
				else
				{
					fieldInitializer(FALSE);

					setTypeDependentStatesAndExisting(m_FI.m_nType, FALSE);
				}

				UpdateData(FALSE);
			}
		}
	}
}

void CDlgAddTable::setTypeDependentStatesAndExisting(int theType, BOOL bExistingField)
{
	if (theType == dbLong)
		m_AutoIncrFieldControl.EnableWindow(TRUE && (!bExistingField));
	else
		m_AutoIncrFieldControl.EnableWindow(FALSE);

	if (theType == dbText)
	{
		CButton *pButton = (CButton *)GetDlgItem(IDC_FIXED_FIELD);
		pButton->EnableWindow(!bExistingField);
		pButton = (CButton *)GetDlgItem(IDC_VARIABLE_FIELD);
		pButton->EnableWindow(!bExistingField);
	}
	else
	{
		CButton *pButton = (CButton *)GetDlgItem(IDC_FIXED_FIELD);
		pButton->EnableWindow(FALSE);
		pButton = (CButton *)GetDlgItem(IDC_VARIABLE_FIELD);
		pButton->EnableWindow(FALSE);
	}

	m_DefaultValueControl.EnableWindow(TRUE && (!bExistingField));

	m_ValidationTextControl.SetReadOnly(bExistingField);
	m_ValidationRuleControl.SetReadOnly(bExistingField);

	switch(theType)
	{
		case dbBoolean:
		case dbByte:    m_SizeControl.SetReadOnly();
						m_FI.m_lSize = 1;
						m_FI.m_lAttributes &= ~dbVariableField;
						m_FI.m_lAttributes |= dbFixedField;
						break;
		case dbInteger: m_SizeControl.SetReadOnly();
						m_FI.m_lSize = 2;
						m_FI.m_lAttributes &= ~dbVariableField;
						m_FI.m_lAttributes |= dbFixedField;
						break;
		case dbLong:
		case dbSingle:  m_SizeControl.SetReadOnly();
						m_FI.m_lSize = 4;
						m_FI.m_lAttributes &= ~dbVariableField;
						m_FI.m_lAttributes |= dbFixedField;
						break;
		case dbCurrency:
		case dbDate:
		case dbDouble:  m_SizeControl.SetReadOnly();
						m_FI.m_lSize = 8;
						m_FI.m_lAttributes &= ~dbVariableField;
						m_FI.m_lAttributes |= dbFixedField;
						break;
		case dbText:    m_SizeControl.SetReadOnly(FALSE | bExistingField);
						m_FI.m_lAttributes &= ~dbFixedField;
						m_FI.m_lAttributes |= dbVariableField;
						break;
		case dbLongBinary:
						m_SizeControl.SetReadOnly(FALSE | bExistingField);
						m_FI.m_lAttributes &= ~dbFixedField;
						m_FI.m_lAttributes |= dbVariableField;
						break;
		case dbMemo:    m_SizeControl.SetReadOnly(FALSE | bExistingField);
						m_FI.m_lAttributes &= ~dbFixedField;
						m_FI.m_lAttributes |= dbVariableField;
						break;
	}
	m_NameControl.SetReadOnly(bExistingField);
	m_OrdinalPositionControl.SetReadOnly(bExistingField);
	m_TypeControl.EnableWindow(!bExistingField);
	m_RequireControl.EnableWindow(!bExistingField);

	UpdateData(FALSE);
}

void CDlgAddTable::OnAddField()
{
	if (!UpdateData(TRUE))
		return;

	if (!IsExistentField(m_pTableDef, m_FI.m_strName))
	{
		if (!m_bFirstFieldAdded)
		{
			if (!createNewTableDef(m_pDatabase, &m_pTableDef, m_strTableName))
				return;
		}

		if (!createNewField(m_pTableDef, &m_FI))
		{
			if (!m_bFirstFieldAdded)
				deleteTable(m_pDatabase, m_strTableName);
			return;
		}

		if (!m_bFirstFieldAdded)
		{
			if (!appendTableDef(m_pDatabase, m_pTableDef))
			{
				deleteField(m_pTableDef, m_FI.m_strName);

				deleteTable(m_pDatabase, m_strTableName);

				return;
			}
			else
				m_bFirstFieldAdded = TRUE;

			CButton *pButton = (CButton *)GetDlgItem(IDOK);
			pButton->EnableWindow(TRUE);
		}

		fieldInitializer(FALSE);

		m_FI.m_nOrdinalPosition += 1;
		m_nFieldIndex += 1;

		UpdateData(FALSE);
	}
	else
	{
		AfxMessageBox(_T("不能添加字段,该字段已经存在!"));
	}

	CEdit *pEdit = (CEdit *)GetDlgItem(IDC_NAME);
	pEdit->SetFocus();
}

⌨️ 快捷键说明

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