請問存到File空間裡的問題 |
|
josh0621
一般會員 發表:3 回覆:0 積分:0 註冊:2006-10-11 發送簡訊給我 |
Type Customer=record CustNo : String[10 ]; Name : String[20]; Phone:String[16]; Fax:String[16]; Address:String[60]; end; var CustFile : File of Customer; CustData : Customer; FName : String; RecSize,CurRec : longint; Procedure TNew1.SaveRecord;//儲存紀錄 Begin CustData.CustNo:=Edit1.Text; CustData.Name:=Edit2.Text; CustData.Phone:=Edit3.Text; CustData.Fax:=Edit4.Text; CustData.Address:=Edit5.Text; write(CustFile,CustData); End; Procedure TNew1.ShowRecord;//show出資料 Begin //顯示目前檔案指標指向的那筆資料 New1.Edit1.Text:=CustData.CustNo; New1.Edit2.Text:=CustData.Name; New1.Edit3.Text:=CustData.Phone; New1.Edit4.Text:=CustData.Fax; New1.Edit5.Text:=CustData.Address; End; 這樣我呼叫saveRecord會把資料寫入儲存到CustFile裡 那我想要輸入CustNo之後來查詢資料庫裡的資料 然後顯示出來 語法該如何用 我原本寫 If Edit1.Text = CustData.CustNo then begin showrecord; end; 後來發現 他只會找到目前留在CustData裡的CustNo 並不會進去CustFile裡面找 我該如何寫呢
------
張韋軒 |
max5020
資深會員 發表:30 回覆:277 積分:321 註冊:2003-06-04 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
作業吧?小弟覺得你曾經嘗試研究過,僅提供一點建議。
1.User defines record 型態的檔案搜尋機制是無法與資料庫型態的檔案結構比擬的,當然~你可以研究找出簡單的方法,製作自己的索引檔,或者再加上使檔案內的資料是按照由小到大的方式排序進行儲存,這樣以二分法搜尋的速度尚可接受,否則資料量愈大愈讓人難以忍受! 2.假設你已滿足上述的要求,提供以下的方式參考範例: ..... .... Function BinarySearchRecord(aKey:String):Boolean; var LowerRecord,UpperRecord,MiddleRecord,TotalRecord:integer CustFile : File of Customer; CustData : Customer; Found:Boolean; begin Found := false; try AssignFile(CustFile,'xxx.dat'); Reset(CustFile); TotalRecord := FileSize(CustFile) div sizeof(Custmer); LowerRecord := 0; UpperRecord := TotalRecord; MiddleRecord := ( LowerRecord UpperRecord ) div 2; while ( not Found ) and ( LowerRecord <= UpperRecord) do begin seek(CustFile,sizeof(CustData) * MiddleRecord); BlockRead(CustFile,CustData,sizeof(CustData) ; if ( Edit1.Text = CustData.CustNo ) then begin Found := true; .... break; end else if ( CustData.CustNo < Edit1.Text ) then begin LowerRecord := MiddleRecord 1; ... end else if ( CustData.CustNo > Edit1.Text ) then begin UpperRecord := MiddleRecord - 1; ... end; MiddleRecord := ( LowerRecord UpperRecord ) div 2; end; finally CloseFile(CustFile); end; Result := Found; end; 3.如果很不幸的!你的資料沒有排序過,那麼!你只能一筆接一筆讀進來然後比較,資料愈多速度愈慢!可能到無法忍受的地步。 |
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
無法LoadFromFile,但是你可以自己處理讀檔,將CustNo讀到String,將Record騙成一個TObject
要用的時候再typecast回來就好.. 要搜尋字串的話,最好用THashedStringList.. 不過我認為以你可以操作讀進來的狀況下,其實可以跟上面的前輩說的一樣,自己作B Sort其實效率可能會比較高
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |