VB新手入門之四

刪除實時菜卑顧使用UnLoad語句。例如,LoadNameArray(1)。

有關建立實時菜單的詳細內容請參閱教程第4.3節。

5.通用對話框的CancelError屬性和Err對象

當通用對話框的CancelError屬性爲Tme時,無論何時選擇"取消"按鈕,均產生 32755(cdlCancel)號錯誤,即將Err的Number屬性設置爲32755。

Err是VB的一個系統對象,它記錄了程序運行期間所發生的錯誤。

Err對象的重要屬性有Number(默認屬性)和Description。當錯誤發生後,錯誤的生成者把錯誤號和有關錯誤的說明分別存放在Number和Description屬性中。例如,當在 CancelError屬性爲True的通用對話框中選擇"取消"按鈕時,產生一個錯誤,Err對象的Number和Description屬性將被設置爲32755和"選擇'取消'"。

在程序運行期間,經常會發生各種各樣的錯誤。有關錯誤處理的詳細內容請參閱教程第 9.6節。

下面是當程序產生cdlCancel錯誤時結束程序的運行。

SubForm_ClickO

CommonDialogl.CancelError=True

On Error GoTo ErrorHandler

CommonDialogl.Action=l

' 處理文件的語句

ErrorHandler:

If Err.Number=cdlCancel Then

End

Endlf

End Sub

6.與窗體有關的事件

在首次用Load語句將窗體(假定該窗體在內存中還沒有創建)調入內存之時依次發生 Initialize和Load事件。在用UnLoad將窗體從內存中卸載時依次發生QueryUnLoad和Unload事件,再使用Set窗體名=Nothing語句解除初始化時發生Terminate事件。

Initialize是在窗體創建時發生的事件。在窗體的整個生命週期中,Initialize事件只觸發一次。用戶可以將一個窗體裝入內存或從內存中刪除很多次,但窗體的建立只有一次。也就是說,在用Load語句將窗體裝入內存時會觸發Load事件,但並不一定觸發Initialize事件。

在用UnLoad語句卸載窗體後,如果沒有使用Set窗體名=Nothing解除初始化,則在下次使用Load語句時不會觸發Initialize事件,否則會引起Initialize事件。

假定有Forml和Form2兩個窗體,並且有下列事件過程:

' Forml窗體事件過程

Sub Form_Click()

Debug.Print"窗體首次裝入內存時發生的事件:"

Load Form2

Debug.Print"用Unload卸載窗體時發生的事件:"

UnloadForm2

Debug.Print "窗體第二次裝入內存時發生的事件:"

Load Form2

Debug.Print "用Unload卸載窗體時發生的事件:"

Unload Form2

Debug.Print "用Set窗體名=Nothing語句解除初始化時發生的事件:"

Set Form2=Nothing

Debug.Print "窗體第三次(解除初始化後)裝入內存時發生的事件:"

Load Form2

End Sub

'Form2窗體事件過程

Sub Form_Initialize()

Debug.Print"Initialize事件"

End Sub

Sub Form_Lond()

Debug.Pnnt"Load事件"

End Sub

Sub Form_QueryUnload(Cancel As hteger, UnloadMode As Integer)

Debug.Print"QueryUnload"

End Sub

Sub Form_Unlond(Cancel As Integer)

Debug.Print"Unload"

End Sub

Sub Form_Terminate()

Debug.Print"Terminate"

End Sub

當用戶在Form1上單擊時,在Debug窗口顯示下列信息:

窗體首次轉入內存時發生的事件:

Initialize事件

Load事件

用Unload卸載窗體時發生的事件:

Query Unload

Unload

窗體第二次裝入內存時發生的事件:

Load事件

用Unload卸載窗體時發生的事件:

QueryUnload

Unload

用Set窗體名=Nothing語句解除初始化時發生的事件:

Terminate

窗體第三次(解除初始化後)裝入內存時發生的事件:

Initialize事件

Load事件

7.MouseDown、MOUSeUp和C1ick事件發生的次序

當用戶在窗體或控件上按下鼠標按鈕時MouseDown事件被觸發,MouseDown事件肯定發生在MouseUp和C1ick事件之前。但是,MOUSeUp和C比k事件發生的次序與單擊的對象有關。

當用戶在標籤、文本框或窗體上作單擊時,其順序爲:

(1)MouseDown

(2)MouseUp

(3)Click

當用戶在命令按鈕上作單擊時,其順序爲:

(1)MouseDown

(2)Click

(3)MouseUp

當用戶在標籤或文本框上作雙擊時,其順序爲:

(1)MouseDown

(2)MOuseUp

(3)Click

(4)DblCUck

(5)MouseUp

第八章 文 件

8.1 知識要點

1.文件系統控件

VB提供的文件系統控件主要屬性和事件見表2.9.1所示。

表2.9.1 文件系統控件主要屬性和事件

控件 主要屬性 主要事件

DriveListBox(驅動器) Drive Change

DirListBox(目錄) Path Change

FileLiseBox(文件) Path FileName Pattern Click DblClick

要使三個控件有機地聯繫起來,必須用到兩個事件過程Drivel Change()和Dirl Change() (假定控件使用默認名稱):

要使顯示的是某種類型的文件,必須還要增加組合框控件,然後要通過對文件列表框控件的Pattern屬性進行設置實現。

2.處理文件與目錄(文件夾)語句和函數

VB提供的文件與目錄(文件夾)語句和函數見表2.9.2所示。在VB6.0中提供了功能更強的文件系統對象,參閱教程第七章。

表2.9.2 文件與目錄語句和函數

VB語句和函數形式 等效的DOS命令 作 用

FileCopy source, destination Copy 文件複製

Kill pathname DEL、ERASE 文件刪除,可出現統配符

Name oldpathname As newpathname REN 文件重命名

ChDrive drive 鍵盤符 改變當前驅動器

MkDir path MD 創建新目錄

ChDir path CD 改變當前目錄

RmDir path RD 刪除目錄

CurDir((drive)) 函數返回當前路徑

[注意]

用上述語句作用於文件操作時,此時文件必須是關閉的。

3.文件的概念

文件:是指存放在外部介質上的以文件名標識的數據的集合。文件由若干條記錄組成,一個記錄又可包括若干個數據項。當前操作的文件有一個指針,指向當前讀寫位置。

文件分類:根據存放的內容可分程序文件和數據文件;根據存儲數據的形式可分ASCII碼文件和二進制文件;根據存放的介質可分磁盤文件、打印文件等:根據組織、存取形式可分爲順序文件、隨機文件和二進制文件(因使用不多,本章不作介紹)。

文件的讀寫:計算機內存向外存文件中傳送數據,爲寫文件,使用規定的"寫語句";將外存文件中的數據向內存傳送,爲讀文件,使用規定的"讀語句"。

文件緩衝區:對文件進行讀寫操作時,VB在內存開闢一個"文件緩衝區",從文件中讀取的內容到內存數據區、從內存數據區向文件中寫入的內容都必須先送到緩衝區。使用"文件緩衝區"的好處可提高文件對文件讀寫的速度。一個打開的文件對應一個緩衝區,每個緩衝區有一個緩衝區號,即後面涉及到的文件號。

4.順序文件及操作

順序文件:是文件中記錄的寫入,存放與讀出三者的順序是一致的,即記錄的邏輯順序與物理順序相同。順序文件以ASCII碼方式存放數據,可用文本編輯軟件顯示和編輯。

順序文件結構簡單,記錄可不等長,讀出某一條記錄速度慢,不能直接對文件進行修改,適宜於對文件順序批量處理。

