📄 daoview.cpp
字号:
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#ifdef AFX_DB_SEG
#pragma code_seg(AFX_DB_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CDaoRecordView, CFormView)
BEGIN_MESSAGE_MAP(CDaoRecordView, CFormView)
//{{AFX_MSG_MAP(CDaoRecordView)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
ON_COMMAND_EX(ID_RECORD_FIRST, OnMove)
ON_UPDATE_COMMAND_UI(ID_RECORD_FIRST, OnUpdateRecordFirst)
ON_COMMAND_EX(ID_RECORD_PREV, OnMove)
ON_UPDATE_COMMAND_UI(ID_RECORD_PREV, OnUpdateRecordPrev)
ON_COMMAND_EX(ID_RECORD_NEXT, OnMove)
ON_UPDATE_COMMAND_UI(ID_RECORD_NEXT, OnUpdateRecordNext)
ON_COMMAND_EX(ID_RECORD_LAST, OnMove)
ON_UPDATE_COMMAND_UI(ID_RECORD_LAST, OnUpdateRecordLast)
END_MESSAGE_MAP()
CDaoRecordView::CDaoRecordView(LPCTSTR lpszTemplateName)
: CFormView(lpszTemplateName)
{
m_nStatus = 0;
// Setup dummy bookmarks
m_varBookmarkCurrent = 1L;
m_varBookmarkFirst = m_varBookmarkLast = 0L;
}
CDaoRecordView::CDaoRecordView(UINT nIDTemplate)
: CFormView(nIDTemplate)
{
m_nStatus = 0;
// Setup dummy bookmarks
m_varBookmarkCurrent = 1L;
m_varBookmarkFirst = m_varBookmarkLast = 0L;
}
CDaoRecordView::~CDaoRecordView()
{
}
void CDaoRecordView::OnInitialUpdate()
{
ASSERT_VALID(this);
CDaoRecordset* pRecordset = OnGetRecordset();
// recordset must be allocated already
ASSERT(pRecordset != NULL);
if (!pRecordset->IsOpen())
{
CWaitCursor wait;
pRecordset->Open();
}
if (!pRecordset->IsEOF())
{
// Determine recordset properties for move button enabling
if (pRecordset->CanBookmark())
{
// Get the bookmark of the first record
m_varBookmarkCurrent = pRecordset->GetBookmark();
m_varBookmarkFirst = m_varBookmarkCurrent;
}
// Enable forward scrolling buttons
m_nStatus |= AFX_DAOVIEW_SCROLL_NEXT;
// Enable backward scrolling buttons if possible
if (pRecordset->CanScroll())
{
m_nStatus |= AFX_DAOVIEW_SCROLL_LAST;
m_nStatus |= AFX_DAOVIEW_SCROLL_BACKWARD;
}
else
{
m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
}
}
else
{
// Disable scrolling
m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
}
CFormView::OnInitialUpdate();
}
BOOL CDaoRecordView::OnMove(UINT nIDMoveCommand)
{
ASSERT_VALID(this);
CDaoRecordset* pSet = OnGetRecordset();
if (pSet->CanUpdate())
{
pSet->Edit();
if (!UpdateData())
return TRUE;
if (pSet->IsFieldDirty(NULL))
pSet->Update();
else
pSet->CancelUpdate();
}
BOOL bBookmarkable = pSet->CanBookmark();
BOOL bScrollable = pSet->CanScroll();
switch (nIDMoveCommand)
{
case ID_RECORD_PREV:
pSet->MovePrev();
if (!pSet->IsBOF())
{
if (bBookmarkable)
m_varBookmarkCurrent = pSet->GetBookmark();
// Enable forward scrolling
m_nStatus |= AFX_DAOVIEW_SCROLL_NEXT;
if (bScrollable)
{
m_nStatus |= AFX_DAOVIEW_SCROLL_LAST;
if (IsOnFirstRecord())
// Disable backward scrolling
m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
else
m_nStatus |= AFX_DAOVIEW_SCROLL_BACKWARD;
}
else
{
m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
}
break;
}
// Fall through to reset to first record
case ID_RECORD_FIRST:
pSet->MoveFirst();
// backward scrolling never allowed after movefirst
m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
if (pSet->IsEOF())
{
// Empty recordset, disable forward too
m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
}
else
{
if (bBookmarkable)
{
m_varBookmarkCurrent = pSet->GetBookmark();
m_varBookmarkFirst = m_varBookmarkCurrent;
}
// Enable forward scrolling
m_nStatus |= AFX_DAOVIEW_SCROLL_NEXT;
if (bScrollable)
m_nStatus |= AFX_DAOVIEW_SCROLL_LAST;
else
m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
}
break;
case ID_RECORD_NEXT:
pSet->MoveNext();
if (!pSet->IsEOF())
{
if (bBookmarkable)
m_varBookmarkCurrent = pSet->GetBookmark();
if (IsOnLastRecord())
{
// Disable forward scrolling
m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
}
else
{
m_nStatus |= AFX_DAOVIEW_SCROLL_NEXT;
m_nStatus |= AFX_DAOVIEW_SCROLL_LAST;
}
if (bScrollable)
m_nStatus |= AFX_DAOVIEW_SCROLL_BACKWARD;
else
{
m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
}
break;
}
// Can't fall through to move last
if (!bScrollable)
{
// At the end of forward only recordset
m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
break;
}
// Fall through to reset to last record
case ID_RECORD_LAST:
pSet->MoveLast();
// forward scrolling never allowed after movelast
m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
if (pSet->IsBOF())
{
// Empty recordset, disable backward too
m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
}
else
{
if (bBookmarkable)
{
m_varBookmarkCurrent = pSet->GetBookmark();
m_varBookmarkLast = m_varBookmarkCurrent;
}
// Enable backward scrolling
if (bBookmarkable)
m_nStatus |= AFX_DAOVIEW_SCROLL_BACKWARD;
else
m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
}
break;
default:
// Unexpected case value
ASSERT(FALSE);
}
// Show results of move operation
UpdateData(FALSE);
return TRUE;
}
BOOL CDaoRecordView::IsOnFirstRecord()
{
ASSERT_VALID(this);
return (m_varBookmarkCurrent == m_varBookmarkFirst);
}
BOOL CDaoRecordView::IsOnLastRecord()
{
ASSERT_VALID(this);
return (m_varBookmarkCurrent == m_varBookmarkLast);
}
/////////////////////////////////////////////////////////////////////////////
// DDX Cover functions for use with fields of a recordset
/////////////////////////////////////////////////////////////////////////////
// Simple field formatting to text item
BOOL AFXAPI AfxFieldText(CDataExchange* pDX, int nIDC, void* pv,
CDaoRecordset* pRecordset)
{
ASSERT_VALID(pRecordset);
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
TCHAR szT[2];
if (pDX->m_bSaveAndValidate)
{
::GetWindowText(hWndCtrl, szT, _countof(szT));
if (szT[0] == '\0')
{
// If edit buffer not NULL prior to update, set it dirty
// to catch case of setting field value from PSEUDO NULL to NULL.
if (!pRecordset->IsFieldNull(pv))
pRecordset->SetFieldDirty(pv, TRUE);
pRecordset->SetFieldNull(pv);
return TRUE;
}
else
{
// If edit buffer NULL prior to update, set it dirty
// to catch case of setting field value to PSEUDO NULL.
if (pRecordset->IsFieldNull(pv))
pRecordset->SetFieldDirty(pv, TRUE);
pRecordset->SetFieldNull(pv, FALSE);
}
}
else
{
if (!pRecordset->IsOpen() || pRecordset->IsFieldNull(pv))
{
szT[0] = '\0';
AfxSetWindowText(hWndCtrl, szT);
return TRUE;
}
}
return FALSE;
}
void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, BOOL& value,
CDaoRecordset* pRecordset)
{
if (!AfxFieldText(pDX, nIDC, &value, pRecordset))
DDX_Text(pDX, nIDC, value);
}
void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, BYTE& value,
CDaoRecordset* pRecordset)
{
if (!AfxFieldText(pDX, nIDC, &value, pRecordset))
DDX_Text(pDX, nIDC, value);
}
void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, short& value,
CDaoRecordset* pRecordset)
{
if (!AfxFieldText(pDX, nIDC, &value, pRecordset))
DDX_Text(pDX, nIDC, value);
}
void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, long& value,
CDaoRecordset* pRecordset)
{
if (!AfxFieldText(pDX, nIDC, &value, pRecordset))
DDX_Text(pDX, nIDC, value);
}
void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, DWORD& value,
CDaoRecordset* pRecordset)
{
if (!AfxFieldText(pDX, nIDC, &value, pRecordset))
DDX_Text(pDX, nIDC, value);
}
void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, COleCurrency& value,
CDaoRecordset* pRecordset)
{
if (!AfxFieldText(pDX, nIDC, &value, pRecordset))
DDX_Text(pDX, nIDC, value);
}
void AFXAPI DDX_FieldText(CDataExchange* pDX, int nIDC, float& value,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -