设为首页 加入收藏

TOP

21.4.7 创建订单ID(2)
2013-10-07 12:47:31 来源: 作者: 【 】 浏览:72
Tags:21.4.7 创建 订单

21.4.7  创建订单ID(2)

除这里使用的移动函数以外,记录集对象还提供了另外3个移动函数,见表21-6。

表  21-6

MoveLast()< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

移动到记录集中的最后一条记录。

不能对只能向前滚动的记录集使用

该函数(MoveFirst()函数),否则将

得到一个CDBException类型的异常

MovePrev()

移动到记录集中当前记录前面的

那条记录。如果当前记录前面没有记

录,则移动到超过第一条记录的位置。

此后,记录集字段无效,IsBOF()函数返回true

Move()

该函数用来移过记录集中的一条或多

条记录。第一个long类型的实参指定

要移过的行数。第二个WORD类型的

实参确定移动操作的性质。供第二个实

参使用的4个值使该函数等价于已经见

过的其他移动函数。在Visual C++(www.cppentry.com)文档

中,可以找到关于该函数的更多细节


当while循环结束时,将得到存储在newOrderID中的最大订单ID,因此在返回该变量之前只需令其加1即可。

最后一步是把新订单的ID传输给控件,使其出现在IDD_CUSTOMER_FORM对话框中。为此,需要以FALSE作为实参,调用记录集视图对象的UpdateData()函数。记录视图类中的这个函数是从CWnd类继承的。FALSE实参使数据从视图类的数据成员传输到对话框的控件上。TRUE实参使数据从控件上检索出来,并存储在数据成员中。在这两种情况中,数据交换都是通过使框架调用视图类的DoDataExchange()成员实现的。

3. 启动ID创建过程

当初次显示时,客户视图需要可用的新订单ID。给CCustomerView类添加一个public成员函数SetNewOrderID(),并以下面的代码将其实现:

  1. void CCustomerView::SetNewOrderID(void)  
  2. {  
  3. // Get a new order ID from the COrderSet object in the document  
  4. m_NewOrderID = static_cast<CDBSimpleUpdateDoc*> 
  5. (GetDocument())->m_OrderSet.CreateNewOrderID();  
  6. UpdateData(FALSE); // Transfer data to controls  

继承的GetDocument()函数返回的指针属于CDocument类型。需要使用该指针来访问派生类的m_OrderSet成员,因此必须将其强制转换为CDBSimpleUpdateDoc*类型。然后,为该文档类的m_OrderSet成员调用返回新订单ID的成员函数,并将结果存入CCustomerView类的m_NewOrderID成员。调用视图类中继承的UpdateData()成员将把数据从视图的数据成员传输到控件上。现在,必须给客户视图类的源文件添加嵌入DBSimpleUpdateDoc.h头文件的#include指令,因为要引用类名CDBSimpleUpdateDoc。

因为只创建了一个CCustomerView对象,并打算在需要时重用该对象,所以在每次切换到该视图时都需要有可用的新ID。CMainFrame对象的SelectView()成员处理对话框之间的切换,也是初次创建CCustomerView对象的地方。该函数是启动新订单ID创建过程的好地方。需要做的全部就是在视图对应于CCustomerView的情况下,添加一些调用SetNewOrderID()成员的代码。

  1. void CMainFrame::SelectView(ViewID viewID)  
  2. {  
  3. CView* pOldActiveView = GetActiveView(); // Get current view  
  4.  
  5. // Get pointer to new view if it exists  
  6. // if it doesn't the pointer will be null  
  7. CView* pNewActiveView = static_cast<CView*>(GetDlgItem(viewID));  
  8.  
  9. // If this is first time around for the new view, the new view  
  10. // won't exist, so we must create it  
  11. // The Order Details view is always created first so we don't need  
  12. // to provide for creating that.  
  13. if (pNewActiveView == NULL)  
  14. {  
  15. switch(viewID)  
  16. {  
  17. case NEW_ORDER: // Create view to add new order  
  18. pNewActiveView = new CCustomerView;  
  19. break;  
  20. case SELECT_PRODUCT: // Create view to add product to order  
  21. pNewActiveView = new CProductView;  
  22. break;  
  23. default:  
  24. AfxMessageBox(_T("Invalid View ID"));  
  25. return;  
  26. }  
  27.  
  28. // Switching the views  
  29. // Obtain the current view context to apply to the new view  
  30. CCreateContext context;  
  31. context.m_pCurrentDoc = pOldActiveView->GetDocument();  
  32. pNewActiveView->Create(NULL, NULL, 0L, CFrameWnd::rectDefault,  
  33. this, viewID, &context);  
  34.  
  35. pNewActiveView->OnInitialUpdate();  
  36. }  
  37. SetActiveView(pNewActiveView); // Activate the new view  
  38. if(viewID==NEW_ORDER)  
  39. static_cast<CCustomerView*>(pNewActiveView)->SetNewOrderID();  
  40.  
  41. pOldActiveView->ShowWindow(SW_HIDE); // Hide the old view  
  42. pNewActiveView->ShowWindow(SW_SHOW); // Show the new view  
  43. pOldActiveView->SetDlgCtrlID(m_CurrentViewID); // Set the old view ID  
  44. pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);  
  45. m_CurrentViewID = viewID; // Save the new view ID  
  46. RecalcLayout();  

我们做的全部工作只是检查viewID的值。如果是NEW_ORDER,就调用新视图对象的SetNewOrderID()成员。因为pNewActiveView属于CView类型,所以必须将其强制转换为实际的视图类型才能调用SetNewOrderID()成员函数。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇掌握C++和C#、Java的区别进行学习.. 下一篇21.4.7 创建订单ID(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: