Wolfgang Chien's Homepage | Delphi學習筆記 - 問答篇 |
各位前輩弟最進用delphi發生了一些問題
我想開啟一個資料檔(use record),假設A為record型態
var MyFile : FILE Of A; MyRecA : A; .... begin AssignFile(MyFile,'aa.txt'); ^^^^^^^這的型態應該是file吧? ResetFile(MyFile); FileSeek(MyFile,1234,1); ^^這一行會錯誤,因MyFile那一欄型態應為Integer
請問我應該如何將File Handle 轉成Integer型態??或是有其他辦法??
FileSeek() 的第一個引數是 File Handle, 您傳入的是某一類型的檔案變數, 因此在 Compile 時型別不符, 如果您要用 FileSeek() FileRead() FileWrite(),那麼, 開檔與關檔應該用 FileOpen() 與 FileClose()而不是 AssignFile(), 像是:
var hTestFile: THandle; begin hTestFile := FileOpen(sFileName, 2); FileSeek(hTestFile, 0, 0); ..... end;
以前我在練習這部分時, 用的是 'Seek' 這個程序, 找了很久, 終於找出以下這個例子, 您可以參考看看:
![]() |
1. File | New Project 開始一個新的專案 |
![]() |
2. File | Save Project 找一個目錄存放這個單元與專案 |
![]() |
3. 在 form1 中安置 TMemo, TEdit, TButton 元件各一 |
![]() |
4. with Edit1 set
Name = edtRecno Text = 1 |
![]() |
5. with Button1 set
Name = btnGet Caption = Get |
![]() |
6. 將單元的 interface 修改成類似如下:
interface uses ...; type (* 新的類型, 測試用 *) TTest = record Id: string[8]; Name: string[10]; end; TForm1 = class(TForm) ... private { Private declarations } (* 另外加上這些成員變數 *) recTest: TTest; fileTest: file of TTest; sFileName: TFileName; ... end; |
![]() |
7. 對 form1 的 OnCreate 撰寫事件程式碼:
procedure TForm1.FormCreate(Sender: TObject); var recWrite: TTest; ix: integer; begin sFileName := ExtractFilePath(ParamStr(0)) + 'Test.Txt'; AssignFile(fileTest, sFileName); FileMode := 2; { Read/Write } Rewrite(fileTest); { Create the file } (* 連續寫入 100 筆記錄 *) for ix := 1 to 100 do begin with recWrite do begin Id := 'No:' + IntToStr(ix); Name := 'Name:' + IntToStr(ix); end; Write(fileTest, recWrite); end; end; |
![]() |
8. 對 form1 的 OnClose 撰寫事件程式碼:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin CloseFile(fileTest); end; |
![]() |
9. 對 btnGet 的 OnClick 撰寫事件程式碼:
procedure TForm1.btnGetClick(Sender: TObject); var iRecord: integer; recRead: TTest; begin iRecord := StrToInt(edtRecno.Text) - 1; if (iRecord < 0) or (iRecord > 99) then begin MessageDlg('Must between 1..100', mtInformation, [mbOK], 0); Exit; end; Seek(fileTest, iRecord); Read(fileTest, recRead); with Memo1.Lines do begin Clear; Add(recRead.Id); Add(recRead.Name); end; end; |
![]() |
10. 再儲存這個專案一次, 然後執行 |
首頁 | 學習筆記 | 主題公園 | 軟體下載 | 關於本站 | 討論信群 | 相約下次 |