SECTFORM.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // sectform.cpp : implementation of the CSectionForm class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "enroll.h"
  14. #include "sectset.h"
  15. #include "coursset.h"
  16. #include "enroldoc.h"
  17. #include "sectform.h"
  18. #include "addfield.h"
  19. #ifdef _DEBUG
  20. #undef THIS_FILE
  21. static char BASED_CODE THIS_FILE[] = __FILE__;
  22. #endif
  23. // For dynamically added fields
  24. #define IDC_EDIT_EXTRA 200
  25. #define IDC_STATIC_EXTRA 300
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CSectionForm
  28. IMPLEMENT_DYNCREATE(CSectionForm, CRecordView)
  29. BEGIN_MESSAGE_MAP(CSectionForm, CRecordView)
  30. //{{AFX_MSG_MAP(CSectionForm)
  31. ON_CBN_SELENDOK(IDC_COURSELIST, OnSelendokCourselist)
  32. //}}AFX_MSG_MAP
  33. // Standard printing commands
  34. ON_COMMAND(ID_OPTIONS_ADDFIELDS, OnOptionsAddfields)
  35. ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
  36. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview)
  37. ON_COMMAND(ID_RECORD_ADD, OnRecordAdd)
  38. ON_COMMAND(ID_RECORD_REFRESH, OnRecordRefresh)
  39. ON_COMMAND(ID_RECORD_DELETE, OnRecordDelete)
  40. END_MESSAGE_MAP()
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CSectionForm construction/destruction
  43. CSectionForm::CSectionForm()
  44. : CRecordView(CSectionForm::IDD)
  45. {
  46. //{{AFX_DATA_INIT(CSectionForm)
  47. m_pSet = NULL;
  48. //}}AFX_DATA_INIT
  49. m_bAddMode = FALSE;
  50. }
  51. CSectionForm::~CSectionForm()
  52. {
  53. while (!m_listEdit.IsEmpty())
  54. {
  55. delete m_listEdit.GetHead();
  56. m_listEdit.RemoveHead();
  57. }
  58. while (!m_listStatic.IsEmpty())
  59. {
  60. delete m_listStatic.GetHead();
  61. m_listStatic.RemoveHead();
  62. }
  63. }
  64. void CSectionForm::DoDataExchange(CDataExchange* pDX)
  65. {
  66. CRecordView::DoDataExchange(pDX);
  67. //{{AFX_DATA_MAP(CSectionForm)
  68. DDX_Control(pDX, IDC_STATIC_CAPACITY, m_staticLast);
  69. DDX_Control(pDX, IDC_CAPACITY, m_editLast);
  70. DDX_Control(pDX, IDC_SECTION, m_ctlSection);
  71. DDX_Control(pDX, IDC_COURSELIST, m_ctlCourseList);
  72. DDX_FieldCBString(pDX, IDC_COURSELIST, m_pSet->m_CourseID, m_pSet);
  73. DDX_FieldText(pDX, IDC_CAPACITY, m_pSet->m_Capacity, m_pSet);
  74. DDX_FieldText(pDX, IDC_INSTRUCTOR, m_pSet->m_InstructorID, m_pSet);
  75. DDX_FieldText(pDX, IDC_ROOM, m_pSet->m_RoomNo, m_pSet);
  76. DDX_FieldText(pDX, IDC_SCHEDULE, m_pSet->m_Schedule, m_pSet);
  77. DDX_FieldText(pDX, IDC_SECTION, m_pSet->m_SectionNo, m_pSet);
  78. //}}AFX_DATA_MAP
  79. // Make calls for any fields added at run-time
  80. if (!m_pSet->m_listValue.IsEmpty())
  81. {
  82. UINT nField=0;
  83. POSITION posValue = m_pSet->m_listValue.GetHeadPosition();
  84. while (posValue)
  85. {
  86. DDX_FieldText(pDX, IDC_EDIT_EXTRA+nField,
  87. m_pSet->m_listValue.GetNext(posValue), m_pSet);
  88. nField++;
  89. }
  90. }
  91. }
  92. void CSectionForm::OnInitialUpdate()
  93. {
  94. m_pSet = &GetDocument()->m_sectionSet;
  95. // Fill the combo box with all of the courses
  96. CEnrollDoc* pDoc = GetDocument();
  97. if (!pDoc->m_courseSet.Open())
  98. return;
  99. // Parameterize and sort the course recordset
  100. m_pSet->m_strFilter = "CourseID = ?";
  101. m_pSet->m_strCourseIDParam = pDoc->m_courseSet.m_CourseID;
  102. m_pSet->m_strSort = "SectionNo";
  103. m_pSet->m_pDatabase = pDoc->m_courseSet.m_pDatabase;
  104. CRecordView::OnInitialUpdate();
  105. m_ctlCourseList.ResetContent();
  106. if (pDoc->m_courseSet.IsOpen())
  107. {
  108. while (pDoc->m_courseSet.IsEOF() != TRUE)
  109. {
  110. m_ctlCourseList.AddString(
  111. pDoc->m_courseSet.m_CourseID);
  112. pDoc->m_courseSet.MoveNext();
  113. }
  114. }
  115. m_ctlCourseList.SetCurSel(0);
  116. }
  117. BOOL CSectionForm::OnMove(UINT nIDMoveCommand)
  118. {
  119. if (m_bAddMode)
  120. {
  121. if (!UpdateData())
  122. return FALSE;
  123. TRY
  124. {
  125. m_pSet->Update();
  126. }
  127. CATCH(CDBException, e)
  128. {
  129. AfxMessageBox(e->m_strError);
  130. return FALSE;
  131. }
  132. END_CATCH
  133. m_pSet->Requery();
  134. UpdateData(FALSE);
  135. m_ctlSection.SetReadOnly(TRUE);
  136. m_bAddMode = FALSE;
  137. return TRUE;
  138. }
  139. else
  140. {
  141. return CRecordView::OnMove(nIDMoveCommand);
  142. }
  143. }
  144. /////////////////////////////////////////////////////////////////////////////
  145. // CSectionForm printing
  146. BOOL CSectionForm::OnPreparePrinting(CPrintInfo* pInfo)
  147. {
  148. // default preparation
  149. return DoPreparePrinting(pInfo);
  150. }
  151. void CSectionForm::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  152. {
  153. // TODO: add extra initialization before printing
  154. }
  155. void CSectionForm::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  156. {
  157. // TODO: add cleanup after printing
  158. }
  159. /////////////////////////////////////////////////////////////////////////////
  160. // CSectionForm diagnostics
  161. #ifdef _DEBUG
  162. void CSectionForm::AssertValid() const
  163. {
  164. CRecordView::AssertValid();
  165. }
  166. void CSectionForm::Dump(CDumpContext& dc) const
  167. {
  168. CRecordView::Dump(dc);
  169. }
  170. CEnrollDoc* CSectionForm::GetDocument() // non-debug version is inline
  171. {
  172. return STATIC_DOWNCAST(CEnrollDoc, m_pDocument);
  173. }
  174. #endif //_DEBUG
  175. /////////////////////////////////////////////////////////////////////////////
  176. // CSectionForm database support
  177. CRecordset* CSectionForm::OnGetRecordset()
  178. {
  179. return m_pSet;
  180. }
  181. /////////////////////////////////////////////////////////////////////////////
  182. // CSectionForm message handlers
  183. void CSectionForm::OnSelendokCourselist()
  184. {
  185. m_ctlCourseList.GetLBText(m_ctlCourseList.GetCurSel(),
  186. m_pSet->m_strCourseIDParam);
  187. if (!m_bAddMode)
  188. {
  189. m_pSet->Requery();
  190. if (m_pSet->IsEOF())
  191. {
  192. m_pSet->SetFieldNull(&(m_pSet->m_CourseID), FALSE);
  193. m_pSet->m_CourseID = m_pSet->m_strCourseIDParam;
  194. }
  195. UpdateData(FALSE);
  196. }
  197. }
  198. void CSectionForm::OnRecordAdd()
  199. {
  200. // If already in add mode, then complete previous new record
  201. if (m_bAddMode)
  202. OnMove(ID_RECORD_FIRST);
  203. CString strCurrentCourse = m_pSet->m_CourseID;
  204. m_pSet->AddNew();
  205. m_pSet->SetFieldNull(&(m_pSet->m_CourseID), FALSE);
  206. m_pSet->m_CourseID = strCurrentCourse;
  207. m_bAddMode = TRUE;
  208. m_ctlSection.SetReadOnly(FALSE);
  209. UpdateData(FALSE);
  210. }
  211. void CSectionForm::OnRecordRefresh()
  212. {
  213. if (m_bAddMode == TRUE)
  214. {
  215. m_pSet->Move(AFX_MOVE_REFRESH);
  216. m_ctlSection.SetReadOnly(TRUE);
  217. m_bAddMode = FALSE;
  218. }
  219. // Copy fields from recordset to form, thus
  220. // overwriting any changes user may have made
  221. // on the form
  222. UpdateData(FALSE);
  223. }
  224. void CSectionForm::OnRecordDelete()
  225. {
  226. TRY
  227. {
  228. m_pSet->Delete();
  229. }
  230. CATCH(CDBException, e)
  231. {
  232. AfxMessageBox(e->m_strError);
  233. return;
  234. }
  235. END_CATCH
  236. // Move to the next record after the one just deleted
  237. m_pSet->MoveNext();
  238. // If we moved off the end of file, then move back to last record
  239. if (m_pSet->IsEOF())
  240. m_pSet->MoveLast();
  241. // If the recordset is now empty, then clear the fields
  242. // left over from the deleted record
  243. if (m_pSet->IsBOF())
  244. m_pSet->SetFieldNull(NULL);
  245. UpdateData(FALSE);
  246. }
  247. void CSectionForm::OnOptionsAddfields()
  248. {
  249. CAddField addfield;
  250. addfield.m_pSet = m_pSet;
  251. if (addfield.DoModal() != IDOK || addfield.m_strField.IsEmpty())
  252. return;
  253. CEdit* pedit;
  254. CStatic* pstatic;
  255. if (m_listEdit.IsEmpty())
  256. {
  257. // Find coordinates of Schedule edit control
  258. m_editLast.GetWindowRect(&m_rc);
  259. ScreenToClient(&m_rc);
  260. m_nOffset = (m_rc.bottom - m_rc.top) + 10;
  261. // Find coords of Schedule label
  262. m_staticLast.GetWindowRect(&m_rcStatic);
  263. ScreenToClient(&m_rcStatic);
  264. }
  265. pedit = new CEdit();
  266. m_listEdit.AddTail((CObject*)pedit);
  267. m_rc.top += m_nOffset;
  268. m_rc.bottom += m_nOffset;
  269. pedit->Create(WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL,
  270. m_rc, this, IDC_EDIT_EXTRA+m_listEdit.GetCount()-1);
  271. pedit->SetFont(GetFont());
  272. pstatic = new CStatic();
  273. m_listStatic.AddTail((CObject*)pstatic);
  274. m_rcStatic.top += m_nOffset;
  275. m_rcStatic.bottom += m_nOffset;
  276. CString Label = addfield.m_strField;
  277. Label += ":";
  278. pstatic->Create(Label, WS_CHILD | WS_VISIBLE, m_rcStatic, this,
  279. IDC_STATIC_EXTRA+m_listStatic.GetCount()-1);
  280. pstatic->SetFont(GetFont());
  281. // Resize the form to fit newly added controls
  282. CSize size = GetTotalSize();
  283. size.cy += m_nOffset;
  284. SetScrollSizes(MM_TEXT, size);
  285. GetParentFrame()->RecalcLayout();
  286. ResizeParentToFit(FALSE);
  287. m_pSet->Close();
  288. m_pSet->AddTextField(addfield.m_strField);
  289. m_pSet->Open();
  290. // Fill new controls with data
  291. UpdateData(FALSE);
  292. }