檔案存取 W. B. E. n. c. t. u. Copyright
Wbe. nctu Copyright 2001 目錄 學習目標 摘要 I. 檔案的基本概念 I. 1 檔案的意義 I. 2 檔案使用的步驟 I. 3 檔案模式 I. 4 檔案的開啟與關閉 I. 5 檔案的指標 I. 6 檔案資料的讀寫 II. 檔案類別與結構 III. 循序存取檔案 程式實例 1 程式實例 2 程式實例 3 IV. 隨機存取檔案 程式實例 4 V. 二進位存取檔案 程式實例 5 ※在任何一張投影片左下角按下 即可回到此目錄
Wbe. nctu Copyright 2001 學習目標 學習本章之後,學習者能: 1. 瞭解什麼是檔案。 2. 瞭解循序存取檔案、隨機存取檔案與二進位 存取檔案的使用方法。 3. 瞭解循序存取檔案、隨機存取檔案與二進位 存取檔案之間的差異。 4. 瞭解檔案儲存資料的基本方式。 5. 利用共用對話盒讓使用者指定開啟檔案名稱。
Wbe. nctu Copyright 2001 摘 要 檔案乃是資料儲存的一個集合名詞,檔案 經由作業系統的管理,有秩序地在磁片內 存放,只需運用適當的指令或程序,即得以 進行檔案處理。在 Visual Basic 中對於檔案 資料的處理亦提供了三種類別的檔案及相 關敘述與函數,在 具箱中亦有三個檔案 目錄控制元件。循序存取檔案就是順著由 前而後的次序讀取資料或寫入資料的檔案, 隨機存取檔案可以讓使用者忽前忽後地進 行資料的讀取或寫入,二進位存取檔案藉 由位置、長度的指定執行資料的讀寫。
Wbe. nctu Copyright 2001 摘 要 電腦不僅是可以作快速的資料運算, 電腦也是儲存資料的理想 具。藉著 磁片、硬式磁碟機或磁帶將大量的資 料儲存在小空間的媒體上,我們即可 有效率地運用電腦作快速的搜尋、更 改、排序等資料處理 作。因此,檔案 資料的存取是學習電腦程式語言上不 可或缺的部分。
Wbe. nctu Copyright 2001 摘 要 為了讓學習者對於檔案資料的處理具備完 整的概念,本章先就檔案的基本概念先行 介紹,解說檔案的意義、檔案使用的步驟、 檔案模式、檔案的開啟與關閉、檔案的指標, 以及檔案資料的讀寫,隨後,就 Visual Basic 提供的檔案處理三種類別與結構逐一介紹 其內涵,再藉由五個程式實例解說其用法, 在程式實例 5 中連帶地介紹了利用共用對 話盒讓使用者指定開啟檔案名稱的方法。
Wbe. nctu Copyright 2001 I. 檔案的基本概念 對於個人電腦使用者而言,檔案並不 是陌生的名詞,因為 IBM PC 的基本作 業環境是 MS-DOS 磁碟作業系統,檔 案的使用是絕對必要的,每位使用者 必然對於檔案已具備一些概念,然而, 對程式設計者而言,這些概念仍嫌不 夠,本節將介紹的,即是程式設計者 所需具備的檔案基本概念。 W b e. n c t u Copyright 2001
Wbe. nctu Copyright 2001 I. 1 檔案的意義 所謂「檔案」,乃是資料儲存的一個集 合名詞。在一般的文件處理上,用「檔 案」這個名詞代表有系統地歸類而儲 存的資料,在電腦方面,其意義亦是 如此。兩者之間的差異是在於前者形 之於紙張、文件,後者則是必須透過 電腦或具有電子資料處理功能的器具 才能顯現。由於基本理念上的相同一 致,在電腦的使用上,也運用同樣的 名詞 ─「檔案」。
Wbe. nctu Copyright 2001 I. 1 檔案的意義 (續 1) 藉著電腦快速運算處理及大量儲存的 能力,我們得以將文件資料變成電子 資料儲存在電腦可以讀寫的媒體(如 磁片、硬式磁碟機、磁帶、光碟等)上, 由於資料的類別可有千奇百種,電子 資料又不像一般文件易於辨識,藉由 電腦進行資料的處理更需要高度有系 統、講究效率的作法。
Wbe. nctu Copyright 2001 I. 1 檔案的意義 (續 2) 以一張常用的三吋半高密度 (2 HD) 磁片為 例,單張滿載的容量為 1, 457, 664個位元組, 對使用者而言,資料存入其中即是以檔案 為單位,最多可儲存 2, 847個檔案,這些檔案 經由作業系統 (operating system) 的管理,有 秩序地在磁片內存放,對使用者而言,只需 運用適當的指令或程序,即得以進行檔案 處理,如開啟、關閉、拷貝、刪除、修改等, 毋需知曉檔案在磁片中實際的存放情形, 每一個檔案在電腦處理上是由使用者賦于 一個檔案名稱來代表它,這種便利提供使 用者得以靈活地進行各種資料處理 作。
Wbe. nctu Copyright 2001 I. 1 檔案的意義 (續 3) Visual Basic在 Microsoft Windows環境下 操作,所使用的檔案與 MS-DOS所稱者 其實是同一回事。在 Visual Basic中對 於檔案資料的處理亦提供了三種類別 的檔案及相關敘述與函數,在 具箱 中亦有三個檔案目錄控制元件,在一 般的應用程式開發上是相當足夠而且 簡單易學。
Wbe. nctu Copyright 2001 I. 2 檔案使用的步驟 電腦檔案的使用必須是完整地經過三個步 驟,即:開啟、存取、關閉。 使用檔案,一開始必須先指定檔案名稱、檔 案模式及資料存取方式以開啟檔案,已開 啟之檔案才得以進行存取、搜尋、排序等各 種處理,當資料處理程序完成後,尚須執行 關閉檔案的動作,經過處理的資料才得以 完整地存入指定的檔案之中。
Wbe. nctu Copyright 2001 I. 2 檔案使用的步驟 (續 1) 注意:檔案開啟後,若未完成關閉的動 作而終止處理(如關機),部分寫入或 修改的資料將不能完整地存入,同時 也會造成檔案結構不健全而導致該檔 不能正常使用。
Wbe. nctu Copyright 2001 I. 3 檔案模式 Visual Basic提供五種檔案模式 (file mode), 這些模式與存取方式必須在開 啟檔案時就明確地指定,它將關係著 檔案的結構,也限定了隨後資料存取 的方式與可使用的指令。
Wbe. nctu Copyright 2001 檔案模式名 稱 表 1 檔案模式 簡意 說明 適用檔案類別 Input 輸入資料 開啟已存在的檔案循序 讀取其中資料 循序存取檔案 Output 輸出資料 開啟新的檔案或清除舊 的檔案循序寫入資料 循序存取檔案 Append 附加資料 開啟已存在的檔案循序 於其後寫入新資料 循序存取檔案 Random 隨 機 存 取 資料 開啟檔案依指定的記錄 格式作隨意地存取資料 隨機存取檔案 Binary 二 進 位 處 理 開啟檔案隨意地對其中 各個位元組進行資料處 理 二進位存取檔 案
Wbe. nctu Copyright 2001 I. 3 檔案模式 (續 1) "Input", "Output" 與 "Append" 三種檔案模式是 適用於循序存取檔案。 以 "Input" 模式開啟的檔案只能「讀」,意即 只能循序地由檔案中從頭開始讀取資料; 以 "Output" 或 "Append" 模式開啟的檔案只能 「寫」, "Output"只能循序地由檔案開端將資 料寫入,"Append"只能循序地由檔案尾端將 資料寫入;
Wbe. nctu Copyright 2001 I. 3 檔案模式 (續 2) "Random" 則適用於隨機存取檔案,以這種 模式開啟的檔案能「讀」也能「寫」,而且資 料處理的順序不需循著檔案內儲存的順序, 使用者可以隨意地忽前忽後處理各筆記錄, 但是檔案資料內容必須遵循指定的記錄格 式排列; "Binary" 適用於二進位存取檔案,可針對檔 案中任意位元組的資料依其存在檔案中的 位址進行「讀」或「寫」的處理 作。
Wbe. nctu Copyright 2001 I. 4 檔案的開啟與關閉 開啟檔案 (Open)敘述 作用:啟動一個檔案的輸入/輸出功能 語法: Open 檔案名稱 [For 檔案模式 ] As [#]檔案編號 [Len=記錄長 度]
Wbe. nctu Copyright 2001 開啟檔案 (Open)敘述 說明: – 任何檔案的使用必須先以此一敘述開啟 檔案,方得存取資料。 – 檔案名稱是字串變數或常數,其內容必 須符合 Windows檔案名稱之規定。 – 檔案模式必須是 Input, Output, Append, Random, Binary等五個保留字之一(不加 雙引號),用以指定檔案模式。若未指定, 則視同指定 Random。
開啟檔案 (Open)敘述 (續 1) Wbe. nctu Copyright 2001 說明: – 檔案編號是整數變數或常數,必須是介於 1到 511(含)之間,用以作為爾後存取資料與關閉檔 案的指定編號。一個檔案編號被開啟使用在未 關閉之前,該編號不得被重覆開啟使用。檔案編 號之前的符號 "#"可以省略。 – 記錄長度是整數變數或常數,必須是介於 1到 32767(含)之間,是檔案模式為 Random時用以 指定檔案中記錄長度的位元組個數。此值若未 指定,則以內定值 128代替。
開啟檔案 (Open)敘述 (續 2) Wbe. nctu Copyright 2001 說明: – 若欲開啟之檔案並不存在,對於檔案模式設定 為 Input的檔案而言,將造成 "找不到檔案 "的錯誤 狀態,對於檔案模式設定為 Output, Append, Random或 Binary的檔案而言,則自動開啟一個 新的檔案。 – 以 Input, Random或 Binary等檔案模式開啟而使 用中之檔案,可以使用不同的檔案編號同時開 啟使用而彼此不會造成干擾。但若 以 Output或 Append檔案模式開啟而使用中之檔案,則必須 關閉後才得以再開啟。
Wbe. nctu Copyright 2001 範例 範例 I-1: 開啟循序存取檔案之一 Open "MYFILE. DAT" For Input As #1 開啟檔案編號 #1對應檔案 "MYFILE. DAT" 作循序輸入。 範例 I-2: 開啟循序存取檔案之二 Open "MYFILE. OUT" For Output As #5 開啟檔案編號 #5對應檔案 "MYFILE. OUT" 作循序輸出。
Wbe. nctu Copyright 2001 範例 (續 1) 範例 I-3: 開啟循序存取檔案之 三 Open "MYFILE. TXT" For Append As #9 開啟檔案編號 #9對應檔案 "MYFILE. TXT" 作循序附加資料。 範例 I-4: 開啟隨機存取檔案 My. File$ = "MYFILE. RND" Fnum% = 11 Open My. File$ For Random As Fnum% Len = 32 開啟檔案編號 #11對應檔案 "MYFILE. RND" 記錄長度指定為 32個位元組作隨機存取。
Wbe. nctu Copyright 2001 範例 (續 2) 範例 I-5: 開啟二進位存取檔案 Dbf. File$ = "MYFILE. DBF" Fnum% = 6 Open Dbf. File$ For Binary As Fnum% 開啟檔案編號 #6對應檔案 "MYFILE. DBF"作二進位存取。
Wbe. nctu Copyright 2001 關閉檔案 (Close)敘述 作用:關閉已開啟的檔案 語法: Close [[#]檔案編號 ][, [#]檔案編號 ]. . .
關閉檔案 (Close)敘述 (續 1) Wbe. nctu Copyright 2001 說明: – 檔案編號是整數變數或常數,必須是介於 1到 511(含)之間,是先前開啟檔案的指定編號。檔 案編號之前的符號 "#"可以省略。 – 檔案編號可以在一個敘述中接連指定多個,中 間以逗號隔開。若僅以 Close為敘述而未指定任 何檔案編號,則關閉所有已開啟之檔案。 – 當一個檔案存取資料的動作執行完畢時,即應 予以關閉,關閉檔案可使寫入的資料確實存入 檔案之內(因為最後寫入的部分資料有可能還留 在 "檔案緩衝區 "之內)。 – 程式中止敘述 (End)具有關閉所有檔案之作用。
Wbe. nctu Copyright 2001 範例 範例 I-6: 關閉檔案之一 jf% = 9 Close #5, jf% 關閉檔案編號 #5及 #9兩個檔案。 範例 I-7: 關閉檔案之二 Close 關閉所有已開啟之檔案。
Wbe. nctu Copyright 2001 I. 5 檔案的指標 每一個檔案編號都有對應的一個讀寫指標 指到開啟的檔案,當檔案開啟時,這個指標 指到檔案的開端,唯有檔案模式為附加資 料 (Append) 時,是指到已存在檔案的尾端最 後一個位元組之後。隨著存取指令,這個指 標就移到所處理的資料之後。以不同的檔 案編號開啟同一個檔案同時作輸入或隨機 存取,即是有多個指標指到同一個檔案多 個位址,但是彼此並不干擾。
Wbe. nctu Copyright 2001 I. 6 檔案資料的讀寫 檔案一經開啟,依據指定之檔案模式 對應之讀寫功能,即可進行資料之讀 取或寫入處理。不同的檔案類別,由 於檔案結構上的差異,適用之讀寫敘 述也不盡相同,將隨後分別說明。
Wbe. nctu Copyright 2001 §習題 I 1. 電腦檔案的使用必須是完整地經過那幾個 步驟? 2. 循序存取檔案適用那幾種檔案模式? 3. 那種檔案模式可以隨意地忽前忽後處理檔 案資料? 4. 在開啟檔案 (Open)敘述中,記錄長度的指定 是用於何種檔案模式? 5. 關閉檔案 (Close)敘述中,若未指定任何檔案 編號,其作用為何?
Wbe. nctu Copyright 2001 II. 檔案類別與結構 在 Visual Basic中,檔案按照它存放資 料的安排方式,並對應資料存取方 式的差異而有三種不同的檔案結構: 1. 循序存取檔案 2. 隨機存取檔案 3. 二進位存取檔案
Wbe. nctu Copyright 2001 1. 循序存取檔案 顧名思義循序存取檔案就是順著由前 而後的次序讀取資料或寫入資料的檔 案。寫入時,資料的安排方式是依照 寫入的順序一行接著一行存放。讀取 時,資料依照存放的順序一行接著一 行讀出,每行資料的長度可長可短。 意即,循序存取檔案讀寫資料原則上 是以『行』為單位。 由 表 1可以看出,循序存取檔案可運用於 "Input", "Output", 及 "Append" 三種檔案模式。
Wbe. nctu Copyright 2001 2. 隨機存取檔案可以讓使用者忽前忽後地 進行資料的讀取或寫入。隨機存取檔案 存放資料的安排方式比較特別,讀寫資 料原則上是以『記錄』為單位。一筆記 錄可包含固定的數個資料欄,每一個資 料欄被設定為一種資料型態且有固定的 長度,因此,每一筆記錄都是固定一致 的長度。每一記錄存放在檔案中的序號稱為『 記錄號碼』,程式中讀取或寫入的位置就是以 記錄號碼來指定。
Wbe. nctu Copyright 2001 3. 二進位存取檔案對於檔案存放資料 並無特定的安排方式,讀寫資料原 則上是以『位元組』為單位,藉由 位置、長度的指定執行資料的讀取 或寫入,意即資料讀寫方式是 "自第 幾個位元組的位置起讀取幾個位元 組的資料 ",或是"自第幾個位元組 的位置起寫入幾個位元組的資料 "。
Wbe. nctu Copyright 2001 §習題 II 1. 同一循序存取檔案是否開啟作為既 可以讀取又可以寫入之用? 2. 以隨機存取檔案存放的資料可否當 作二進位存取檔案來使用?
Wbe. nctu Copyright 2001 III. 循序存取檔案 本節包含三個程式實例,以示範循序 存取檔案的使用方法,除了前述的檔 案開啟與關閉敘述,程式實例 1 示範 Line Input 敘述逐行讀取資料 , Print 敘 述將資料一次寫入檔案的用法,程式 實例 2 示範 Write 敘述將資料寫入檔 案的用法,程式實例 3 示範 Input 敘述 讀取檔案資料的用法。
Wbe. nctu Copyright 2001 程式實例 1 文字檔編輯 ─開啟指定檔名之文字檔, 讀取並顯示其內容,可修改後存檔, 亦可列印。
【程式實例 1】 Wbe. nctu Copyright 2001 一、程式設計構想 運用一個文字盒 (txt. File. Name)輸入檔案 名稱 運用一個文字盒 (txt. File. Content)顯示檔 案內容
【程式實例 1】 Wbe. nctu Copyright 2001 一、程式設計構想 (續 1) 安排命令鈕以執行讀取、寫入、列印、清除 及結束等功能: – 讀取 (cmd. Input)─讀出指定之檔案內容,並顯示 於文字盒 (txt. File. Content)。 – 寫入 (cmd. Save)─將編輯後之文字盒 (txt. File. Content)內容寫入指定檔案。 – 列印 (cmd. Print)─將文字盒 (txt. File. Content)內容送 至報表機印出。 – 清除 (cmd. Clear)─清除文字盒 (txt. File. Content)內容。 – 結束 (cmd. End)─結束程式執行。
【程式實例 1】 Wbe. nctu Copyright 2001 二、表單配置
【程式實例 1】 Wbe. nctu Copyright 2001 三、控制項設定 逐一加入各控制項,並設定其屬性如 下: 1. 設定表單屬性: Caption Name = "文字檔編輯 " = "frm. Ex 1"
【程式實例 1】 Wbe. nctu Copyright 2001 三、控制項設定 (續 1) 2. 加入標籤 項 Label 1: Caption = "檔案名稱:" 3. 加入標籤 項 Label 2: Caption = "檔案內容:"
【程式實例 1】 Wbe. nctu Copyright 2001 三、控制項設定 (續 2) 4. 加入文字盒 txt. File. Name: Name = "txt. File. Name" Text = "c: autoexec. bat" ※將內定的檔案名稱填入文字盒欄內。
【程式實例 1】 Wbe. nctu Copyright 2001 三、控制項設定 (續 3) 5. 加入文字盒 txt. File. Content: Name = "txt. File. Content " Multi. Line = -1 ’True Scroll. Bars = 3 ‘Both v檔案內容通常是多行文字,因此 必須設定為多行列示模式 (Multi. Line = True), 同時設定水平 捲軸與垂直捲軸 (Scroll. Bars)都顯現。
【程式實例 1】 Wbe. nctu Copyright 2001 三、控制項設定 (續 4) 6. 加入命令鈕 cmd. Save: Name = "cmd. Save" Caption = "寫入 " 7. 加入命令 鈕 cmd. Print: Name = "cmd. Print" Caption = "列印 "
【程式實例 1】 Wbe. nctu Copyright 2001 三、控制項設定 (續 5) 7. 加入命令鈕 Name Caption 8. 加入命令鈕 Name Caption cmd. Clear: = "cmd. Clear" = "清除 " cmd. Quit: = "cmd. Quit" = "結束 "
【程式實例 1】 Wbe. nctu Copyright 2001 四、程式設計 1. 檔案名稱的輸入 運用文字盒 (txt. File. Name) 供檔案 名稱的輸入,一般狀況之下無須 為此設計編輯程式。
【程式實例 1】 Wbe. nctu Copyright 2001 四、程式設計 (續 1) 2. 讀取檔案內容 將程式 Ex 1. FRM的事件程序 cmd. Input_Click安排如下,當程式 執行時,按下「讀取」命令鈕,即讀 出指定之檔案內容,並顯示於文字 盒 (txt. File. Content)。
【程式實例 1】 四、程式設計 --讀取檔案內容 Wbe. nctu Copyright 2001 Sub cmd. Input_Click ( ) ' 讀出指定之檔案內容,並顯示於文字盒 (txt. File. Content) txt. File. Content. Visible = False ' 暫時不顯示,以避免閃爍 ' 讀出檔案內容,並顯示於 txt. File. Content. Text = "" ' 清除內容 f$ = txt. File. Name. Text Open f$ For Input As #1 ' 開啟檔案 While Not EOF(1) Line Input #1, a$ ' 逐行讀取 txt. File. Content = txt. File. Content + a$ + Chr$(13) + Chr$(10) ' 逐行加入 txt. File. Content Wend ' 直到檔案尾端 Close #1 ' 關閉檔案 txt. File. Content. Visible = True ' 恢復顯示 End Sub
【程式實例 1】 Wbe. nctu Copyright 2001 讀取檔案內容 --解說: a. 在這段程式中,為了讀取檔案內容, 先執行開啟檔案 (Open)敘述,然後以 Line Input敘述讀入一行資料置於字 串變數 a$, 再將 a$填入文字盒 txt. File. Content 。 b. 清除一個文字盒,就是指定一個空 字串為其內容。
【程式實例 1】 讀取檔案內容 --解說:續 1) ( Wbe. nctu Copyright 2001 c. 檔案內容在實體上乃是一長串的資料碼, 所謂文字檔,指的是顯示出來的內容是一 般的文字或符號,一行一行的效果則是資 料碼中包含換行符號所造成。 以 Line Input 敘述所讀入的一行資料,實質上乃是由當 時檔案的指標位置開始,到換行符號出現 之前的字串,讀入完成時,檔案指標移至 該換行符號之後。讀入之各行資料以連接 運算 (+)併入文字盒 txt. File. Content時,必須於 每行之後加入換行符號 Chr$(13) 及 Chr$(10), 才能在文字盒之中顯現分行的效果。
【程式實例 1】 讀取檔案內容 --解說:續 2) ( Wbe. nctu Copyright 2001 d. 由於檔案的資料行數多寡不一,程式 中運用函數 EOF( ), 配合控制迴圈 While. . . Wend逐行讀入資料並且將之 併入文字盒 txt. File. Content, 直到檔案 結束。 e. 資料讀取完畢,必須執行關閉檔案 (Close)敘述。
【程式實例 1】 Wbe. nctu Copyright 2001 四、程式設計 3. 寫入檔案 將程式 Ex 1. FRM的事件程序 cmd. Save_Click安排如下,當程式 執行時,按下「寫入」命令鈕,即將 文字盒 (txt. File. Content)內容寫入指 定檔案。
【程式實例 1】 Wbe. nctu Copyright 2001 四、程式設計 --寫入檔案 Sub cmd. Save_Click ( ) ' 將文字盒 (txt. File. Content)內容寫入指定檔案 f$ = txt. File. Name. Text Open f$ For Output As #1 ' 開啟檔案 Print #1, txt. File. Content. Text ' 寫入檔案 Close #1 ' 關閉檔案 End Sub
【程式實例 1】 Wbe. nctu Copyright 2001 寫入檔案 --解說: a. 在這段程式中,先執行開啟檔案 (Open)敘述,然後以 Print敘述配上檔 案編號將文字盒 txt. File. Content內容整 個寫入檔案。 b. 資料寫入完畢,執行關閉檔案 (Close) 敘述。
【程式實例 1】 Wbe. nctu Copyright 2001 四、程式設計 4. 列印檔案內容 將程式 EX 1. FRM的事件程序 cmd. Print_Click安排如下,當程式執行 時,按下「列印」命令鈕,即將文字盒 (txt. File. Content)內容送至報表機印出。
【程式實例 1】 四、程式設計 --列印檔案內容 Wbe. nctu Copyright 2001 Sub cmd. Print_Click ( ) ' 將文字盒 (txt. File. Content)內容送至報表機印出 Printer. Print txt. File. Content. Text Printer. New. Page Printer. End. Doc End Sub ' 頁結束 ' 列印結束
【程式實例 1】 Wbe. nctu Copyright 2001 列印檔案內容 --解說: a. 物件 Printer是系統目前所設定之報表 機,Print敘述可將指定之文數字輸出 至指定物件。 b. Printer. New. Page指定報表機將已輸出 之資料加上「頁結束」訊號,使後續 資料在新的一頁印出。 c. Printer. End. Doc表示送印之資料告一 段落。
【程式實例 1】 Wbe. nctu Copyright 2001 四、程式設計 5. 清除內容 將程式 EX 1. FRM的事件程序 cmd. Clear_Click安排如下,當程式執行 時,按下「清除」命令鈕,即將文字盒 (txt. File. Content)內容清除。
【程式實例 1】 Wbe. nctu Copyright 2001 四、程式設計 --清除內容 Sub cmd. Clear_Click ( ) ' 清除文字盒 (txt. File. Content)內容 txt. File. Content. Text = ""' 清除內容 End Sub
【程式實例 1】 Wbe. nctu Copyright 2001 四、程式設計 6. 結束程式執行 將程式 EX 1. FRM的事件程序 cmd. Quit_Click 安排如下,當程式執行時,按下「結束」命 令鈕,即結束程式執行。 Sub cmd. Quit_Click ( ) End ‘ 結束程式執行 End Sub
【程式實例 1】 Wbe. nctu Copyright 2001 五、程式執行時,顯現畫面如下:
【程式實例 1】 Wbe. nctu Copyright 2001 五、程式執行 (續 1) 此時即可進行多種檔案編輯 作: – 若直接按下「讀取」命令鈕 ,則c: autoexec. bat檔 案內容即顯示於文字盒 txt. File. Content。
【程式實例 1】 Wbe. nctu Copyright 2001 五、程式執行 (續 2) 若檔案內容行數過多,可利 用右側垂直捲軸上下變動 顯示範圍;若部分資料行過 長,亦可利用下方水平捲 軸左右移動顯示範圍。 檔案內容可進行編輯。 可變更檔案名稱,並按下「 讀取」命令鈕顯示其內容, 亦可按下「寫入」命令鈕指 定存檔。
【程式實例 1】 Wbe. nctu Copyright 2001 五、程式執行 (續 3) 按下「列印」命令鈕,即 將編輯後之檔案內容送 至報表機印出。 按下「清除」命令鈕,即 將文字盒內容清除。 按下「結束」命令鈕,即 結束程式執行。
Wbe. nctu Copyright 2001 程式實例 2 學生成績登錄 ─利用檔案登錄學生學 號、姓名及國文、英文、數學成績,以 便爾後處理。
【程式實例 2】 Wbe. nctu Copyright 2001 一、程式設計構想: – 檔案名稱訂 為 SCORE. DAT, 程式開始執行時 即開啟檔案,當結束程式執行時則關閉檔案。 – 運用五個文字盒的欄位輸入學號、姓名及國文、 英文、數學成績。 – 安排命令鈕以執行寫入、清除及結束等功能: 1. 寫入(cmd. Save)─將輸入之學號、姓名及國文、英文、數學成績 寫入檔案成為檔案中的一筆記錄。 2. 清除(cmd. Clear)─清除各文字盒內容。 3. 結束(cmd. End)─結束程式執行。 • 安排標籤項顯示處理中之記錄筆數。
【程式實例 2】 Wbe. nctu Copyright 2001 二、表單配置
【程式實例 2】 Wbe. nctu Copyright 2001 三、控制項設定 逐一加入各控制項,並設定其屬性如下: 1. 設定表單屬性: Caption Name = "學生成績登錄" = "frm. Ex 2" 2. 加入標籤項 lbl. Rec. No: Alignment = 2 'Center Caption = "1" v Caption設為 1,表示程式開始時將填入之資料為第一筆
【程式實例 2】 Wbe. nctu Copyright 2001 三、控制項設定 (續 1) 3. 加入標籤項 Label 1~ Label 8, 標題分別是:"學 號: "姓名: "國文: "英文: "數學: "成 "、 "、 "、 績 ─"、 "、 "。 "第 "筆 4. 加入文字盒 txt. ID、 txt. Name、 txt. Chinese、 txt. English、 txt. Math: 5. 加入命令鈕 cmd. Save: Caption = "寫入" 6. 加入命令鈕 cmd. Clear : Caption = "清除" 7. 加入命令鈕 cmd. Quit: Caption = "結束"
【程式實例 2】 Wbe. nctu Copyright 2001 四、程式設計 1. 程式開始執行 Form_Load事件程序是程式開始時先行執行的 程式段,將程式 Ex 2. FRM的事件程序 Form_Load安排如下,則程式開始執行時即開 啟檔案。標籤項記錄筆數 lbl. Rec. No於屬性設定 時已預設為 1,表示程式開始時將填入之記錄 為第一筆。 Sub Form_Load ( ) Open "SCORE. DAT" For Output As #1 ‘ 開啟檔案 End Sub
【程式實例 2】 Wbe. nctu Copyright 2001 四、程式設計 (續 1) 2. 成績登錄 運用文字盒欄位供成績登錄,無須為此 設計編輯程式。
【程式實例 2】 Wbe. nctu Copyright 2001 四、程式設計 (續 2) 3. 清除內容 將程式 Ex 2. FRM的事件程序 cmd. Clear_Click安排 如下,在成績登錄過程中,若需要清除各文字盒 內容,按下「清除」命令鈕即可。 Sub cmd. Clear_Click ( ) ‘ 清除各文字盒內容 txt. ID. Text = "" txt. Name. Text = "" txt. Chinese. Text = "" txt. English. Text = "" txt. Math. Text = "" End Sub
【程式實例 2】 Wbe. nctu Copyright 2001 四、程式設計 (續 3) 4. 寫入檔案 將程式 Ex 2. FRM的事件程序 cmd. Save_Click 安排如下,當程式執行時,按下「寫入」命令 鈕,即將各文字盒內容寫入檔案 SCORE. DAT。 Sub cmd. Save_Click ( ) ' 將輸入之學號、姓名及國文、英文、數學成績寫入檔案 Stu. ID$ = txt. ID. Text Stu. Name$ = txt. Name. Text Chinese! = Val(txt. Chinese. Text) English! = Val(txt. English. Text) Math! = Val(txt. Math. Text) Write #1, Stu. ID$, Stu. Name$, Chinese!, English!, Math! ' 寫入檔案 lbl. Rec. No. Caption = lbl. Rec. No. Caption + 1 ' 標籤項記錄筆數加一 cmd. Clear_Click ' 清除各文字盒內容 End Sub
【程式實例 2】 Wbe. nctu Copyright 2001 寫入檔案 --解說: a. 檔案 SCORE. DAT已於程式開始時由 Form_Load事件程序先行執行開啟檔案的 動作。 b. 學號、姓名、國文、英文、數學成績等五項 資料對應地分別自文字盒存入兩個字串變 數 (Stu. ID$, Stu. Name$)及三個實數 (Chinese!, English!, Math!)。 c. Write敘述配上檔案編號將五項資料寫入 檔案成為檔案中的一筆記錄。 Write敘述不 同於 Print敘述,資料寫入檔案時在各項資 料之間將加入逗號 (, ),文字字串並加雙引 號 (")於前後。
【程式實例 2】 Wbe. nctu Copyright 2001 寫入檔案 --解說:續 1) ( d. 標籤項記錄筆數加一,表示下一筆 記錄之筆數。 e. 為了清除各文字盒內容以便下一筆 記錄之輸入,可運用事件程序 cmd. Clear_Click。
【程式實例 2】 Wbe. nctu Copyright 2001 5. 結束程式執行 將程式 Ex 2. FRM的事件程序 cmd. Quit_Click安排 如下,當程式執行時,按下「結束」命令鈕,即 關閉檔案並結束程式執行。 Sub cmd. Quit_Click ( ) Close #1 ‘ 關閉檔案 End ‘ 結束程式執行 End Sub
【程式實例 2】 Wbe. nctu Copyright 2001 五、程式執行時,顯現畫面如下:
【程式實例 2】 Wbe. nctu Copyright 2001 五、程式執行 (續 1) 此時即可進行成績登錄 作: – 在各文字盒欄位對應地填入學號、姓名、 國文、英文、數學成績等五項資料。例如:
【程式實例 2】 Wbe. nctu Copyright 2001 五、程式執行 (續 2) – 必要時,可按下「清除」命令鈕,即將各文字盒內 容清除。 – 按下「寫入」命令鈕,即將輸入之學號、姓名及國 文、英文、數學成績寫入檔案成為檔案中的一筆 記錄。 – 成績寫入檔案之後,各文字盒內容將自動清除, 標示的筆數也自動加一,可繼續填入下一筆記錄。 – 當所有成績登錄完畢時,按下「結束」命令鈕,即 結束程式執行。
【程式實例 2】 Wbe. nctu Copyright 2001 五、程式執行 (續 3) – 運用程式實例 1可以觀看 SCORE. DAT檔 案內資料登錄的狀況,如下所示:
Wbe. nctu Copyright 2001 程式實例 3 學生成績列示 ─列示檔案中已登錄之 每位學生成績資料及三科成績總分, 並顯示各科及總分之平均分數。
【程式實例 3】 Wbe. nctu Copyright 2001 一、程式設計構想 程式執行時可運用 Print指令在『除錯 視窗 (Debug Window)』 顯示輸出之文字 資料。 v除錯視窗是測試程式時協助程式設計員 排除錯誤的 具視窗,亦可作為程式的 輸出物件,具有一般視窗之移位、變換大 小之控制功能,可運用編輯鍵或方向鍵 變動游標位置或利用垂直捲軸以變動顯 示範圍。
【程式實例 3】 Wbe. nctu Copyright 2001 一、程式設計構想 (續 1) 安排命令鈕「開始」進行讀取成績資料 與運算,並列示於 Debug Window中。 安排命令鈕「結束」以結束程式執行。
【程式實例 3】 Wbe. nctu Copyright 2001 二、表單配置
【程式實例 3】 Wbe. nctu Copyright 2001 三、控制項設定 逐一加入各控制項,並設定其屬性如下: 1. 設定表單屬性: Caption Name = "學生成績列示" = "frm. Ex 3" 2. 加入標籤 項 lbl. Msg: Alignment Caption " = 2 'Center = "按下「開始」命令鈕,成績將列示於Debug Window中。 3. 加入命令鈕 cmd. Begin: Caption = "開始" 4. 加入命令 鈕 cmd. Quit: Caption = "結束"
【程式實例 3】 Wbe. nctu Copyright 2001 四、程式設計 1. 開始列示 將程式 Ex 3. FRM的事件程序 cmd. Begin_Click安排如下,在程式執行 時按下「開始」命令鈕成績即列示於 Debug Window中。
Sub cmd. Begin_Click ( ) ‘ 將成績列示於Debug Window中。 ‘ 標題 Debug. Print "學號"; Tab(10); "姓名"; Tab(20); "國文"; Tab(26); Debug. Print "英文"; Tab(32); "數學"; Tab(38); "總分" Debug. Print "------ ----" 四、程式設計 — 1. 開始列示 Wbe. nctu Copyright 2001 c. Sum! = 0 : e. Sum! = 0 : m. Sum! = 0 : t. Sum! = 0 : Stu. No% = 0 ‘累計用之各變數設定初值為零 Open "SCORE. DAT" For Input As #1 ‘ 逐筆讀取記錄,累計成績,列示 While Not EOF(1) Input #1, Stud. ID$, Stud. Name$, Chinese!, English!, Math! Stu. No% = Stu. No% + 1 ‘ 累計學生人數 c. Sum! = c. Sum! + Chinese! ‘ 累計國文成績 e. Sum! = e. Sum! + English! ‘ 累計英文成績 m. Sum! = m. Sum! + Math! ‘ 累計數學成績 Total! = Chinese! + English! + Math! ‘ 合計總成績 t. Sum! = t. Sum! + Total! ‘ 累計總成績 Debug. Print Stud. ID$; Tab(10); Stud. Name$; Tab(20); Chinese!; Debug. Print Tab(26); English!; Tab(32); Math!; Tab(38); Total! Wend Close #1 ‘ 關閉檔案 ‘ 開啟檔案 ‘ 計算、顯示平均成績 c. Avg! = c. Sum! / Stu. No% : e. Avg! = e. Sum! / Stu. No% : m. Avg! = m. Sum! / Stu. No% : t. Avg! = t. Sum! / Stu. No% Debug. Print "------ ----" Debug. Print Tab(10); "平均"; Tab(20); c. Avg!; Tab(26); e. Avg!; Debug. Print Tab(32); m. Avg!; Tab(38); t. Avg!
【程式實例 3】 Wbe. nctu Copyright 2001 四、程式設計 2. 結束程式執行 將程式 Ex 3. FRM的事件程序 cmd. Quit_Click安排如下, 當程式執行時,按下「結束」命令鈕,即結束程式執行。 Sub cmd. Quit_Click ( ) End ‘ 結束程式執行 End Sub
【程式實例 3】 Wbe. nctu Copyright 2001 五、程式執行時,顯現畫面如下:
【程式實例 3】 Wbe. nctu Copyright 2001 五、程式執行 (續 1) 按下「開始」命令鈕,成績即列示於 Debug Window中。
【程式實例 3】 Wbe. nctu Copyright 2001 五、程式執行 (續 2) 按下「結束」命令鈕,即結束程式執行。
Wbe. nctu Copyright 2001 §習題 3 1. 試將程式實例 1 改成可以同時開啟 兩個文字檔,並可將兩檔之內容合併 成一個新檔。 2. 試將程式實例 1 改成可以對檔案內 容執行取代的功能,意即指定一字串 為搜尋目標,將檔案內容中所有符合 的目標全部取代為另一指定字串。
Wbe. nctu Copyright 2001 §習題 III 3. 試設計一程式類似程式實例 2,用以 登錄學生身體測量,即身高、體重、 胸圍,其中學號、姓名兩欄不需鍵入, 而由程式實例 2 所建資料檔讀入顯 示。 4. 試修改程式實例 3 將成績列示於自 訂表單中的文字盒。
Wbe. nctu Copyright 2001 IV. 隨機存取檔案 本節以程式實例 4 示範隨機存取檔案 的使用方法,除了前述的檔案開啟與 關閉敘述,程式實例中示範 Get 敘述 讀取檔案中一筆記錄、 Put敘述將一筆 記錄資料寫入檔案的用法。
Wbe. nctu Copyright 2001 程式實例 4 成績檔隨機存取 ─利用隨機存取檔案 登錄學生學號、姓名及國文、英文、數 學成績。
【程式實例 4】 Wbe. nctu Copyright 2001 一、程式設計構想 檔案名稱訂為 SCORE. RND, 程式開始執行 時即開啟檔案,當結束程式執行時則關閉 檔案。 運用五個文字盒的欄位輸入學號、姓名及 國文、英文、數學成績。 運用使用者自訂型態 Type. . . End Type宣告 資料型態 Type. Score結合五項資料成為檔案 記錄的資料型態。 安排命令鈕 cmd. Prev、 cmd. Next以變換顯示 上一筆及下一筆記錄資料。
【程式實例 4】 Wbe. nctu Copyright 2001 一、程式設計構想 安排命令鈕以執行新增、寫入、清除 及結束等功能: a. 新增 (cmd. New)─清除各文字盒內容,供新 增記錄鍵入資料。 b. 寫入 (cmd. Save)─將輸入之學號、姓名及 國文、英文、數學成績寫入檔案成為檔案 中的一筆記錄。 c. 清除 (cmd. Clear)─清除各文字盒內容。 d. 結束 (cmd. End)─結束程式執行。
【程式實例 4】 Wbe. nctu Copyright 2001 一、程式設計構想 (續 1) 安排標籤項顯示處理中之記錄筆數。 安排標籤項顯示檔案中已有資料之記 錄筆數。
【程式實例 4】 Wbe. nctu Copyright 2001 二、表單配置
【程式實例 4】 Wbe. nctu Copyright 2001 三、控制項設定 逐一加入各控制項,並設定其屬性如下: 1. 設定表單屬性: Caption Name = "成績檔隨機存取" = "frm. Ex 4" 2. 加入標籤 項 lbl. Rec. No: Alignment = 2 'Center Caption = "1" v Caption設為 1,表示程式開始時將顯示之資料為第一筆 3. 加入標籤項 lbl. Rec. Count: Alignment Caption = 2 'Center = "0"
【程式實例 4】 Wbe. nctu Copyright 2001 三、控制項設定 (續 1) 4. 加入標籤項 Label 1~ Label 10, 標題分別 是: "學號: "姓名: "國文: "英文: " "、 "、 數學: "成績 ─"、 "、 "。 "、 "第 "筆 "共 "筆 Font. Bold = 0 'False 5. 加入文字盒 txt. ID、 txt. Name、 txt. Chinese、 txt. English、 txt. Math: 6. 加入命令鈕 cmd. Prev: Caption = "上一筆" 7. 加入命令鈕 cmd. Next: Caption = "下一筆"
【程式實例 4】 Wbe. nctu Copyright 2001 三、控制項設定 (續 2) 8. 加入命令 鈕 cmd. New: Caption = "新增" 9. 加入命令鈕 cmd. Save: Caption = "寫入" 10. 加入命令鈕 cmd. Clear: Caption = "清除" 11. 加入命令鈕 cmd. Quit: Caption = "結束"
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 1. 宣告資料型態 • 加入程式模組 Ex 4. BAS, 宣告資料型態 Type. Score 結合五項資料成為檔案記錄的資料 型態。 ‘ 宣告檔案記錄的資料型態 Type. Score Stud. Id As String * 6 ‘學號 Stud. Name As String * 8 Chinese As Single English As Single Math As Single End Type ‘姓名 ‘國文 ‘英文 ‘數學 解說: 這個資料型態的宣 告設定 Type. Score包 含五項資料(六個 位元組的學號、八 個位元組的姓名及 三個實數)合成一 個特殊的資料型態 , , 以便爾後作為檔案 記錄之用。
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 (續 1) 2. 宣告檔案記錄變數 • 在程式 Ex 4. FRM的程式碼宣告程序 (declarations)中,加入下列變數宣告敘述。 Dim Stud. Score As Type. Score ’ 宣告檔案記錄變數 解說: 這個變數的宣告設定 Stud. Score是 Type. Score的資料型 態 , ,用作一個檔案記錄 。
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 (續 2) 3. 程式開始執行 – 將程式 Ex 4. FRM 的事件程序 Form_Load 安排如下,當程式開始執行即開啟隨機 存取檔案,並執行「讀取一筆記錄」與「辨 識檔案中記錄筆數」兩個副程式。標籤項 記錄筆數 lbl. Rec. No 預設為 1,表示程式 開始時顯示之記錄為第一筆。
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 (續 3) --3. 程式開始執行 Sub Form_Load ( ) ‘ 開啟隨機存取檔 Open "SCORE. RND" For Random As #1 Len = Len(Stud. Score) Read. Record ‘讀取一筆記錄 Record. Number. Check ‘ 辨識檔案中記錄筆數 End Sub 解說: a. 隨機存取檔宜設定適當的記錄長度,運用函數 Len取得 檔案記錄變數 Stud. Score的長度即是正確的記錄長度。 b. Read. Record副程式讀取一筆記錄, Record. Number. Check副 程式辨識檔案中記錄筆數將分別說明于后。
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 (續 4) 4. 讀取一筆成績記錄 在程式 Ex 4. FRM加入下列副程式 Read. Record, 設定讀取 一筆記錄的相關步驟。 Sub Read. Record ( ) ‘ 讀取一筆成績記錄 Get #1, lbl. Rec. No. Caption, Stud. Score 績記錄 ‘ 將成績填入對應之文字盒 txt. ID. Text = Stud. Score. Stud. ID ‘ 學號 txt. Name. Text = Stud. Score. Stud. Name txt. Chinese. Text = Stud. Score. Chinese txt. English. Text = Stud. Score. English ‘ 英文 txt. Math. Text = Stud. Score. Math ’ 數學 End Sub ‘ 讀取成 ‘ 姓名 ‘ 國文
【程式實例 4】 4. 讀取一筆成績記錄 --解說: Wbe. nctu Copyright 2001 a. 讀取的記錄編號是藉標籤項 lbl. Rec. No先行 設定。 b. 隨機存取檔案資料的讀取是以 Get敘述配 上檔案編號 (#1)及記錄編號 (lbl. Rec. No. Caption)一次讀取檔案中的一筆記 錄置入一個檔案記錄變數 (Stud. Score)。 c. 學號、姓名、國文、英文、數學成績等五項 資料對應地分別自檔案記錄變數 Stud. Score 的五個附項填入各文字盒。
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 5. 辨識檔案中記錄筆數 在程式 Ex 4. FRM加入下列副程式 Record. Number. Check, 設定辨識檔案中 記錄筆數的相關步驟,並設定「上一筆」 與「下一筆」命令鈕是否作用。
Sub Record. Number. Check ( ) ' 辨識檔案中記錄筆數 四、程式設計 --辨識檔案中記 ' 顯示檔案中所有記錄之筆數 lbl. Rec. Count. Caption = 錄筆數 Int(LOF(1) / Len(Stud. Score)) Wbe. nctu Copyright 2001 ' 設定「上一筆」命令鈕是否作用 If lbl. Rec. No. Caption = 1 Then cmd. Prev. Enabled = False Else cmd. Prev. Enabled = True End If ' 設定「下一筆」命令鈕是否作用 If Val(lbl. Rec. No. Caption) >= Val(lbl. Rec. Count. Caption) Then cmd. Next. Enabled = False Else cmd. Next. Enabled = True End If End Sub
【程式實例 4】 辨識檔案中記錄筆數 --解說: Wbe. nctu Copyright 2001 檔案中記錄筆數可藉由檔案長度與檔案記錄長度 的比例得知, Lof(1) 取得檔案編號為 1的檔案長度, 除以檔案記錄變數 Stud. Score的長度,再去除小數 的整數值即是記錄筆數,將它顯示在標籤項 lbl. Rec. Count。 b. 當目前顯示的記錄第一筆時,若按下「上一筆」命 令鈕是沒有任何意義的,因此必須依據目前記錄 筆數是否為 1,設定「上一筆」命令鈕是否作用。 c. 當目前顯示中的記錄是最後一筆時,若按下「下 一筆」命令鈕是沒有任何意義的,因此必須依據 目前記錄筆數與檔案記錄筆數的關係,設定「下 一筆」命令鈕是否作用。 a.
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 6. 成績登錄 運用文字盒欄位供成績登錄,無須為此 設計編輯程式。
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 (續 1) 7. 清除內容 將程式 Ex 4. FRM 的事件程序 cmd. Clear_Click 安 排如右,在成績登 錄過程中,若需要 清除各文字盒內 容,按下「清除」命 令鈕即可。 Sub cmd. Clear_Click ( ) ‘ 清除各文字盒內容 txt. ID. Text = "" txt. Name. Text = "" txt. Chinese. Text = "" txt. English. Text = "" txt. Math. Text = "" ’ 游標停置於學號欄 txt. ID. Set. Focus End Sub 解說: 為了確實控制游標停置位置,可利用 Set. Focus 方法,txt. ID. Set. Focus敘述就是控制游標停置於 學號欄。
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 (續 2) 8. 寫入檔案 將程式 Ex 4. FRM 的事件程序 cmd. Save_Click 安 排如下,當程式執行時,按下「寫入」命令鈕, 即將各文字盒內容寫入檔案 SCORE. RND。 Sub cmd. Save_Click ( ) ‘ 將輸入之學號、姓名及國文、英文、數學成績寫入檔案 Stud. Score. Stud. ID = txt. ID. Text Stud. Score. Stud. Name = txt. Name. Text Stud. Score. Chinese = txt. Chinese. Text Stud. Score. English = txt. English. Text Stud. Score. Math = txt. Math. Text Put #1, lbl. Rec. No. Caption, Stud. Score ‘ 寫入檔案 Record. Number. Check ‘辨識檔案中記錄筆數 End Sub
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 (續 3) 8. 寫入檔案 將程式 Ex 4. FRM 的事件程序 cmd. Save_Click 安 排如下,當程式執行時,按下「寫入」命令鈕, 即將各文字盒內容寫入檔案 SCORE. RND。 Sub cmd. Save_Click ( ) ‘ 將輸入之學號、姓名及國文、英文、數學成績寫入檔案 Stud. Score. Stud. ID = txt. ID. Text Stud. Score. Stud. Name = txt. Name. Text Stud. Score. Chinese = txt. Chinese. Text Stud. Score. English = txt. English. Text Stud. Score. Math = txt. Math. Text Put #1, lbl. Rec. No. Caption, Stud. Score ‘ 寫入檔案 Record. Number. Check ‘辨識檔案中記錄筆數 End Sub
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 (續 4) — 8. 寫入檔案 解說: a. 檔案 SCORE. RND 已於程式開始時由 Form_Load 事件程 序先行執行開啟檔案的動作。 b. 學號、姓名、國文、英文、數學成績等五項資料對應地分 別自文字盒存入檔案記錄變數 Stud. Score 的五個附項。 c. 隨機存取檔案資料的寫入是以 Put敘述配上檔案編號 (#1) 及記錄編號 (lbl. Rec. No. Caption)一次寫入一個記錄變數 (Stud. Score)成為檔案中的一筆記錄。 d. 由於寫入之記錄可能是新增的一筆,因此必須核對檔案 中記錄筆數。 e. 核對檔案中記錄筆數運用副程式 Record. Number. Check 來完成,並設定「上一筆」與「下一筆」命令鈕是否作用。
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 (續 5) 9. 新增記錄 將程式 Ex 4. FRM的事件程序 cmd. New_Click安排如下, 當程式執行時,按下「新增」命令鈕,即將各文字盒 內容清除,以便填入新增記錄之內容。 Sub cmd. New_Click ( ) ‘ 新增記錄 lbl. Rec. No. Caption = lbl. Rec. Count. Caption + 1 cmd. Clear_Click End Sub 解說: a. 新增記錄乃是在原有資料之後增加新的一筆記錄,因此將寫入檔 案之筆數為現有記錄筆數加一。 b. 清除各文字盒內容可運用事件程序cmd. Clear_Click來完成。
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 (續 6) 10. 顯示下一筆記錄 將程式 Ex 4. FRM 的事件程序 cmd. Next_Click 安 排如下,當程式執行時,按下「下一筆」命令鈕, 即自檔案 SCORE. RND 讀取下一筆記錄並顯示 在文字盒。 Sub cmd. Next_Click ( ) ‘顯示下一筆記錄 lbl. Rec. No. Caption = lbl. Rec. No. Caption + 1 Read. Record ‘ 讀取一筆記錄 Record. Number. Check ‘ 辨識檔案中記錄筆數 End Sub
【程式實例 4】 10. 顯示下一筆記錄 --解說: Wbe. nctu Copyright 2001 a. 標籤項 lbl. Rec. No 的數值加一,再執行 副程式 Read. Record 即 可顯示下一筆 記錄。 b. 執行副程式 Record. Number. Check, 設 定「上一筆」與「下一筆」命令鈕是否 作用。
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 (續 8) 11. 顯示上一筆記錄 – 將程式 Ex 4. FRM 的事件程序 cmd. Prev_Click 安 排如下,當程式執行時,按下「上一筆」命令鈕, 即自檔案 SCORE. RND 讀取上一筆記錄並顯示 在文字盒。 Sub cmd. Prev_Click ( ) ‘ 顯示上一筆記錄 lbl. Rec. No. Caption = lbl. Rec. No. Caption – 1 Read. Record ’ 讀取一筆記錄 Record. Number. Check ‘ 辨識檔案中記錄筆數 End Sub
【程式實例 4】 11. 顯示上一筆記錄 --解說: Wbe. nctu Copyright 2001 a. 標籤項 lbl. Rec. No的數值減一,再 執行副程式 Read. Record即可顯示 上一筆記錄。 b. 執行副程式 Record. Number. Check, 設定「上一筆」與「下一筆」命令 鈕是否作用。
【程式實例 4】 Wbe. nctu Copyright 2001 四、程式設計 (續 10) 12. 結束程式執行 – 將程式 Ex 4. FRM的事件程序 cmd. Quit_Click 安排如下,當程式執行時,按下「結束」命 令鈕,即關閉檔案並結束程式執行。 Sub cmd. Quit_Click ( ) Close #1 ‘ 關閉檔案 End ‘ 結束程式執行 End Sub
【程式實例 4】 Wbe. nctu Copyright 2001 五、程式執行 (續 11) 若檔案 SCORE. RND尚未建檔,則程式 執行時,顯現畫面如下:
【程式實例 4】 Wbe. nctu Copyright 2001 五、程式執行 (續 12) 若檔案 SCORE. RND已有資料,則程式 執行時將顯示第一筆記錄。
【程式實例 4】 Wbe. nctu Copyright 2001 五、程式執行 (續 13) 此時即可進行成績登錄 作: – 在各文字盒欄位對應地填入學號、姓名、 國文、英文、數學成績等五項資料。例如:
【程式實例 4】 Wbe. nctu Copyright 2001 五、程式執行 (續 14) 成績登錄 作 (續 ): – 必要時,可按下「清除」命令鈕,即將各文字盒內 容清除。 – 按下「寫入」命令鈕,即將輸入之學號、姓名及國 文、英文、數學成績寫入檔案成為檔案中的一筆 記錄。 – 按下「新增」命令鈕,各文字盒內容將清除,填入 新增記錄之內容將可寫入原有記錄之後。成績 寫入檔案之後,標示的筆數將自動加一,若需要 繼續新增資料可再按下「新增」命令鈕。
【程式實例 4】 Wbe. nctu Copyright 2001 五、程式執行 (續 15) 成績登錄 作 (續 ): – 按下「上一筆」命令鈕可變換顯示上一筆 記錄資料 – 按下「下一筆」命令鈕可變換顯示下一筆 記錄資料 當所有成績登錄完畢時,按下「結束」命 令鈕,即結束程式執行。
Wbe. nctu Copyright 2001 §習題 IV 1. 試將程式範例四改成可以隨意指定 某一筆資料,並將之顯示。 2. 程式範例四中,設定「上一筆」與「下 一筆」命令鈕是否作用的程式段在某 些狀況下是多餘的執行步驟,試列舉 之。 3. 修改程式範例四,以去除第 2題所提 之缺失。
Wbe. nctu Copyright 2001 V. 二進位存取檔案 本節以程式實例 5 示範二進位存取檔 案的使用方法,除了前述的檔案開啟 與關閉敘述,程式實例中示範 Get 敘 述讀取檔案資料的用法,並介紹共用 對話盒用以指定開啟檔案名稱的用法。
Wbe. nctu Copyright 2001 程式實例 5 二進位存取檔案內容顯示 ─開啟指定 檔名之檔案,讀取並以文字碼及十六 進位碼顯示其內容。
【程式實例 5】 Wbe. nctu Copyright 2001 一、程式設計構想 利用共用對話盒讓使用者指定開啟檔案名 稱。 一次讀取檔案中十六個位元組的內容。 運用一個文字盒 (txt. Text)以文字碼顯示檔 案內容。 運用一個文字盒 (txt. Hex)以十六進位碼顯 示檔案內容。 運用一個水平捲軸 (hsb. Locate) 供使用者變 換顯示內容對應檔案中之位置。
Wbe. nctu Copyright 2001 一、程式設計構想 (續 1) 安排命令鈕以執行開啟檔案及結束等功能: a. 開啟檔案 (cmd. Open)─指定開啟檔案名稱,讀出 檔案內容,並顯示開頭於十六個位元組的內容 文字盒 (txt. Text, txt. Hex)。 b. 結束 (cmd. End)─結束程式執行。 安排標籤項 (lbl. File. Name)以顯示目前處理中 之檔案名稱。 安排標籤項 (lbl. Address)以顯示目前讀取資 料之位置。 安排標籤項 (lbl. Lof)以顯示檔案之大小。
Wbe. nctu Copyright 2001 二、表單配置
Wbe. nctu Copyright 2001 三、控制項設定 逐一加入各控制項,並設定其屬性如下: 1. 設定表單屬性 : Caption = "二進位存取檔案內容顯示 Name = "frm. Ex 5" 2. 加入標籤項 Label 1: Caption = "檔案名稱:" 3. 加入標籤 項 Label 2: Alignment = 1 ‘Right Justify Caption = "位址: " "
Wbe. nctu Copyright 2001 三、控制項設定 (續 1) 4. 加入標籤 項 Label 3: Alignment = 1 'Right Justify Caption = "文字碼:" 5. 加入標籤項 Label 4: Alignment = 1 'Right Justify Caption = "十六進位碼:" 6. 加入標籤項 Label 5: Caption = "1" 這個標籤項安置在水平捲軸的左端下方,用於 標示檔案的開端是第一個位元組的位置。
Wbe. nctu Copyright 2001 三、控制項設定 (續 2) 7. 加入標籤項 Caption 8. 加入標籤項 Caption lbl. File. Name: = "filename. ext" lbl. Address: = "0000" 這個標籤項安置在水平捲軸的上方,用於標示 目前顯示內容的開端在檔案中的位置。 9. 加入標籤項 lbl. Lof: Caption = "0000" 這個標籤項安置在水平捲軸的右端下方,用於 標示檔案的尾端,也是檔案的大小。
Wbe. nctu Copyright 2001 三、控制項設定 (續 3) 10. 加入文字盒 txt. Text: Font. Name = "細明體 " Font. Size = 24 使用細明體則每字的顯示寬度能夠一致。 11. 加入文字盒 txt. Hex: Font. Name = "細明體 " Font. Size = 12 十六進位碼必須用兩個字元表示一個位元組, 將字體寬度定為文字碼的一半,可使兩者易於 對照。
Wbe. nctu Copyright 2001 三、控制項設定 (續 4) 12. 加入命令鈕 cmd. Open: Caption = "開啟檔案 " 13. 加入命令鈕 cmd. Quit: Caption = "結束 " 14. 加入共用對話 盒 CMDialog 1: 共用對話盒可於設計階段安置於表單 中任何位置,執行時不會顯現。
四、程式設計 Wbe. nctu Copyright 2001 1. 宣告常數 在程式 Ex 5. FRM 的程式碼宣告程序 (declarations)中,加入下列常數宣告敘述。 Const Data. Len% = 16 數 ‘每次讀取、顯示資料之位元組 解說: 這個常數的宣告設定每次讀取、顯示 16個位元 組之資料,文字盒 txt. Text 與 txt. Hex 即是配合 此值安排適當寬度。
Wbe. nctu Copyright 2001 四、程式設計 (續 1) 2. 程式開始執行 將程式 Ex 5. FRM 的事件程序 Form_Load 安排如下, 當程式開始執行即利用共用對話盒讓使用者指定 開啟檔案名稱。 Sub Form_Load ( ) cmd. Open_Click ‘ 開啟檔案 End Sub 解說: 若未指定檔案名稱並開啟檔案讀取內容,則顯示內 容即無意義,因此,開始執行程式時,如同按下「開 啟檔案」命令鈕,利用共用對話盒讓使用者指定開 啟檔案名稱。
Wbe. nctu Copyright 2001 四、程式設計 (續 2) 3. 開啟檔案 將程式 Ex 5. FRM 的事件程序 cmd. Open _Click 安排如下,當程式執行 時,按下「開啟檔案」命令鈕,即利用 共用對話盒讓使用者指定開啟檔案名 稱,並顯示檔案名稱於文字盒 (txt. File. Name)。
Sub cmd. Open_Click ( ) ‘ 開啟檔案 ‘ 利用共用對話盒讓使用者指定開啟檔案名 Wbe. nctu Copyright 2001 ' 將共用對話盒執行時取消的動作設成錯誤陷阱 CMDialog 1. Cancel. Error = True ' 啟動設陷的跳離程式標識 On Error Go. To Err. Handler. Open ' 設定檔案類型 CMDialog 1. Filter = "所有檔案 (*. *)|*. *|執行檔 (*. exe)|*. exe" ' 指定內定檔案類型 CMDialog 1. Filter. Index = 1 ' 指定使用共用對話盒之第一種動作 ─開啟檔案 CMDialog 1. Action = 1 ' <共用對話盒接手處理 > ' 自共用對話盒取得指定檔案名稱 lbl. Filename = CMDialog 1. Filename Close #1 ‘ 關閉檔案編號 1號的使用
Open lbl. Filename For Binary As #1 ' 開啟二進位存取檔案 lbl. Lof = LOF(1) ' 設定水平捲軸相關屬性 hsb. Locate = 1 ' 設定顯示起始位置為第一個位元組 hsb. Locate. Min = 1 ' 最小值 Wbe. nctu Copyright 2001 ' 最大值 hsb. Locate. Max = LOF(1) - 15 hsb. Locate. Large. Change = Data. Len% hsb. Locate. Small. Change = 1 Show. Data ' 大跨步移動距離 ' 小跨步移動距離 ' 顯示檔案資料 Exit. Open: Exit Sub ' 結束事件程序 Err. Handler. Open: ' 使用者中途取消 Resume Exit. Open End Sub ' 回復標識 Exit. Open的程式位置
Wbe. nctu Copyright 2001 3. 開啟檔案 --解說: a. 利用共用對話盒讓使用者指定開啟 檔案名稱,必須對共用對話盒的部 分屬性先作指定,當動作屬性 Action 被設定時,共用對話盒即顯現於畫 面讓使用者指定。
Wbe. nctu Copyright 2001 3. 開啟檔案 --解說:續 1) ( b. 共用對話盒的動作屬性 Action 設定 為 1是作為指定開啟檔案名稱之用, 相關的屬性包括 Cancel. Error、 Filter. Index必須適當地先作指定。
Wbe. nctu Copyright 2001 3. 開啟檔案 --解說:續 2) ( c. 共用對話盒的「取消的動作設成錯誤陷阱」 屬性 Cancel. Error 是用作設定共用對話盒執 行時,若使用者執行取消的動作,是否將 它變成一個錯誤的訊號來處理。若設定為 「是 (True)」 CMDialog 1. Cancel. Error = True, 則 程式中必須搭配啟動設陷的跳離程式標識 On Error Go. To Err. Handler. Open 及 Err. Handler. Open: , 與處理程序 Resume Exit. Open。 在本例中,若使用者於共用對話 盒執行取消的動作,則新指定的或未完成 指定的檔案即不被採用,顯示內容依舊是 共用對話盒出現前的狀況。
Wbe. nctu Copyright 2001 3. 開啟檔案 --解說:續 3) ( d. 共用對話盒的「檔案過濾器」屬 性 Filter是用作設定共用對話盒 執行時,檔案列示目錄顯示的 檔案類型之選項,意即組合箱 "List Files of Type: " 下拉時所顯 示的選項。一個選項名稱(如執 行檔 (*. exe)) 搭配一個籠統檔名 (如 *. exe) 中間用符號 "|"隔開為 一組選項集合,檔案類型之選 項可由多組選項集合聯結而成, 各組選項集合之間也是用符號 "|"隔開。
Wbe. nctu Copyright 2001 3. 開啟檔案 --解說:續 4) ( e. 共用對話盒的「檔案過濾器預設選項 指標」屬性 Filter. Index 是用作設定共 用對話盒執行時,檔案列示目錄顯示 的檔案類型之預設選項,意即組合箱 “List Files of Type: ” 顯示框之選項指標。 在本例中,將 Filter. Index 指定為 1,預 設選項就是 "所有檔案 (*. *)"。
Wbe. nctu Copyright 2001 3. 開啟檔案 --解說:續 5) ( f. 共用對話盒在使用者按下命令 鈕「 OK」 後 消失,程式將循序繼續進行,由共用對話 盒的屬性 CMDialog 1. File. Name 取得指定檔 案名稱。若使用者按下命令鈕「 Cancel」, 則 將產生錯誤訊號,程式跳離原有的順序, 轉至程式標識 Err. Handler. Open 的位置往下 執行,再由回復敘述 Resume的指示轉至程 式標識 Exit. Open 的位置而結束事件程序, 意即此段事件程序的執行並未改變檔案名 稱及各個顯示項。
Wbe. nctu Copyright 2001 3. 開啟檔案 --解說:續 6) ( g. 在本程式中固定地使用編號 1號的檔案, 開啟檔案之前,同一檔案編號可能已經開 啟使用之中,為避免造成錯誤,宜先行將 此一檔案編號關閉。至於未使用的檔案編 號,若執行關閉的指令,並不會構成錯誤。 h. 檔案開啟後,標籤項 lbl. Lof 標示檔案的大 小,設定水平捲軸相關屬性,呼叫副程式 Show. Data 讀取開頭十六個位元組,顯示其 內容於文字盒。
四、程式設計 Wbe. nctu Copyright 2001 4. 顯示資料 – 程式 Ex 5. FRM 加入下列副程式 Show. Data, 自檔案中讀取十六個位元組的資料以文字 碼與十六進位碼顯示在文字盒 txt. Text 與 txt. Hex。 Sub Show. Data ( ) ' 顯示資料 a$ = Space$(Data. Len%) ' 設定字串 Get #1, lbl. Address, a$ ' 讀取資料 txt. Text = a$ ' 文字碼 ' 十六進位碼 txt. Hex = "" For i% = 1 To Data. Len% b$ = Hex$(Asc(Mid$(a$, i%, 1))) 六進位碼 b$ = Right$("00" + b$, 2) 進位碼 txt. Hex = txt. Hex + b$ Next i% End Sub ' 一個字符的十 ' 兩位數之十六
Wbe. nctu Copyright 2001 4. 顯示資料 --解說: a. 二進位存取檔案資料的讀取是使用 Get敘 述,Get 敘述需指定檔案編號、檔案位置及 置入之字串變數,讀取的長度取決於字串 變數的長度。本例中,檔案編號是 #1,檔案 位置取自標籤項 lbl. Address的數值,置入 之字串變數是 a$。 將 a$設定為十六個空 先 格 , 敘述由指定位置起讀取十六個位 Get 元組資料置入字串變數 a$, 再填入文字盒 txt. Text 是 為文字碼。
Wbe. nctu Copyright 2001 4. 顯示資料 --解說:續 1) ( b. 十六進位碼是以 “ 0”到 “ 9” 等十個數字符號, 再連上 “A”到 “F” 等六個字母來表示數值, 如十六進位碼 0 C 代表十進位碼 12, 代 2 E 表十進位碼 46。一個位元組的十進位碼範 圍是 0~ 255,亦即十六進位碼 00~ FF。 為了顯 示十六個位元組的十六進位碼,程式中由 字串變數 a$ 一個一個位元組地取得其十 進位 ASCII碼,運用 Hex$ 函數轉換為十六 進位碼顯示於文字盒 txt. Hex。
Wbe. nctu Copyright 2001 四、程式設計 (續 2) 5. 水平捲軸的變化 – 將程式 Ex 5. FRM 的事件程序 hsb. Locate_Change 安排如下,當程式執行時,在水平捲軸 (hsb. Locate)的顯示位置運用捲軸的操作技巧即 可變換顯示內容對應檔案中之位置。 Sub hsb. Locate_Change ( ) lbl. Address = hsb. Locate ' 標示讀取開 始位置 Show. Data ' 顯示資料 End Sub
5. 水平捲軸的變化 --解說: Wbe. nctu Copyright 2001 a. 使用滑鼠在捲軸上操作,依據按下位置的 不同,可變換捲軸的數值作大跨步或小跨 步的增加或減少。在本例中,設定大跨步 為 16 個位元組小跨步為 1個位元組,若使 用滑鼠在水平捲軸 hsb. Locate 上操作,將改 變 hsb. Locate 的數值而啟動此一事件程序。 b. 此一事件程序將 hsb. Locate 的數值置於標 籤項 lbl. Address 標示讀取開始位置,再呼叫 副程式 Show. Data 由 新指定位置讀取並顯示 資料。
Wbe. nctu Copyright 2001 四、程式設計 6. 結束程式執行 將程式 Ex 5. FRM 的事件程序 cmd. Quit_Click 安排如下,當程式執行時,按下「結束」命 令鈕,即結束程式執行。 Sub cmd. Quit_Click ( ) Close #1 ' 關閉檔案編號 1號的使用 End ' 結束程式執行 End Sub
Wbe. nctu Copyright 2001 五、程式執行時,顯現畫面如下:
Wbe. nctu Copyright 2001 五、程式執行 (續 1) 此時即可進行檔案名稱的指定 作: – 操作磁碟機列示盒 Drives: 可變換磁碟機。
Wbe. nctu Copyright 2001 五、程式執行 (續 2) – 操作目錄列示盒 Directories: 可變換磁碟 機目錄。
Wbe. nctu Copyright 2001 五、程式執行 (續 3) – 操作檔案列示型態組合箱 List Files of Type: 可變換檔案列示型態。
Wbe. nctu Copyright 2001 五、程式執行 (續 4) – 操作檔案列示盒可選擇欲開啟之檔案名 稱。
Wbe. nctu Copyright 2001 五、程式執行 (續 5) – 檔案名稱選定後,按下「確定 (OK)」 命令 鈕或 “Enter”鍵,即出現下列畫面,顯示檔 案第一個位元組開始共 16 個位元組的 資料內容。
Wbe. nctu Copyright 2001 五、程式執行 (續 6) – 這個畫面可以一次顯示 16 個位元組資料 的文字碼與十六進位碼,並可對照地辨 認兩碼之間的轉換。畫面中並標示檔案 的全名、目前讀取資料的位置、檔案的大 小。
Wbe. nctu Copyright 2001 五、程式執行 (續 7) 此時可執行下列動作: 操作水平捲軸可變換顯示內容對應檔案中 之位置。 ※這個畫面可以辨識由程式實例 2 產生的檔案 SCORE. DAT中,各行的換行符號乃是十六進位 碼的兩個位元組 "0 D", "0 A"。
Wbe. nctu Copyright 2001 五、程式執行 (續 8) 按下「開啟檔案」命令鈕,可重新指定 開啟檔案名稱。 按下「結束」命令鈕,即結束程式執行。
Wbe. nctu Copyright 2001 §習題 V 1. 運用程式實例 5 觀看程式實例 2 所建之資料 檔 SCORE. DAT, 與程式實例 4 所建之資料檔 SCORE. RND 相互比較解說其差異。 2. 程式實例 5 一開始執行時利用共用對話盒讓 使用者指定開啟檔案名稱,若此時使用者按 下「取消(Cancel)」 命令鈕或 "Esc"鍵,則顯示內 容即無意義,若要設定程式於此時(程式開始 執行時,被迫取消)立即結束執行,程式該如 何修改? 3. 在程式實例 5 的事件程序 cmd. Open_Click 之中 有五個「設定水平捲軸相關屬性」敘述,其中 那些敘述應移到事件程序 Form_Load 可以減 少無謂的執行步驟?