📄 addixdlg1.cpp
字号:
// AddIxDlg1.cpp : implementation file for dialog that lets user add
#include "stdafx.h"
#include "resource.h"
#include "listctrl.h"
#include "AddIxDlg1.h"
#include "tabledef.h"
#include "index.h"
#include "field.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAddIndexDlg dialog
// default constructor
CAddIndexDlg::CAddIndexDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAddIndexDlg::IDD, pParent)
{
initializer();
}
CAddIndexDlg::CAddIndexDlg(CDaoDatabase *pDatabase,
CString strTableName,
CWnd* pParent)
: CDialog(CAddIndexDlg::IDD, pParent)
{
initializer();
m_pTableDef = NULL;
m_pDatabase = pDatabase;
m_strTableName = strTableName;
}
void CAddIndexDlg::initializer()
{
indexInitializer();
m_bCheckDDV = TRUE;
m_nIndexIndex = 0;
}
void CAddIndexDlg::indexInitializer()
{
//{{AFX_DATA_INIT(CAddIndexDlg)
//}}AFX_DATA_INIT
// index info struct
m_II.m_strName = _T("");
m_II.m_bPrimary = FALSE;
m_II.m_bIgnoreNulls = FALSE;
m_II.m_bRequired = FALSE;
m_II.m_bUnique = FALSE;
if (m_II.m_pFieldInfos != NULL)
{
delete [] m_II.m_pFieldInfos;
m_II.m_pFieldInfos = NULL;
m_II.m_nFields = 0;
}
}
void CAddIndexDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAddIndexDlg)
DDX_Control(pDX, IDC_UNIQUE, m_UniqueControl);
DDX_Control(pDX, IDC_REQUIRED, m_RequiredControl);
DDX_Control(pDX, IDC_IGNORE_NULLS, m_IgnoreNullControl);
DDX_Control(pDX, IDC_PRIMARY, m_PrimaryControl);
DDX_Text(pDX, IDC_TABLE_NAME, m_strTableName);
//}}AFX_DATA_MAP
DDX_Check(pDX, IDC_PRIMARY, m_II.m_bPrimary);
DDX_Check(pDX, IDC_IGNORE_NULLS, m_II.m_bIgnoreNulls);
DDX_Check(pDX, IDC_REQUIRED, m_II.m_bRequired);
DDX_Check(pDX, IDC_UNIQUE, m_II.m_bUnique);
DDX_Text(pDX, IDC_INDEX_NAME, m_II.m_strName);
DDX_Control(pDX, IDC_FIELD_LIST, m_FieldListListControl);
if (m_bCheckDDV)
{
DDV_NoSel(pDX, &m_FieldListListControl);
}
}
void CAddIndexDlg::DDV_NoSel(CDataExchange* pDX, CListCtrl *theControl)
{
if (pDX->m_bSaveAndValidate)
{
int count = 0;
for (int i = 0; (count == 0) && (i < theControl->GetItemCount()); i++)
{
if (theControl->GetItemText(i, 1) != _T(""))
{
count += 1;
}
}
if (count == 0)
{
AfxMessageBox(_T("必须选择一个字段!"), MB_ICONEXCLAMATION);
pDX->m_hWndLastControl = theControl->m_hWnd;
pDX->Fail();
}
}
}
BEGIN_MESSAGE_MAP(CAddIndexDlg, CDialog)
//{{AFX_MSG_MAP(CAddIndexDlg)
ON_BN_CLICKED(IDOK, OnDone)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_ADD_INDEX, OnAddIndex)
ON_BN_CLICKED(IDC_DELETE_INDEX, OnDeleteIndex)
ON_BN_CLICKED(IDC_NEXT_INDEX, OnNextIndex)
ON_BN_CLICKED(IDC_PREVIOUS_INDEX, OnPreviousIndex)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAddIndexDlg message handlers
BOOL CAddIndexDlg::OnInitDialog()
{
CDialog::OnInitDialog();
LONG style = ::GetWindowLong(m_FieldListListControl.m_hWnd,GWL_STYLE);
::SetWindowLong(m_FieldListListControl.m_hWnd, GWL_STYLE,style | LVS_SHOWSELALWAYS);
CRect controlRect;
m_FieldListListControl.GetClientRect(controlRect);
int controlWidth = controlRect.Width();
int scrollThumbWidth = ::GetSystemMetrics(SM_CXHTHUMB);
int strWidth = m_FieldListListControl.GetStringWidth(_T("descending"));
strWidth += 12 * ::GetSystemMetrics(SM_CXBORDER);
m_FieldListListControl.InsertColumn(1, _T("Field"), LVCFMT_LEFT,
controlWidth - scrollThumbWidth - strWidth, 1);
m_FieldListListControl.InsertColumn(2, _T("Sort"), LVCFMT_LEFT, strWidth + scrollThumbWidth, 2);
if(openTableDef(m_pDatabase, &m_pTableDef, m_strTableName))
{
populateFieldList();
if(getIndexInfo(m_pTableDef, &m_II, m_nIndexIndex, FALSE))
{
disableControlsForExisting(TRUE);
setFieldListSelections();
UpdateData(FALSE);
}
}
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_INDEX_NAME);
if (pEdit != NULL)
{
pEdit->SetFocus();
return FALSE;
}
else
return TRUE; // return TRUE unless you set the focus to a control
}
void CAddIndexDlg::OnNextIndex()
{
m_bCheckDDV = FALSE;
UpdateData(TRUE);
m_bCheckDDV = TRUE;
if ((m_II.m_strName != _T("")) && (!IsExistentIndex(m_pTableDef, m_II.m_strName)))
if (IDYES != AfxMessageBox(_T("Current index will be ignored unless added. Continue anyway?"),
MB_YESNO))
return;
if (getIndexInfo(m_pTableDef, &m_II, m_nIndexIndex, FALSE))
m_nIndexIndex += 1;
if (getIndexInfo(m_pTableDef, &m_II, m_nIndexIndex, FALSE))
{
setFieldListSelections(FALSE);
disableControlsForExisting(TRUE);
}
else
{
indexInitializer();
setFieldListSelections(TRUE);
disableControlsForExisting(FALSE);
}
UpdateData(FALSE);
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_INDEX_NAME);
pEdit->SetFocus();
}
void CAddIndexDlg::OnPreviousIndex()
{
if (m_nIndexIndex >= 1)
{
int retCode = IDYES;
CString name;
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_INDEX_NAME);
pEdit->GetWindowText(name);
if (name.GetLength() != 0)
{
if (!IsExistentIndex(m_pTableDef, name))
retCode = AfxMessageBox(_T("Current index will be ignored unless added. Continue anyway?"),
MB_YESNO);
}
if (retCode == IDYES)
{
m_nIndexIndex -= 1;
if (getIndexInfo(m_pTableDef, &m_II, m_nIndexIndex, FALSE))
{
setFieldListSelections(FALSE);
disableControlsForExisting(TRUE);
}
else
{
indexInitializer();
setFieldListSelections(TRUE);
disableControlsForExisting(FALSE);
}
UpdateData(FALSE);
}
}
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_INDEX_NAME);
pEdit->SetFocus();
}
void CAddIndexDlg::OnDone()
{
int retCode = IDYES;
CString name;
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_INDEX_NAME);
pEdit->GetWindowText(name);
if (name.GetLength() != 0)
{
if (!IsExistentIndex(m_pTableDef, name))
retCode = AfxMessageBox(_T("Current index will be ignored unless added. Continue anyway?"),
MB_YESNO);
}
if (retCode == IDYES)
{
delete m_pTableDef;
CDialog::EndDialog(0);
}
}
void CAddIndexDlg::OnClose()
{
if (m_pTableDef->IsOpen())
m_pTableDef->Close();
delete m_pTableDef;
CDialog::OnClose();
}
void CAddIndexDlg::OnAddIndex()
{
if (!UpdateData(TRUE))
return;
if (!IsExistentIndex(m_pTableDef, m_II.m_strName))
{
createFieldArray(&(m_II.m_pFieldInfos), &(m_II.m_nFields));
if (!createNewIndex(m_pTableDef, &m_II))
return;
indexInitializer();
setFieldListSelections(TRUE);
UpdateData(FALSE);
m_nIndexIndex += 1;
}
else
{
AfxMessageBox(_T("Can't add index--it already exists in the TableDef."));
}
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_INDEX_NAME);
pEdit->SetFocus();
}
void CAddIndexDlg::OnDeleteIndex()
{
if (!UpdateData(TRUE))
return;
if (IsExistentIndex(m_pTableDef, m_II.m_strName))
{
if (IDYES == AfxMessageBox(_T("Delete current index?"), MB_YESNO))
{
if (deleteIndex(m_pTableDef, m_II.m_strName))
{
if (getIndexInfo(m_pTableDef, &m_II, m_nIndexIndex, FALSE))
{
setFieldListSelections(FALSE);
disableControlsForExisting(TRUE);
}
else
{
indexInitializer();
setFieldListSelections(TRUE);
disableControlsForExisting(FALSE);
}
UpdateData(FALSE);
}
}
}
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_INDEX_NAME);
pEdit->SetFocus();
}
void CAddIndexDlg::disableControlsForExisting(BOOL bDisable/* = TRUE*/)
{
m_UniqueControl.EnableWindow(!bDisable);
m_RequiredControl.EnableWindow(!bDisable);
m_IgnoreNullControl.EnableWindow(!bDisable);
m_PrimaryControl.EnableWindow(!bDisable);
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_INDEX_NAME);
pEdit->SetReadOnly(bDisable);
}
void CAddIndexDlg::populateFieldList()
{
CDaoFieldInfo fieldInfo;
BOOL bContinue = TRUE;
int itemIndex = 0;
for (int i = 0; bContinue; i++)
{
if (getFieldInfo(m_pTableDef, &fieldInfo, i, FALSE))
{
if ((fieldInfo.m_nType != dbLongBinary) &&
(fieldInfo.m_nType != dbMemo))
{
m_FieldListListControl.InsertItem(itemIndex, fieldInfo.m_strName);
m_FieldListListControl.SetItemText(itemIndex, 1, _T(""));
itemIndex += 1;
}
}
else
bContinue = FALSE;
}
}
void CAddIndexDlg::createFieldArray(CDaoIndexFieldInfo **ppFields, short *pnFields)
{
int limit = m_FieldListListControl.GetItemCount();
if ((*ppFields) != NULL)
delete [] (*ppFields);
(*ppFields) = new CDaoIndexFieldInfo[limit];
(*pnFields) = 0;
for (int i = 0; i < limit; i++)
{
if (m_FieldListListControl.GetItemText(i, 1) != _T(""))
{
(*ppFields)[(*pnFields)].m_strName = m_FieldListListControl.GetItemText(i, 0);
(*ppFields)[(*pnFields)].m_bDescending =
(m_FieldListListControl.GetItemText(i, 1) == _T("descending"));
(*pnFields) += 1;
}
}
}
void CAddIndexDlg::setFieldListSelections(BOOL bJustClear /* = FALSE*/)
{
int numStrings = m_FieldListListControl.GetItemCount();
int selection;
for (int i = 0; i < numStrings; i++)
{
m_FieldListListControl.SetItemState(i, 0, LVIS_SELECTED);
m_FieldListListControl.SetItemText(i, 1, _T(""));
}
if (!bJustClear)
{
LV_FINDINFO lvfi;
lvfi.flags = LVFI_STRING;
CString strSort;
for (int i = 0; i < m_II.m_nFields; i++)
{
lvfi.psz = m_II.m_pFieldInfos[i].m_strName;
selection = m_FieldListListControl.FindItem(&lvfi, -1);
m_FieldListListControl.SetItemState(selection, LVIS_SELECTED, LVIS_SELECTED);
strSort = m_II.m_pFieldInfos[i].m_bDescending ? _T("descending") : _T("ascending");
m_FieldListListControl.SetItemText(selection, 1, strSort);
}
UpdateData(FALSE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -