線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1382
推到 Plurk!
推到 Facebook!

請問存到File空間裡的問題

 
josh0621
一般會員


發表:3
回覆:0
積分:0
註冊:2006-10-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-12-09 22:13:03 IP:218.160.xxx.xxx 未訂閱
 
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-12-11 11:21:46 IP:59.120.xxx.xxx 未訂閱
何苦要走回頭路呢?
資料格式與程式綁在一起,
這樣不是很累嗎??
現在有那麼多資料庫格式可以用,
為什麼不擇一使用,
XML, dBase, Paradox, ...
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-12-11 20:34:25 IP:211.22.xxx.xxx 未訂閱
作業吧?小弟覺得你曾經嘗試研究過,僅提供一點建議。
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-12-16 11:47:57 IP:59.120.xxx.xxx 未訂閱
可不可以 TSTRINGLIST 的 LOADFROMFILE 然後在 STRINGLIST 中找到要顯示的那一筆再將其餘欄位 SHOW 出來

------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-12-16 12:13:59 IP:211.22.xxx.xxx 未訂閱
應該不行!
TStringList的LoadFromFile依據線上說明是 TStringListFills the list with the lines of text in a specified file.
現在你處理的是User define資料格式非一般文字檔Lines of text。
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-12-16 13:38:43 IP:203.73.xxx.xxx 未訂閱
無法LoadFromFile,但是你可以自己處理讀檔,將CustNo讀到String,將Record騙成一個TObject
要用的時候再typecast回來就好..
要搜尋字串的話,最好用THashedStringList..
不過我認為以你可以操作讀進來的狀況下,其實可以跟上面的前輩說的一樣,自己作B Sort其實效率可能會比較高
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
系統時間:2024-05-19 17:46:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!