打開語句形式:Open文件名For讀寫方式As[#]文件號(Len=記錄長度]

文件名可以是用雙引號引括起的字符串常量,也可是字符變量(此時無"");讀寫方式有:OUTPUT、INPUT和APPEND;文件號1-511;記錄長度表示緩衝區的字符數。

[注意]

當對一個己存在的文件進行OUTPUT方式打開,則原有數據全部刪除。

寫語句:Print#文件號,[輸出列表] 或 Write#文件號,[輸出列表]

兩種語句區別:後者輸出在數據項之間自動插入",",並給字符串加上雙引號,以區分數據項和字符串類型;而前者無。對多個數據項,也可用記錄變量名錶示。

讀語句: INPUT#文件號,變量列表

LINEINPUT#文件號,字符串變量 (注意:回車換行符不讀入;

INPUT$(讀取的字符數,#文件號) 包括回車換行符時讀入)

關閉文件: Close[[#]文件號]

常用函數: LOF、EOF、LOC。

5.隨機文件及操作

隨機文件:文件中所有記錄等長、各數據項長度固定,每個記錄有唯一的記錄號,讀寫文件按記錄號對該記錄讀寫,文件以二進制代碼形式存放數據。隨機文件適宜對某條記錄進行讀寫操作。

記錄:一般用TYPE … ENDTYPE記錄類型定義,然後再聲明記錄變量。

打開語句形式:Open文件名For Random As #文件號[Len=記錄長度)

記錄長度:通過Len(hE錄類型)自動獲得。

寫語句:Put[#]文件號,[記錄號],變量列表或記錄變量名

讀語句:Get[#]文件號,[記錄號],變量列表或記錄變量名

省略記錄號,則表示在當前記錄後插入或讀出一條記錄。

9.3 常見錯誤和難點分析

1.文件系統的三個控件不能產生關聯

也就是當驅動器改變時,目錄列表框不能跟着相應改變;或者當目錄列表框改變時,文件列表框不能跟着相應改變。要三個控件產生關聯,使用下面兩個事件過程:

Private Sub Drivel_Change()

Dirl.Path=Drivel.Drive

End Sub

Private Sub Dirl_Change()

Filel.Path=Dirl.Path

End Sub

2.如何在目錄列表框表示當前選定的目錄

在程序運行時雙擊目錄列表框的某目錄項,則將該目錄項改變爲當前目錄,其Diirl. Path的值作相應的改變。而當單擊選定該目錄項時,Diirl. Path的值並沒有改變。有時爲了對選定的目錄項進行有關的操作,與ListBox控件中某列表項的選定相對應,表示如下:

Dirl.List(Dirl.Listlndex)

3.當使用文件系統控件對文件進行打開操作時,顯示"文件未找到"出錯信息

例如,如下語句:

Open Filel.Path+Filel.File Name For Input As#1

當選定的目錄是根目錄,上述語句執行正確;而當選定的目錄爲子目錄,上述語句執行時顯示"文件末找到"出錯信息。

其中:Filel.Path表示當前選定的路徑,Filel.File Name表示當前選定的文件,合起來表示文件的標識符。

當選定的文件在根目錄下(假定驅動器爲C),Filel.Path的值爲"C:/1",假定選定的文件名爲"t1.txt",則Filel.Path+Filel.FileName的值爲"C:/t1.txt",爲合法的文件標識符。

當選定的文件在子目錄下(假定驅動器爲C,子目錄爲my),Filel.Path的值爲"C:/my" Filel.Path+Filel.FileName的值爲"C:/my tl.txt",子目錄與文件名之間少了一個"/"分隔符。

爲了保證程序正常運行,OpenFilel.Path+Filel.FileNameForlnput As#1改爲:

Dun F$

If Right(Filel.Path,1)"/" Then ' 表示選定的足根目錄

F=Filel.Path+Filel.FileName

Else ' 表示選定的是子目錄,子目錄與文件名之間加"/"

F=Filel.Path+"/"+Filel.FileName

End If

Open F For Input As # 1

4.Open語句中欲打開的名是常量也可以是字符串變量,但使用者概念不清,導致出現"文件未找到"出錯信息

如在從盤上讀入文件名爲"C:/my/t1.txt",

正確的常量書寫如下:

Oven "C:/my/t1.txt"For Input As#1 ' 錯誤的書寫常量兩邊少雙引號

或正確的變量書寫如下:

Dim F$

F="C:/my/t1.txt"

Open F For Input As #1 ' 錯誤的書寫變量F兩邊多了雙引號

5.文件沒有關閉又被打開,顯示"文件已打開"的出錯信息

如下語句:

Open"C:/my/t1.txt" For Input As #1

Print F

Open "C:/my/t1.txt" For Input As #1

Print"2";F

執行到第二句Open語句時顯示"文件已打開"的出錯信息。

6.如何讀出隨機文件中的所有記錄,但又不知道記錄號

不知道記錄號而又要全部讀出記錄,則只要同順序文件的讀取相似,採用循環結構加無記錄號的Get語句即町,程序段如下:

Do While Not EOF(1)

Get #1, , j

Print j;

Loop

EndSub

隨機文件讀寫時可不寫記錄號,表示讀時自動讀下一條記錄,寫時插入到當前記錄後。 

發佈了42 篇原創文章 · 獲贊 12 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章