四、數組中常見的錯誤及註意事項
1.靜態數組聲明下標變量。
N = InputBox("輸入數組的上限")
Dim a(1到n)為整數
2.數組下標越界
聲明數組時,引用的下標大於或小於下標範圍。
Dim a(1到30)為長,I為整數
a(1)= 1:a(2)= 1
對於i = 3到30
a(i) = a(i - 2) + a(i - 1)
接下來我
3.數組維數錯誤
數組聲明的維度與引用數組元素的維度不壹致。
Dim a(3,5)壹樣長
a(I)=10
4.Arry函數的使用
只能給變量或變量的動態數組賦值。
5.獲取數組的上下界。
UBound和Lbound函數
1.Dim數組聲明
有時用戶聲明數組的上界由程序通用性的變量表示,如下面的程序段所示:
N=InputBox("輸入數組的上限")
Dim a(1到n)為整數
程序運行時,Dim語句會顯示錯誤信息“需要常量表達式”。也就是說,Dim語句中聲明的數組的上下限必須是常量,而不是變量。
解決程序常見的問題,壹是聲明數組非常大,浪費了壹些存儲空間;第二種是使用動態數組將上面的例子修改如下:
將()作為整數變暗
N=InputBox("輸入數組的上限")
將a(1到n)作為整數重新定義
2.數組下標越界
引用了不存在的數組元素,即聲明數組時下標大於或小於下標範圍。例如,用以下30項組成斐波納契數列:
1,1,2,3,5,8,13,21,34,…,317811,514229,832040
正確的程序段如下:
Dim a(1到30)壹樣長,i%
如果For i=3到30改為For i=1到30,程序運行時會顯示“下標越界”的錯誤信息,因為循環開始時i=l,執行循環體語句a(i)=a(i-2)+a(i-1),數組下標i-2和I。
同樣,如果把上面的例子:a(i)=a(i-2)+a(i-1)改成:a(i+2)=a(i)+a(i+1)。
當程序運行時,當數組下標大於上限30時,也會顯示錯誤消息“下標越界”。
3.數組維數錯誤
數組聲明的維度與引用數組元素的維度不壹致。例如,下壹個程序段將形成並顯示壹個3×5的矩陣:
dim a(3.5)壹樣長
對於i=1到3
對於j=1到5
a(i)=i*j
打印a(壹);"";
下壹個j
打印
接下來我
當程序運行到語句a(i)=i*j時,出現“dimension error”的消息,因為Dim聲明時是二維數組,引用時是下標。
4.4的使用。數組函數
Array函數可以很容易的給整個數組賦值,但是此時只能聲明Variant或者只括在括號裏的動態數組的變量。賦值後的數組大小由賦值次數決定。
例如,將1,2,3,4,5,6,7的值賦給數組A,表2.5.1列出了三種錯誤以及相應的正確賦值方法。
表2.5.1數組函數表示方法
錯誤的數組函數賦值
修正了阿裏函數分配
Dim a(1到8)
a =數組(1,2,3,4,5,6,7,8)
Dim a( ) a=Array(1,2,3,4,5,6,7)
Dim a為整數a=Array(1,2,3,4,5,6,7)
Dim a a =數組(1,2,3,4,5,6,7)
暗淡的
a()=Array(1,2,3,4,5,6,7)
Dim a a =數組(1,2,3,4,5,6,7)
5.如何得到壹個數組的上下界?
Array函數可以很容易地給整個數組賦值,但是如何在程序中獲取數組的-上界和-下界以保證訪問的數組元素在合法的範圍內,可以通過使用UBound和LBound函數來確定。
在上面的例子中,如果妳想打印數組A的值,妳可以通過下面的程序段來完成:
對於i=Lbound(A)至Ubound(A)
打印a(i)
接下來我
6.給數組賦值
VB6.0提供了給整個數組賦值的新功能,方便了數組到數組的賦值操作。但是真正使用起來並沒有那麽方便,限制也很多。數組賦值形式如下:
數組名2=數組名1
我們來討論壹下這種形式:這裏的數組名2,實際上只能在聲明前壹個數組時聲明為Variant變量,被賦值的數組2的大小、維數、類型與數組名1相同;否則,如果它被聲明為動態或靜態數組,例如:
Dim數組名2()或Dim數組名2(下標)
當程序運行到上面的賦值語句時,顯示錯誤信息“無法給數組賦值”。
所以為了程序的安全可靠,建議讀者忍痛割愛,少用VB6.0的這個新功能,使用傳統的循環結構給數組賦值。為此,我們不會在教程中展開它。
動詞 (verb的縮寫)過程中的常見錯誤及註意事項
1.編程算法問題
這壹章的編程比較難,主要是算法難構思,這也是編程中最難學的階段。經驗告訴每壹個編程初學者,沒有捷徑,只要多看,多練,知難而進。電腦開機前,壹定要寫好程序,認真分析檢查,提高在電腦上調試的效率。每當壹個程序經過努力調試通過,來之不易的喜悅讓妳壹言難盡。
2.確定定制流程是子流程還是功能流程。
實際上,進程是壹個獨立的程序單元,具有壹定的功能,可以多次調用。子流程和函數流程的區別在於,前壹個子流程名沒有值,後壹個函數流程名有值。如果過程有返回值,習慣上使用函數過程;如果過程沒有返回值,則使用子過程;如果過程返回多個值,壹般用來通過真實參與參數的組合帶回結果,當然也可以通過函數過程名帶回壹個,其余的結果可以通過真實參與參數的組合帶回。
3.過程中形式參數個數和傳遞方式的確定。
對於初學者來說,在定義過程的時候無法確定形參的個數和傳遞方式。
流程中參數的作用是實現流程和調用者之間的數據通信。壹方面,調用方為子進程或函數進程提供初始值,通過將實參傳遞給形參來實現;另壹方面,子進程或函數進程將結果傳遞給調用者,這是通過地址傳遞實現的。所以形參的個數是由以上兩個方面決定的。對於初學者來說,他們往往喜歡把流程體中使用的所有變量都作為形式參數,這增加了調用者的負擔和出錯概率。有些初學者省略了所有的形參,所以無法實現數據傳輸,既不能從調用者那裏得到初始值,也不能將計算結果傳遞給調用者。
在VB中,參與實參數組合的方式有兩種:值傳遞和地址傳遞。區別如下:
(1)在定義的形式上,前者前面是ByVal關鍵字。
(2)效果上,值傳遞只能從外部傳遞初始值給進程,不能傳遞結果,地址傳遞可以傳入傳出。
(3)如果參數是數組、自定義類型、對象變量等。,形參只能通過地址傳遞。
4.真正參與形式參數類型的對應問題
當傳遞地址時,調用過程中涉及的形參類型應該是壹致的。例如:
功能過程定義如下:
公共函數f!(x!)
f=x+x
結束功能
主要調諧過程如下:
Privme Sub Commandl _ Click()
模糊y%
y=3
打印f(y)
末端接頭
在前面的例子中,形參X是單精度類型,實參Y是整數類型。程序運行時,會顯示“ByRef參數類型不匹配”的編譯錯誤信息。
當傳遞值時,如果值是數字,則實參將根據其類型將值傳遞給形參。例如:
功能過程定義如下:
公共函數f!(ByVal x%)
f=x+x
結束功能
主要調諧過程如下:
Priva ~ SubCommandI _ Click()
Dim y!
Y=3.4
打印f(y)
末端接頭
程序運行後顯示的結果是6。
5.變量的範圍
局部變量,調用過程時,分配變量的存儲空間;過程調用結束時,回收分配的存儲空間,即調用壹次,初始化壹次,變量不保留;加載表單時,分配變量的存儲空間,然後回收變量分配的存儲空間。
例如,如果您想通過文本框輸入幾個值,請為每個輸入按Eeter鍵,直到輸入值為9999。輸入結束後,求輸入數字的平均值。
Private Sub Textl_Key Press(鍵Ascii為整數)
點心!,n%
如果KeyAscii=13,則
如果Val(Text1)=9999,則
總和=總和/n
打印總和
其他
Sum=sum+Text1
n=n+1
Text1= " "
如果…就會結束
如果…就會結束
末端接頭
在這個過程中沒有語法錯誤。運行程序時可以輸入幾個數字,但當輸入9999時,程序顯示“溢出”錯誤。原因sum和n是局部變量,每按壹次鍵,局部變量就初始化為0,所以會出現上面的錯誤。
改進方法:將待對沖的局部變量聲明為Static靜態變量或表單級變量。要對沖的變量也可以在通用聲明部分聲明為表單級變量。
6.遞歸調用“堆棧溢出”
階乘的遞歸函數過程如下:
Public Functionfac(n為整數)為整數
如果n=1,則
fac=1
其他
fac=n*fac(n-1)
如果…就會結束
結束功能
Private Sub Commandl _ Click()'調用遞歸函數,顯示fac(5)=120。
打印“fac(5)”;外交事務委員會(五)
末端接頭
調用主程序時,當n的值為5時,會顯示120的結果;當n的值為-5時,會顯示“堆棧空間溢出”的錯誤消息。
實際上,每次進行遞歸調用時,系統都會堆棧當前狀態信息(形參、局部變量、調用結束時的返回地址),直到達到遞歸結束條件。在前面的例子中,當n=5時,每次遞歸調用參數n-l,直到n=l的遞歸調用結束,然後不斷從堆棧中彈出當前參數,直到堆棧為空。但當n=-5時,參數n-1為-6,stack被壓下,然後遞歸調用n-1,直到棧滿,永遠達不到n=l的終止條件,導致棧溢出的錯誤信息。
所以在設計遞歸進程時,壹定要考慮終止的條件,終止的值或者進程中的某個操作,並且每次調用遞歸時,其中的參數都要收斂到終止方向,否則會發生堆棧溢出。
不及物動詞常見錯誤及常見控制難點分析
1.缺少對象名稱
在VB編程中,初學者常犯的壹個錯誤是省略對象名,尤其是在使用列表框時。例如,如果要引用列表框(List1)中當前選中的項目,則listl . list(list index)是錯誤的。即使當前焦點在Listl上,VB也不認為Listlndex是List l的屬性,而是變量。所以正確的引用方式是:listl . 1 ist(listl . listlndex)。
2.列表框的Columns屬性
列表框的Columns屬性確定列表框是水平滾動還是垂直滾動,以及如何顯示列中的項目。如果水平滾動,Columns屬性確定顯示多少列,如表2.7.2所示。圖2.7.1是壹個兩列水平滾動的列表框。
在程序運行期間,該屬性是只讀的,即不能在運行時將多列列表框更改為單列列表框,也不能將單列列表框更改為多列列表框。
表2.7.2列表框的列屬性
列數的虧格
0(默認值)1到n項壹列排列,列表框垂直滾動項多列排列。先填第壹欄,再填第二欄...列表框水平滾動並顯示指定的列數。
3.域級驗證
域級驗證是指對輸入到獨立域的數據進行驗證,在域級驗證的過程中壹般不考慮表單中其他字段的內容。域級驗證的適當時間是:
(1)在域中輸入鍵時,會涉及鍵盤事件(KeyDown、KeyUp和KeyPress)。
(2)當用戶試圖離開壹個域時,涉及CansesValidate屬性和Validate事件。
(3)當壹個域的內容發生變化時,涉及到變化事件。
CausesValidation屬性和Validate事件通常壹起工作。
CausesValidate屬性確定Validate事件是否發生。如果控件的CausesValidate屬性為False,則控件的Validate事件永遠不會發生。如果控件的cause validate屬性為Tree,當焦點試圖移動到另壹個cause Validate屬性為True的控件時(可以說離開之前),會發生原控件的Validate事件:當焦點試圖移動到另壹個cause Validate屬性為False的控件時,原控件的Validate事件暫時不會發生,什麽時候會發生?直到焦點移到CausesValidate屬性為True的控件時,才會發生這種情況。
例如,假設有壹個如圖2.7.2所示的程序。當焦點試圖從text 1移動到Text2時,發生text 1的Validate事件;當焦點試圖從Text2移動到text 1時,發生Text2的Validate事件。當焦點試圖從text 1移動到Text3時,text 1的Validate事件暫時不會發生,因為Text3的CausesValidate為False,然後text 1的Validate事件不會發生,直到焦點試圖移動到Text2。
圖2.7.2導致驗證屬性和驗證事件
CausesValidate屬性和Validate事件的這壹特性經常應用於程序中,如圖2.7.3所示。當文本框中輸入了無效數據,而妳又不知道如何輸入有效數據時,用戶往往會選擇Help命令來尋求幫助,或者選擇Cancel命令來結束數據輸入,所以他們不想執行驗證程序。因為如果執行驗證程序,發現無效數據,不能選擇幫助或取消,用戶就被困住了。現在,只要將文本框的cause validate屬性設置為True,將命令按鈕的cause Validate屬性設置為False,並將驗證器放入驗證過程中,問題就解決了。默認情況下,所有控件的CausesValidation屬性都是Tree。
圖2.7.3導致命令按鈕的驗證屬性和驗證事件
並非所有控件都有驗證事件。只有那些可以用來輸入數據的控件(如文本框、復選框、滾動條等。)有這個事件。驗證事件過程如下:
Privme Sub object_Validate(取消為布爾值)
…
末端接頭
其中,當參數Cancel設置為Tree時,焦點不會離開對象。
如果要將實驗7中的1問題改為Validate事件和CausesValidation屬性實現數據驗證,應該有以下步驟。
Sub txtMath_Validate(取消為布爾值)
If Val(txtMath。正文)& lt0或_
Val(txtMath。Text)>那就100
取消=真
如果…就會結束
末端接頭
1.窗體頂部菜單欄中的菜單項與子菜單中的菜單項之間的區別
表單頂部的菜單欄和子菜單中的菜單項都是在菜單編輯器中定義的,但它們是不同的。
(1)表單頂部菜單欄中的菜單項不能定義快捷鍵,但子菜單中的菜單項可以有快捷鍵。
(2)當字母後有熱鍵字母(菜單標題中的“&”)時,按Alt+熱鍵字母選擇表單頂部菜單欄中的菜單項,按熱鍵字母選擇子菜單中的菜單項(子菜單打開時)。子菜單未打開時,按熱鍵字母無法選擇菜單項。
(3)雖然所有的菜單項都可以響應Click事件,但是窗體頂部菜單欄中的菜單項不需要編寫事件過程。
2.在程序中,常規對話框的屬性設置不起作用。
在程序中,常規對話框的屬性設置不起作用。大多數情況下,屬性設置是在對話框彈出後完成的。比如下面的程序代碼就有這樣的問題,糾正方法是把彈出對話框語句放在最後,也就是放CommonDialogl。所有屬性設置語句後的Action=l。
CommonDialog1。動作=1
ConmaonDialog1。文件名="*。Bmp "
CommonDialogl。InitDir="C:\Windows "
CommonDialog1。Filter= "圖片(*。Bmp)|*。Bmp |所有文件(*。*)|*.*"
CommonDialog1。FilterIndex=1
3.將現有表單添加到項目時出現加載錯誤。
使用“項目”菜單中的“添加表單”命令添加已有表單時,經常會出現加載錯誤,大多數錯誤是由於表單名稱沖突造成的。例如,假設壹個名為Forml的項目當前是打開的,如果妳想加載壹個屬於另壹個項目的Forml表單,妳肯定會得到壹個錯誤。
[註意]
表單名稱和表單文件名的區別。在壹個項目中,可以有兩個表單文件名相同的表單(分布在不同的文件夾中),但不能同時有兩個表單文件名相同的表單。
4.實時菜單的創建
實時菜單由應用程序根據需要動態創建。在VB中,常見的實時菜單是“文件”菜單,顯示最近使用的項目。
要創建實時菜單,必須結合控件數組,用Load語句創建菜單項,用UnLoad清除菜單項。
要創建實時菜單:
(1)在菜單編輯器中創建示例菜單項。
示例菜單項的屬性設置見表2.8.4。將Index設置為0表示示例菜單項是控件數組的壹個元素,其下標為0。示例菜單項的Name屬性是必需的,它將用作控件數組的名稱。讓我們假設數組名為NameArray。Visible可以設置為True,False表示菜單項最初是不可見的。
表2.8.4實時菜單示例菜單項
屬性名稱標題索引可見
需要設置的值可以沒有0 False。
(2)在程序中用Load語句創建壹個菜單項。
例如,loadnameray (1)創建壹個新的菜單項(控件數組中的下標是1),然後將其Visible屬性設置為True,還設置了Caption屬性。
動態創建的菜單項繼承了除Index之外的大多數屬性,因此應該設置Caption和Visible屬性。此外,示例菜單項在菜單系統中的位置決定了新菜單項出現的位置。
(3)為實時菜單項編寫代碼
每個實時菜單項都是控件數組的成員,具有相同的名稱,並享受事件過程。
以下是實時菜單項代碼示例:
SubNameArray_Click(索引為整數)
選擇案例索引
案例0
MsgBox("NameArmy(0)(示例菜單項)被點擊!")
案例1
Msgbox ("Nameray (1)(實際購買的第壹個菜單項)被點擊!")
案例2
Msgbox ("Nameray (2)(第二個實時菜單項)被點擊!")
結束選擇
末端接頭
(4)刪除實時菜單項
雖然Visible設置為False,但程序運行時不會顯示實時菜單項,有時需要從內存中銷毀實時菜單項。使用UnLoad語句刪除實時菜單。例如,loadnamerray (1)。
有關建立實時菜單的詳細信息,請參考本教程的第4.3節。
5.“常規”對話框的CancelError屬性和Err對象
當常規對話框的CancelError屬性為True時,每當選擇“取消”按鈕時,都會生成壹個錯誤32755(cdlCancel),即Err的Number屬性將被設置為32755。
Err是VB的壹個系統對象,記錄程序運行過程中出現的錯誤。
Err對象的重要屬性是Number(默認屬性)和Description。當錯誤發生時,錯誤生成器將錯誤號和錯誤描述分別存儲在Number和Description屬性中。例如,當在CancelError屬性為True的常規對話框中選擇“取消”按鈕時,將生成壹個錯誤,err對象的Number和Description屬性將設置為32755和“選擇'取消'”。
在程序運行過程中,經常會出現各種錯誤。有關錯誤處理的詳細信息,請參考本教程的第9.6節。
下面是當程序產生cdlCancel錯誤時,結束程序的運行。
子窗體_ClickO
CommonDialogl。CancelError=True
出錯時轉到錯誤處理程序
CommonDialogl。動作=l
用於處理文件的語句
錯誤處理程序:
如果錯誤。Number=cdlCancel然後
結束
Endlf
末端接頭
6.與表單相關的事件
當壹個窗體(假設該窗體尚未在內存中創建)第壹次用load語句加載到內存中時,Initialize和Load事件依次發生。當使用UnLoad從內存中卸載窗體時,QueryUnLoad和UnLoad事件依次發生,當使用Set form name =Nothing語句取消初始化時,會發生Terminate事件。
Initialize是創建窗體時發生的事件。Initialize事件在窗體的生命周期中只觸發壹次。用戶可以多次將表單加載到內存中或從內存中刪除,但表單只創建壹次。也就是說,當表單用load語句加載到內存時,會觸發Load事件,但不壹定觸發Initialize事件。
用unLoad語句卸載窗體後,如果窗體name =Nothing不用於取消初始化,下次使用Load語句時不會觸發Initialize事件,否則會引發Initialize事件。
假設有兩個窗體,form 1和Form2,並且有以下事件過程:
Forml窗體事件過程
子窗體_Click()
調試。當表單首次加載到內存中時發生的“Print”事件
裝載表單2
調試。使用unload卸載表單時發生“Print”事件
卸載表單2
調試。第二次將窗體加載到內存中時發生的“Print”事件
裝載表單2
調試。使用unload卸載表單時發生“Print”事件
卸載表單2
調試。用Set form name =Nothing語句初始化時發生的Print "事件
設置Form2 =無
調試。Print "當窗體第三次加載到內存中時發生的事件(在取消初始化後):"
裝載表單2
末端接頭
Form2窗體事件過程
Sub Form_Initialize()
調試。打印“初始化事件”
末端接頭
子窗體_Lond()
調試。Pnnt“加載事件”
末端接頭
Sub Form_QueryUnload(Cancel為hteger,UnloadMode為Integer)
調試。打印“QueryUnload”
末端接頭
Sub Form_Unlond(取消為整數)
調試。打印“卸載”
末端接頭
子窗體_Terminate()
調試。打印“終止”
末端接頭
當用戶單擊Form1時,調試窗口中會顯示以下信息:
當窗體首次傳輸到內存時發生的事件:
初始化事件
加載事件
使用unload卸載窗體時發生的事件:
查詢卸載
傾銷
當窗體第二次加載到內存中時發生的事件:
加載事件
使用unload卸載窗體時發生的事件:
QueryUnload
傾銷
使用Set form name =Nothing語句初始化時發生的事件:
結束的
第三次將窗體加載到內存中時發生的事件(在取消初始化之後):
初始化事件
加載事件
7.7的序列。MouseDown、MOUSeUp和C1ick事件。
當用戶在窗體或控件上按下鼠標按鈕時,將觸發MouseDown事件。MouseDown事件必須在MouseUp和C1ick事件之前發生。但是,MouseUp和Click事件發生的順序與單擊的對象有關。
當用戶單擊標簽、文本框或表單時,順序是:
(1)鼠標按下
(2)鼠標向上
(3)點擊
當用戶單擊命令按鈕時,順序是:
(1)鼠標按下
(2)點擊
(3)鼠標向上
當用戶雙擊標簽或文本框時,順序是:
(1)鼠標按下
(2)鼠標向上
(3)點擊
(4)DblCUck
(5)鼠標懸停
七、文件常見錯誤及難點分析
1.文件系統的三個控件不能關聯。
即當驅動器改變時,目錄列表框不能相應改變;或者當目錄列表框改變時,文件列表框不能相應改變。若要關聯三個控件,請使用以下兩個事件過程:
私有子驅動器_Change()
迪爾。Path=Drivel。驅動器
末端接頭
私有子目錄_更改()
Filel。Path=Dirl。小路
末端接頭
2.如何在目錄列表框中表示當前選中的目錄?
程序運行時雙擊目錄列表框中的壹個目錄項,該目錄項將變為當前目錄,Diirl的值為。路徑將相應地改變。當您單擊選擇目錄項時,Diirl的值。路徑沒有改變。有時為了對選中的目錄項進行相關操作,對應的是在ListBox控件中選擇壹個列表項,表示如下:
迪爾。列表(目錄。列表索引)
3.當使用文件系統控件打開文件時,會顯示壹條錯誤消息“找不到文件”。
例如,下面的語句:
打開文件。路徑+文件。輸入文件名為#1
當所選目錄為根目錄時,上述語句正確執行,當所選目錄為子目錄時,執行上述語句時顯示錯誤信息“文件未找到”。
其中:Filel。代表當前選擇的路徑。文件名代表當前選擇的文件,它們壹起代表文件標識符。
當選擇的文件在根目錄中時(假設驅動器是C),Filel的值。路徑是“C:\1”,假設選擇的文件名是“t1.txt”,Filel的值。路徑+文件。文件名為“C:\t1.txt”。
當選擇的文件在子目錄中時(假設驅動器是C,子目錄是my),Filel的值。Path為“c: \ my”,filel.path+filel.filename的值為“C:\my tl.txt”,子目錄和文件名之間缺少“\”分隔符。
為了保證程序的正常運行,
open file . path+file . filenameforlnput as # 1更改為:
Dun F$美元
如果正確(Filel。Path,1)" " Then "表示選定的根目錄。
F=Filel。路徑+文件。文件名
' Else '表示選中的子目錄,而“\”則添加在子目錄和文件名之間。
F=Filel。路徑+" \ "+文件。文件名
如果…就會結束
打開F輸入為# 1
4.名字定為4。open語句中打開的可以是常量,也可以是字符串變量,但用戶概念不清,導致出現錯誤信息“文件未找到”
如果從磁盤讀取時文件名為“C:\my\t1.txt”,
正確的常數如下所示:
打開“c: \ my \ t1.txt”作為# 1”輸入不正確的寫入常量缺少雙引號。
或者正確的變量如下所示:
Dim F$
F="C:\my\t1.txt "
Open F For Input As #1 '寫錯變量F兩邊都有雙引號。
5.文件尚未關閉和打開,並顯示錯誤消息“文件已被打開”。
以下聲明:
打開“C:\my\t1.txt”輸入為#1
打印F
打開“C:\my\t1.txt”輸入為#1
打印“2”;F
當執行第二個Open語句時,顯示錯誤消息“文件已被打開”。
6.如何讀取隨機文件中的所有記錄,但不知道記錄號?
如果不知道記錄號,想讀取所有的記錄,只要類似於順序文件的讀取,可以使用循環結構和不帶記錄號的Get語句。節目片段如下:
Do While Not EOF(1)
獲取#1,,j
打印j;
環
讀寫隨機文件時,不需要寫記錄號,也就是說讀的時候自動讀取下壹條記錄,寫的時候在當前記錄之後插入。