亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chap10_7.htm

?? VC++編程實例。非常詳細
?? HTM
?? 第 1 頁 / 共 4 頁
字號:
<html>

<head>
<title>10.7 學習Enroll例程</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<link rel="stylesheet" href="../../../cpcw.css"></head>

<body link="#3973DE" alink="#3973DE" background="../../bg.gif">
<div align="center"><center>
    <table width="85%" border="0">
      <tr bgcolor="#FFFFFF"> 
        <td> 
          <div align="center"> 
            <center>
            </center>
          </div>
          <p align="CENTER"><font color="red"><b>10.7 學習Enroll例程</b></font></p>
          <p align="JUSTIFY"> Visual C++提供了一個名為Enroll的例子來作為學習MFC數據庫編程的教程.Enroll分為四步,本節的任務就是指導讀者完成前三步的Enroll例程,并對其進行較徹底的剖析.通過學習這三步例程,讀者將掌握用AppWizard和ClassWizard創建MFC數據庫應用程序的方法.</p>
          <p align="JUSTIFY"> 在開始學習Enroll例程時,讀者也許會感到用AppWizard創建數據庫應用很容易,似乎不用學習前面幾節的內容.誠然,AppWizard自動地為應用程序加入了許多與數據庫有關的代碼,大大簡化了數據庫應用的開發.但AppWizard不是萬能的,它建立的數據庫應用往往不能滿足用戶的需要.用戶真正想知道的是如何不依賴AppWizard而編寫自己的數據庫應用程序,這也正是本章的宗旨所在.事實上,前面幾節的分析以及后面進行的對Enroll例程的分析正是為這一宗旨服務的.</p>
          <p align="JUSTIFY"> 在學習Enroll以前,請讀者先從Visual 
            C++ 5.0的光盤上將Enroll(在samples 
            \ mfc \ tutorial \ enroll目錄下)在前三步的例程拷到硬盤上,以供參考.另外,Enroll要用到Access數據庫STDRED32.MDB,該文件在VC5.0的Stdreg例程中(在samples 
            \ mfc \ database \ stdreg目錄下),請讀者將該例子也拷貝到硬盤上.</p>
          <p align="JUSTIFY"> <b></b>10.7.1 注冊數據源</p>
          <p align="JUSTIFY"> ODBC應用程序不能直接使用數據庫,用戶必需為要使用的數據庫注冊數據源.注冊數據源的工作由ODBC管理器完成,該管理器位于Windows 
            95控制面板的32位ODBC內.現在讓我們為Access數據庫STDREG32.MDB注冊數據源.</p>
          <p align="JUSTIFY"> 打開控制面板,雙擊“32位ODBC”圖標,則會顯示一個“ODBC數據源管理器”,如圖10.5所示。在管理器中選擇“用戶DSN”頁,用戶DSN只對用戶可見而且只能用戶當前機器。</p>
          <p align="center"> <img src="T10_5.gif" alt="T10_5.tif (174104 bytes)" width="460" height="355"></p>
          <p align="center"> 圖10.5 ODBC數據源管理器</p>
          <p align="JUSTIFY">點擊“添加”按鈕,則會彈出一個“創建新數據源”對話框。在該對話框中選擇Microsoft 
            Access Driver(*.mdb),然后按完成按鈕。接下來會顯示一個ODBC 
            Microsoft Access 97 Setup對話框,如圖10.6所示,該對話框用來把數據庫與一個數據源名連接起來。在Data 
            Source Name:欄中輸入Student 
            Registration,然后點擊Select...按鈕,在隨后彈出的對話框中找到并選擇STDREG32.MDB。連按兩個OK按鈕后,一個名為Student 
            Registration的新數據源就被注冊到了管理器中。</p>
          <p align="center"> <img src="T10_6.gif" alt="T10_6.tif (156780 bytes)" width="471" height="312"></p>
          <p align="center"> 圖10.6 
            ODBC Microsoft Access 97 Setup對話框</p>
          <div align="center"> 
            <center>
              <table border="2" cellpadding="2" cellspacing="0" width="100%" bgcolor="#80D6FF">
                <tr> 
                  <td width="100%"> <b></b>提示:如果要為dBase或FoxPro數據庫注冊數據源,則應該選擇一個目錄而不是文件作為數據源。這是因為在Access中,一個MDB文件可以包含多張表,因此可以認為一個MDB文件就是一個數據庫。而在dBase或FoxPro中,一個DBF文件只能對應一張表,一個數據庫可能會包含好幾個DBF文件,所以可以認為某一個包含了若干DBF文件的目錄是一個數據庫。<b></b></td>
                </tr>
              </table>
            </center>
          </div>
          <p align="JUSTIFY">10.7.2 Enroll的第一個版本</p>
          <p align="JUSTIFY"> Enroll第一個版本如圖10.3所示,該程序具有瀏覽記錄集和修改記錄這兩個基本功能。在修改了表單中的記錄后,移動到一個新的記錄上就可以保存對原記錄的修改。注意在表單中Course和Section編輯框都是只讀的,這是因為這兩個字段的內容較重要,用戶不能隨便修改。Enroll使用了STDREG32.MDB的Section表,該表是一張課程表,其內容如表10.2所示。</p>
          <p align="JUSTIFY"> 現在讓我們來建立Enroll應用程序。首先,用AppWizard來完成Enroll程序框架的建立,請讀者按下面幾步進行:</p>
          <blockquote> 
            <p align="JUSTIFY">啟動AppWizard,指定一個名為Enroll的MFC工程。</p>
            <p align="JUSTIFY">在MFC AppWizard的第一步選擇Single 
              document。</p>
            <p align="JUSTIFY">在MFC AppWizard的第二步選擇Database 
              view without file support,然后點擊Data 
              Source...按鈕,在Database 
              Options對話框中的ODBC組合框中選擇Student 
              Registration數據源,如圖10.7所示。然后按“OK”按鈕,則會打開一個Select 
              Database Table對話框,如圖10.8所示。在該對話框中選擇Section表。按OK按鈕退出。</p>
            <p align="JUSTIFY">在MFC AppWizard的第六步中,將類CEnrollSet改名為CSectionSet,將類CEnrollView改名為CSectionForm。</p>
            <p align="JUSTIFY">按Finish按鈕,建立Enroll工程。</p>
          </blockquote>
          <p align="center"> <img src="T10_7.gif" alt="T10_7.tif (155892 bytes)" width="470" height="248"></p>
          <p align="center"> 圖10.7 
            Database Options對話框</p>
          <p align="center"> <img src="T10_8.gif" alt="T10_8.tif (135432 bytes)" width="452" height="279"></p>
          <p align="center"> 圖10.8 
            Select Database Table對話框</p>
          <p align="JUSTIFY"> 打開工作區的類視圖,可以發現AppWizard自動創建了一個記錄集類CSectionSet和一個記錄視圖類CSectionForm,這兩個類分別是CRecordset和CRecordView的派生類。AppWizard也為CSectionSet類自動創建了域數據成員。</p>
          <p align="JUSTIFY"> 打開工作區的資源視圖,讀者不難找到一個ID為IDD_ENROLL_FORM的對話框模板,該模板將被記錄視圖用來顯示表單。清除該模板中的所有控件,并把模板的尺寸擴大到183×110,然后按圖10.3的式樣放置控件。這里可以采取一個偷懶的方法:打開VC5.0已作好的第一個版本Enroll的資源文件(Enroll.rc),找到并打開IDD_ENROLL_FORM對話框模板,按住Ctrl鍵并用鼠標選擇模板中的所有控件,然后按Ctrl+Insert鍵拷貝所選的控件。切換到自己的IDD_ENROLL_FORM對話框模板,然后按Shift+Insert鍵把剛才拷貝的控件粘貼到模板中。</p>
          <p align="JUSTIFY"> 接下來的任務是用ClassWizard把表單中的控件與記錄集的域數據成員連接起來,以實現控件與當前記錄的DDX數據交換。請讀者按如下步驟操作:</p>
          <blockquote> 
            <p align="JUSTIFY">進入ClassWizard,選擇Member 
              Variables頁并且選擇CSectionForm類。</p>
            <p align="JUSTIFY">在變量列表中雙擊IDC_CAPACITY項,則會顯示Add 
              Member Variable對話框。注意該對話框的Member 
              variable name欄顯示的是一個組合框,而不是平常看到的編輯框。如圖10.9所示,在組合框的列表中選擇m_pSet-&gt;m_Capacity。按OK按鈕確認。</p>
            <p align="JUSTIFY">仿照第2步,為其他控件連接記錄集的域數據成員。根據控件的ID,不難確定對應的域數據成員。</p>
          </blockquote>
          <p align="center"> <img src="T10_9.gif" alt="T10_9.tif (159244 bytes)" width="424" height="349"></p>
          <p align="center"> 圖10.9 
            Add Member Variable對話框</p>
          <p align="JUSTIFY">  </p>
          <p align="JUSTIFY"> 在CSectionForm類的定義內可以找到下面一行:</p>
           
          <p align="JUSTIFY">CSectionSet* m_pSet;</p>
           
          <p align="JUSTIFY">可見m_pSet是CSectionForm類的成員,它指向一個CSectionSet對象。用ClassWizard可以把控件與象記錄集這樣的“外部數據”連接起來,這是ClassWizard在數據庫編程方面的一個特殊應用。</p>
          <p align="JUSTIFY"> 編譯并運行Enroll,讀者會驚奇的發現Enroll居然是一個相當不錯的記錄瀏覽器,并且用戶可以對記錄進行修改。</p>
          <p align="JUSTIFY"> 現在,讓我們來分析一下AppWizard和ClassWizard為Enroll干了哪些事情。</p>
          <p align="JUSTIFY"> 在文檔類CEnrollDoc的定義中,有如下一行:</p>
           
          <p align="JUSTIFY">CSectionSet m_sectionSet;</p>
           
          <p align="JUSTIFY">可見AppWizard在CEnrollDoc類中嵌入了一個CSectionSet對象。這相當于調用了構造函數CSectionSet(NULL),CSectionSet類的構造函數的聲明如下:<br>
            CSectionSet(CDatabase* pDatabase 
            = NULL);</p>
          <p align="JUSTIFY"> 函數的定義在清單10.5中列出。可以看出,構造函數調用了基類的構造函數,并對域數據成員進行了初始化。通過10.5.4我們知道,若傳遞NULL參數給CRecordset的構造函數,那么CRecordset::Open函數將自動構建一個CDatabase對象,并根據CRecordset:: 
            GetDefaultConnect返回的連接字符串建立與數據源的連接。CSectionSet提供了虛擬函數GetDefaultConnect的新版本,如清單10.6所示,在該函數中提供了數據源Student 
            Registration。</p>
          <p align="JUSTIFY"> <b> </b></p>
          <p align="JUSTIFY"> <b>清單10.5 
            CSectionSet的構造函數</b></p>
           
          <p align="JUSTIFY">CSectionSet::CSectionSet(CDatabase* pdb)</p>
          <p align="JUSTIFY">: CRecordset(pdb)</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">//{{AFX_FIELD_INIT(CSectionSet)</p>
          <p align="JUSTIFY">m_CourseID = _T(&quot;&quot;);</p>
          <p align="JUSTIFY">m_SectionNo = _T(&quot;&quot;);</p>
          <p align="JUSTIFY">m_InstructorID = _T(&quot;&quot;);</p>
          <p align="JUSTIFY">m_RoomNo = _T(&quot;&quot;);</p>
          <p align="JUSTIFY">m_Schedule = _T(&quot;&quot;);</p>
          <p align="JUSTIFY">m_Capacity = 0;</p>
          <p align="JUSTIFY">m_nFields = 6;</p>
          <p align="JUSTIFY">//}}AFX_FIELD_INIT</p>
          <p align="JUSTIFY">m_nDefaultType = snapshot;</p>
          <p align="JUSTIFY">}</p>
           
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY"> <b> </b></p>
          <p align="JUSTIFY"> <b>清單10.6 
            派生類的GetDefaultConnect函數</b></p>
           
          <p align="JUSTIFY">CString CSectionSet::GetDefaultConnect()</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">return _T(&quot;ODBC;DSN=Student Registration&quot;);</p>
          <p align="JUSTIFY">}</p>
           
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">  </p>
          <p align="JUSTIFY"> 至于記錄集的建立,實際上是在CRecordView:: 
            OnInitialUpdate中完成的,這部分代碼對用戶是透明的,這里在清單10.7中列出。在該函數中調用CRecordset::Open來建立記錄集。在函數的開頭調用了OnGetRecordset函數來獲取與記錄視圖相連的記錄集對象。CSectionForm提供了虛擬函數OnGetRecordset的新版本,如清單10.8所示,該函數把m_pSet提交給調用者。至于m_pSet的初始化,則是在CSectionForm::OnInitialUpdate函數中完成的,如清單10.9所示。</p>
          <p align="JUSTIFY"> <b> </b></p>
          <p align="JUSTIFY"> <b>清單10.7 
            CRecordView:: OnInitialUpdate函數</b></p>
           
          <p align="JUSTIFY">void CRecordView::OnInitialUpdate()</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">CRecordset* pRecordset = OnGetRecordset();</p>
          <p align="JUSTIFY">// recordset must be allocated already</p>
          <p align="JUSTIFY">ASSERT(pRecordset != NULL);</p>
           
          <p align="JUSTIFY"> </p>
           
          <p align="JUSTIFY">if (!pRecordset-&gt;IsOpen())</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">CWaitCursor wait;</p>
          <p align="JUSTIFY">pRecordset-&gt;Open();</p>
          <p align="JUSTIFY">}</p>
           
          <p align="JUSTIFY"> </p>
           
          <p align="JUSTIFY">CFormView::OnInitialUpdate();</p>
          <p align="JUSTIFY">}</p>
           
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY"> <b> </b></p>
          <p align="JUSTIFY"> <b>清單10.8 
            派生類的OnGetRecordset函數</b></p>
           
          <p align="JUSTIFY">CRecordset* CSectionForm::OnGetRecordset()</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">return m_pSet;</p>
          <p align="JUSTIFY">}</p>
           
          <p align="JUSTIFY"> </p>
          <p> <b> </b></p>
          <b> 
          <p align="JUSTIFY">  </p>
          </b> 
          <p align="JUSTIFY"><b>清單10.9 派生類的OnInitialUpdate函數</b></p>
           
          <p align="JUSTIFY">void CSectionForm::OnInitialUpdate()</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">m_pSet = &amp;GetDocument()-&gt;m_sectionSet;</p>
          <p align="JUSTIFY">CRecordView::OnInitialUpdate();</p>
          <p align="JUSTIFY">}</p>
           
          <p align="JUSTIFY"> </p>
          <p> <b> </b></p>
          <b> 
          <p align="JUSTIFY">  </p>
          </b> 
          <p align="JUSTIFY"><b> </b>注意到在CRecordView:: 
            OnInitialUpdate中調用CRecordset::Open時未提供任何參數,這意味著Open函數將從CRecordset::GetDefaultSQL中獲取SQL信息。CSectionSet提供了虛擬函數GetDefaultSQL的新版本,如清單10.10所示,該函數返回了“Section”表名。</p>
          <p align="JUSTIFY"> <b> </b></p>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区美女在线| 91日韩精品一区| 亚洲人成7777| 26uuu精品一区二区在线观看| 99综合影院在线| 精久久久久久久久久久| 亚洲综合精品久久| 国产日韩精品久久久| 欧美日韩一区成人| 99在线精品免费| 国产一区二区三区在线观看精品 | 激情综合网激情| 亚洲综合色婷婷| 国产精品久久久久久久久晋中| 日韩一区二区免费在线观看| 91福利视频网站| 成人av网址在线观看| 国产美女一区二区| 欧美aaaaa成人免费观看视频| 一区二区三区精品在线| 国产精品久线在线观看| 久久综合九色综合97婷婷| 91精品国产一区二区三区香蕉| 色老头久久综合| 9久草视频在线视频精品| 丁香六月综合激情| 国产精品一区二区在线播放 | 亚洲国产成人在线| 精品国产免费一区二区三区香蕉| 欧美日韩色综合| 欧美三级日韩在线| 欧美性猛交xxxx乱大交退制版| 91网站最新网址| 99久久99久久综合| 97久久精品人人澡人人爽| 99久久免费视频.com| 成人福利视频网站| 成人av网站在线观看免费| 成人一级片网址| 国产一区二区三区免费播放| 国内精品国产成人国产三级粉色| 久久久久国产精品厨房| 综合欧美亚洲日本| 欧美一区二区福利在线| 色偷偷久久人人79超碰人人澡| 免费观看一级特黄欧美大片| 亚洲一本大道在线| 国产精品久99| 久久―日本道色综合久久| 成人福利视频网站| 国产精品一区二区黑丝| 国内不卡的二区三区中文字幕| 精品午夜一区二区三区在线观看| 激情综合网天天干| 成人性色生活片免费看爆迷你毛片| 不卡在线视频中文字幕| 色噜噜夜夜夜综合网| 欧美肥大bbwbbw高潮| 精品欧美乱码久久久久久1区2区| 欧美精品一区二区三| 亚洲国产精品传媒在线观看| 自拍偷拍亚洲综合| 视频一区二区三区在线| 毛片不卡一区二区| 粉嫩aⅴ一区二区三区四区| 一本久久a久久免费精品不卡| 欧美精品丝袜中出| 久久免费的精品国产v∧| 中文字幕不卡一区| 亚洲高清在线精品| 久久 天天综合| 成人久久18免费网站麻豆| 在线亚洲+欧美+日本专区| 欧美在线三级电影| 日韩欧美久久久| 亚洲欧美在线高清| 日韩国产在线观看| 丁香啪啪综合成人亚洲小说| 欧美三级日本三级少妇99| 久久综合一区二区| 洋洋成人永久网站入口| 九色综合国产一区二区三区| 99精品国产热久久91蜜凸| 3d动漫精品啪啪一区二区竹菊| 久久精品一区二区| 亚洲一区中文在线| 国产一级精品在线| 欧美日韩大陆一区二区| 久久色.com| 午夜一区二区三区视频| 国产黄色成人av| 91超碰这里只有精品国产| 国产精品欧美极品| 日本不卡123| 97精品久久久久中文字幕 | 欧美一区二视频| 亚洲国产成人私人影院tom| 亚洲高清免费观看高清完整版在线观看| 国产一区二区三区高清播放| 欧美亚一区二区| 国产精品欧美一区二区三区| 久久99久久精品欧美| 91成人国产精品| 国产精品免费av| 久久99精品国产.久久久久久 | 欧美亚洲高清一区| 国产午夜精品久久久久久久 | 久久国产精品色| 欧美最猛性xxxxx直播| 亚洲国产精品成人综合色在线婷婷| 免费视频最近日韩| 欧美乱妇一区二区三区不卡视频| 日韩毛片视频在线看| 国产激情偷乱视频一区二区三区| 日韩三级av在线播放| 亚洲国产一二三| 在线观看亚洲成人| 中文字幕一区二区三区不卡| 国产酒店精品激情| 精品美女被调教视频大全网站| 日本视频在线一区| 欧美群妇大交群的观看方式 | 国产一区视频在线看| 欧美一区二区三区影视| 亚洲成av人综合在线观看| aa级大片欧美| 中文字幕亚洲区| 波波电影院一区二区三区| 国产女主播一区| 国产成人自拍在线| 久久色在线观看| 国产精品原创巨作av| 久久综合中文字幕| 国产精品99久久久久| 久久久不卡网国产精品一区| 精品亚洲成a人在线观看| 欧美tickling挠脚心丨vk| 久久国产日韩欧美精品| 日韩欧美国产综合| 精品一区二区在线看| 欧美mv日韩mv国产网站app| 久久9热精品视频| 国产亚洲制服色| 成人午夜看片网址| 亚洲男人电影天堂| 欧美网站大全在线观看| 午夜影院在线观看欧美| 在线综合视频播放| 久久国产剧场电影| 欧美激情一区二区三区在线| 国产电影一区在线| 最新国产精品久久精品| 色欧美日韩亚洲| 丝袜美腿亚洲色图| 日韩欧美中文一区| 国产精品1区2区3区在线观看| 亚洲国产精品成人综合| 欧洲亚洲国产日韩| 免费日本视频一区| 久久久精品综合| 色噜噜久久综合| 免费观看在线综合| 国产精品三级在线观看| 在线视频一区二区三| 裸体在线国模精品偷拍| 中文字幕成人在线观看| 欧美偷拍一区二区| 国产一区二区精品久久91| 亚洲欧洲av另类| 日韩美女一区二区三区| 成人国产精品免费观看| 舔着乳尖日韩一区| 久久精品一二三| 欧美在线综合视频| 国产一区二区日韩精品| 一区二区三区在线观看视频| 日韩欧美激情一区| caoporen国产精品视频| 午夜精品福利在线| 久久久久久久综合日本| 欧美三级中文字幕| 高清beeg欧美| 日韩在线一二三区| 国产精品毛片无遮挡高清| 欧美精品色一区二区三区| 福利电影一区二区三区| 日韩影院精彩在线| 中文字幕一区二区三区四区不卡| 日韩一区二区精品葵司在线| 色综合久久66| 国产91色综合久久免费分享| 亚洲五码中文字幕| 亚洲国产精品激情在线观看| 日韩视频永久免费| 日本高清不卡aⅴ免费网站| 国产精品伊人色| 日本免费在线视频不卡一不卡二| 亚洲视频免费看| 久久久久久久电影| 91精品国产高清一区二区三区|