📄 addtbdlg1.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 + -