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

將一行TXT檔的資料切成數個欄位的問題

答題得分者是:cmf
johnnychang
一般會員


發表:24
回覆:26
積分:16
註冊:2002-09-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-20 19:04:15 IP:211.74.xxx.xxx 未訂閱
想將TXT檔內固定長度的每一行資料讀入之後, 切成數個固定長度的欄位. 我用下列的方式: procedure TOpenFile.TransferData(); Type TDataRecord=record field01: String[2]; field02: String[3]; field03: String[11]; end; PTDataRecord=^TDataRecord; var InputData: TStringList; ReadRecord: TDataRecord; TotalRec,iIndex: longint; DataRecord:String; P:Pointer; PD:PTDataRecord; begin P:=@DataRecord; PD:=PTDataRecord(P); ReadRecord:=PD^; Try InputData:=TStringList.Create; InputData.LoadFromFile('Test.txt'); TotalRec:=InputData.Count; For iIndex:=0 to TotalRec-1 do begin If InputData.Strings[iIndex]<>'' then begin DataRecord:=InputData.Strings[iIndex]; end; Canvas.TextOut(ReadRecord.Field01,ReadRecord.Field02,ReadRecord.Field03); end; InputData.Free; except MessageBeep(MB_ICONHAND); Application.MessageBox('檔案開啟失敗!','開檔失敗',MB_OK MB_ICONHAND); end; end; 現在的問題是ReadRecord無法準確對應到DataRecord, 請前輩們看看哪裡錯了? 要如何修正? 或是有其他更好的方式? 謝謝!
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-20 23:57:09 IP:61.70.xxx.xxx 未訂閱
    Type TDataRecord=record   case integer of    0: (        field01: array[0..1]  of char;        field02: array[0..1]  of char;        field03: array[0..10] of char;       )    1:      (        Buf:array[0..14] of char;      )    end; PTDataRecord=^TDataRecord;    procedure TOpenFile.TransferData(); var InputData      : TStringList; ReadRecord     : TDataRecord; TotalRec,iIndex: longint; x,y:integer; begin    Try   InputData:=TStringList.Create;   InputData.LoadFromFile('Test.txt');   TotalRec:=InputData.Count;      For iIndex:=0 to TotalRec-1 do   begin    If InputData.Strings[iIndex]<>'' then    begin       ReadRecord.Buf:=Copy(Pchar(InputData.Strings[iIndex]),1,15);       x:=StrToint(ReadRecord.Field01+#0);       y:=StrToint(ReadRecord.Field02+#0);       Canvas.TextOut(x,y,ReadRecord.Field03);    end;   end; InputData.Free; except MessageBeep(MB_ICONHAND); Application.MessageBox('檔案開啟失敗!','開檔失敗',MB_OK+MB_ICONHAND); end; end;        
------
︿︿
johnnychang
一般會員


發表:24
回覆:26
積分:16
註冊:2002-09-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-21 01:24:24 IP:61.59.xxx.xxx 未訂閱
引言:
謝謝, 學到了Record宣告中的Case用法及功能. 但此一敘述ReadRecord.Buf:=Copy(Pchar(InputData.Strings[iIndex]),1,15); 要改為StrPCopy(ReadRecord.Buf,InputData.Strings[iIndex]); 才能執行, 不然會出現imcompatiable Array and String的訊息˙
系統時間:2024-11-23 2:33:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!