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

📄 demo2005dlg.cpp

📁 数据库管理软件,具有很多功能,应用DBS数据库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// demo2005Dlg.cpp : implementation file
//

#include "stdafx.h"
#include <afxdlgs.h>
#include "demo2005.h"
#include "demo2005Dlg.h"
#include "QuerySheet.h"
#include "StatSheet.h"


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


#define SwitchRcdOp(oldOp); \
	if( oldOp==_ADD ) {\
		m_staFieldCaption.SetWindowText(_T(""));\
		m_edFieldValue.EnableWindow(FALSE);\
		m_btnNextValue.EnableWindow(FALSE);\
	} else if( oldOp==_UPDATE ) {\
		m_edModifiedValue.ShowWindow(SW_HIDE);\
	}

char VERSION[] = "demo2005.01\0" ;
char* szFieldTypes[] = {"integer","double","date","time","string" };


/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDemo2005Dlg dialog

CDemo2005Dlg::CDemo2005Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDemo2005Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDemo2005Dlg)
	m_FieldName = _T("");
	m_FieldType = _T("");
	m_FieldLength = 0;
	m_FieldValue = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	// initialize variable for DBfile, mode, record
	ResetVariable();
}

void CDemo2005Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDemo2005Dlg)
	DDX_Control(pDX, IDC_TITLE, m_btnTitle);
	DDX_Control(pDX, IDC_FIELD_NAME, m_edFieldName);
	DDX_Control(pDX, IDC_FIELD_TYPE, m_cmbFieldType);
	DDX_Control(pDX, IDC_FIELD_LENGTH, m_edFieldLength);
	DDX_Control(pDX, IDC_MODE_LIST, m_modeList);
	DDX_Control(pDX, IDC_FIELD_ADD, m_btnFieldAdd);
	DDX_Control(pDX, IDC_FIELD_DELETE, m_btnFieldDelete);
	DDX_Control(pDX, IDC_FIELD_MODIFY, m_btnFieldModify);
	DDX_Text(pDX, IDC_FIELD_NAME, m_FieldName);
	DDX_CBString(pDX, IDC_FIELD_TYPE, m_FieldType);
	DDX_Text(pDX, IDC_FIELD_LENGTH, m_FieldLength);
	DDX_Control(pDX, IDC_FIELD_CAPTION, m_staFieldCaption);
	DDX_Control(pDX, IDC_FIELD_VALUE, m_edFieldValue);
	DDX_Control(pDX, IDC_RECORD_LIST, m_recordList);
	DDX_Control(pDX, IDC_NEXT_VALUE, m_btnNextValue);
	DDX_Text(pDX, IDC_FIELD_VALUE, m_FieldValue);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDemo2005Dlg, CDialog)
	//{{AFX_MSG_MAP(CDemo2005Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_COMMAND(IDM_ABOUT, OnAbout)
	ON_COMMAND(IDM_EXIT, OnExit)
	ON_COMMAND(IDM_DB_NEW, OnDbNew)
	ON_COMMAND(IDM_DB_OPEN, OnDbOpen)
	ON_COMMAND(IDM_DB_CLOSE, OnDbClose)
	ON_COMMAND(IDM_MODE_EDIT, OnModeEdit)
	ON_COMMAND(IDM_MODE_SAVE, OnModeSave)
	ON_BN_CLICKED(IDC_FIELD_ADD, OnFieldAdd)
	ON_BN_CLICKED(IDC_FIELD_DELETE, OnFieldDelete)
	ON_BN_CLICKED(IDC_FIELD_MODIFY, OnFieldModify)
	ON_CBN_SELCHANGE(IDC_FIELD_TYPE, OnSelchangeFieldType)
	ON_NOTIFY(NM_CLICK, IDC_MODE_LIST, OnClickModeList)
	ON_COMMAND(IDM_RECORD_ADD, OnRecordAdd)
	ON_COMMAND(IDM_RECORD_DELETE, OnRecordDelete)
	ON_COMMAND(IDM_RECORD_UPDATE, OnRecordUpdate)
	ON_COMMAND(IDM_RECORD_SAVE, OnRecordSave)
	ON_BN_CLICKED(IDC_NEXT_VALUE, OnNextValue)
	ON_NOTIFY(NM_DBLCLK, IDC_RECORD_LIST, OnDblclkRecordList)
	ON_COMMAND(IDM_QUERY, OnQuery)
	ON_COMMAND(IDM_STATISTIC, OnStatistic)
	ON_COMMAND(IDM_BROWSE, OnBrowse)
	ON_BN_CLICKED(IDOK, OnOK)
	ON_EN_CHANGE(IDC_FIELD_NAME, OnChangeFieldName)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDemo2005Dlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon


	// Sets the current extended styles for mode-list, record-list
	m_modeList.SetExtendedStyle( m_modeList.GetExtendedStyle() | LVS_EX_GRIDLINES
								| LVS_EX_ONECLICKACTIVATE | LVS_EX_FULLROWSELECT );

	m_recordList.SetExtendedStyle( m_recordList.GetExtendedStyle() | LVS_EX_GRIDLINES 
								| LVS_EX_ONECLICKACTIVATE | LVS_EX_HEADERDRAGDROP );
	// 选中 singleSelection选项

	m_staFieldCaption.SetWindowText( _T("") );

	// 
	m_edModifiedValue.Create( WS_CHILD| WS_TABSTOP| WS_BORDER| ES_LEFT| ES_AUTOHSCROLL, //| WS_VISIBLE
				CRect(0, 18, 100, 33), (CWnd *)&m_recordList, IDC_MODIFIED_VALUE);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CDemo2005Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CDemo2005Dlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CDemo2005Dlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}


