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

📄 addixdlg1.cpp

📁 VC6数据库开发指南
💻 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 + -