void CDemo2005Dlg::OnAbout() 
{
	// 发送系统消息IDM_ABOUTBOX
	OnSysCommand(IDM_ABOUTBOX, 0);
}


void CDemo2005Dlg::OnExit() 
{
	if(m_fhd)
	{
		AfxMessageBox("There is a file opened, close it first!", MB_OK|MB_ICONERROR);
		return;
	}

	// post windowMessage WM_QUIT
	PostMessage(WM_QUIT,0,0);
}


/*********************************************************
 * functions for DB file *
 *********************************************************/

// 新建一个数据库文件
void CDemo2005Dlg::OnDbNew() 
{
	CString sztmp;

	if(m_fhd)
	{
		AfxMessageBox("There is a file opened, close it first!", MB_OK|MB_ICONERROR);
		return;
	}

	// Show SaveAs FileDialog
	CFileDialog fdlg(FALSE, NULL, NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,
					 "DBS files (*.dbs)|*.DBS|all files (*.*)|*.*||", NULL);

	if( fdlg.DoModal()==IDOK )
	{
		// Create a new file
		sztmp = fdlg.GetPathName(); // get dbFile name
		strcpy( m_fileName, sztmp.GetBuffer(sztmp.GetLength()) );
		m_fhd = fopen(m_fileName,"w+b");
		if(!m_fhd)
		{
			sztmp = "Failed to create file \"";
			sztmp += m_fileName;
			sztmp += "\" !";
			AfxMessageBox(sztmp, MB_OK|MB_ICONERROR);
			return;
		}

		// Enable mode-menu
		CMenu* mmenu = GetMenu();
		CMenu* submenu = mmenu->GetSubMenu(1);
		submenu->EnableMenuItem(IDM_MODE_EDIT, MF_BYCOMMAND | MF_ENABLED);
		submenu->EnableMenuItem(IDM_MODE_SAVE, MF_BYCOMMAND | MF_ENABLED);

	}
	
}


// 打开数据库文件
void CDemo2005Dlg::OnDbOpen() 
{
	CString sztmp;
	char ptmp[32];

	if(m_fhd)
	{
		AfxMessageBox("There is a file opened, close it first!", MB_OK|MB_ICONERROR);
		return;
	}

	// Show Open FileDialog
	CFileDialog fdlg(TRUE, NULL, NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,
				"DBS files (*.dbs)|*.DBS|View files(*.view)|*.VIEW|all files (*.*)|*.*||",
				NULL);

	if( fdlg.DoModal()==IDOK )
	{
		/*** open file ***/
		strcpy( m_fileName, (char*)(LPCTSTR)(fdlg.GetPathName()) );// dbFile name
		m_fhd = fopen(m_fileName,"r+b");
		if(m_fhd==NULL)
		{
			sztmp = "Failed to open file \"";
			sztmp += m_fileName;
			sztmp += "\" !";
			AfxMessageBox(sztmp);
		}

		/*** check file validity ??????***/
		fseek(m_fhd,0L,SEEK_END);
		if( ftell(m_fhd) < sizeof(struct fileHeader) )
		{
			AfxMessageBox("This isn't a valid dbs file!");
			OnDbClose();
			return;
		}
		fseek(m_fhd,0L,SEEK_SET);

		fread((void*)ptmp,sizeof(char),32,m_fhd);
		if( strcmp(ptmp,VERSION)==0 )
		{
			m_btnTitle.SetWindowText(" 记  录 ");

			// Enable record-menu
			CMenu* mmenu = GetMenu();
			CMenu* submenu = mmenu->GetSubMenu(2);
			submenu->EnableMenuItem(IDM_RECORD_ADD, MF_BYCOMMAND | MF_ENABLED);
			submenu->EnableMenuItem(IDM_RECORD_DELETE, MF_BYCOMMAND | MF_ENABLED);
			submenu->EnableMenuItem(IDM_RECORD_UPDATE, MF_BYCOMMAND | MF_ENABLED);
			submenu->EnableMenuItem(IDM_RECORD_SAVE, MF_BYCOMMAND | MF_ENABLED);

		}
		else if( strcmp(ptmp,"VIEW.demo2005.01\0")==0 )
		{
			m_btnTitle.SetWindowText(" 视  图 ");

			// Disable record-menu
			CMenu* mmenu = GetMenu();
			CMenu* submenu = mmenu->GetSubMenu(2);
			submenu->EnableMenuItem(IDM_RECORD_ADD, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
			submenu->EnableMenuItem(IDM_RECORD_DELETE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
			submenu->EnableMenuItem(IDM_RECORD_UPDATE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
			submenu->EnableMenuItem(IDM_RECORD_SAVE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);

		}
		else
		{
			AfxMessageBox("This isn't a valid dbs file!");
			OnDbClose();
			return;
		}
		fseek(m_fhd,0L,SEEK_SET);

		/*** read file_header ***/
		fread((void*)&m_fileHeader,sizeof(struct fileHeader),1,m_fhd);
		fcnt = m_fileHeader.fcnt;
		rcnt = m_fileHeader.rcnt;


		/*** read field_description ***/
		pFieldDsc = (fieldDesc *)malloc( sizeof(fieldDesc)*fcnt );
		if( !pFieldDsc )
		{
			AfxMessageBox("Memory error!");
			OnDbClose();
			return;
		}
		fread((void*)pFieldDsc,sizeof(fieldDesc),fcnt,m_fhd);

		// set column header for mode_list
		SetModelistHeader();

		// Show the information of fields in m_modeList
		ShowAllFields();

	
		/*** read and show records ***/
		OnBrowse();
	}

}


// 关闭数据库文件
void CDemo2005Dlg::OnDbClose() 
{
	CString tmp;

	if(!m_fhd)
	{
		AfxMessageBox("There isn't any file opened!");
		return;
	}

	// has the mode been edited?
	if( beModeEdit )
	{
		if( AfxMessageBox("The mode hasn't been saved.\r\nDo you want to save it first?",
			MB_YESNO | MB_ICONQUESTION)==IDYES )
		OnModeSave();
	}


	// have we operated the record before ?
	if( rop==_ADD || rop==_DELETE || rop==_UPDATE )
	{
		if( AfxMessageBox("The record hasn't been saved.\r\nDo you want to save it first?",
						  MB_YESNO | MB_ICONQUESTION) == IDYES )
			OnRecordSave();
	}

	// no record operation
	SwitchRcdOp(rop);
	rop = _NOTOPERATED;


	// close DBfile
	if( fclose(m_fhd) )
	{
		tmp = "Failed to close file \"";
		tmp += m_fileName;
		tmp += "\" !";
		AfxMessageBox(tmp, MB_OK|MB_ICONERROR);
		return;
	}
	else
		m_fhd = NULL;

	if( pFieldDsc )
	{
		free(pFieldDsc);
		pFieldDsc = NULL;
	}

	// Disable mode-menu
	CMenu* mmenu = GetMenu();
	CMenu* submenu = mmenu->GetSubMenu(1);
	submenu->EnableMenuItem(IDM_MODE_EDIT, MF_BYCOMMAND | MF_DISABLED);
	submenu->EnableMenuItem(IDM_MODE_SAVE, MF_BYCOMMAND | MF_DISABLED);

	// clear up m_modeList, m_recordList
	ClearModelist();
	ClearRecordlist();

	
	// Reset variable for DBfile, mode, record
	ResetVariable();

}


/*********************************************************
 * functions for mode *
 *********************************************************/

// begin to edit DBmode
void CDemo2005Dlg::OnModeEdit() 
{

	if(!m_fhd)
	{
		AfxMessageBox("There isn't any file opened!");
		return;
	}

	// set valiable for keeping field information
	fcnt = 0; // field count
	pFieldDsc = (fieldDesc *)malloc( maxFcnt*sizeof(fieldDesc) );


	// set column header for mode_list
	SetModelistHeader();

	// Enable controls for editing mode
	m_btnFieldAdd.EnableWindow(TRUE);
	m_btnFieldDelete.EnableWindow(TRUE);
	m_btnFieldModify.EnableWindow(TRUE);

	// set focus for fieldName-edit

⌨️ 快捷键说明

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