掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ブロックリードを変えるのに最適な方法を教えて下さい。 (ID:150898)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
procedure CloseFile(var F: TFILE); begin F.FileStream.Free; F.FileStream := nil; end; から function BlockWrite(var F: TFILE; var Buffer; Count: Integer): LongInt; begin RESULT := F.FileStream.Write(Buffer,F.RECSIZE * Count); end; までをコメントにして F: TFILE を F: FILE にしても動く ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TFILE = record FileStream: TFileStream; Filename: String; RecSize: Int64; end; TDATA = record Day: array[0..9] of AnsiChar; //日付 //10byte Inc: Int64; //入金 //8byte Eat: Int64; //食費 //8byte Oth: Int64; //その他 //8byte Sum: Int64; //食費 + その他 //8byte Bal: Int64; //残金 //8byte 計 50byte end; TForm2 = class(TForm) Button1: TButton; Memo1: TMemo; Button2: TButton; Button3: TButton; Button4: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form2: TForm2; //基本データ DATA:array[1..4] of TDATA= ((Day:'2023/02/01';InC:100000;Eat:0;Oth:0;Sum:0;Bal:100000), (Day:'2023/02/02';InC:0;Eat:1429;Oth:0;Sum:1429;Bal:98571), (Day:'2023/02/06';InC:0;Eat:3237;Oth:7240;Sum:10477;Bal:88094), (Day:'2023/02/08';InC:0;Eat:685;Oth:0;Sum:685;Bal:87409)); //追加データ DATA2:array[1..1] of TDATA= ((Day:'2023/02/09';InC:0;Eat:479;Oth:0;Sum:479;Bal:86930)); implementation {$R *.dfm} procedure CloseFile(var F: TFILE); begin F.FileStream.Free; F.FileStream := nil; end; procedure AssignFile(var F: TFILE; FILENAME: String); begin F.FILENAME := FILENAME; F.FileStream := nil; end; procedure Rewrite(var F: TFILE; RecSize: Integer = 128); begin if Assigned(F.FileStream) = True then CloseFile(F); if FileExists(F.Filename) = True then DeleteFile(F.FILENAME); F.FileStream := TFileStream.Create(F.FILENAME,fmCreate); F.RECSIZE := RECSIZE; end; procedure Reset(var F: TFILE; RecSize: Integer = 128); begin if Assigned(F.FileStream) = True then CloseFile(F); F.FileStream := TFileStream.Create(F.FILENAME,FILEMODE); F.RECSIZE := RECSIZE; end; function Eof(var F: TFILE): Boolean; begin if F.FileStream.Position >= F.FileStream.Size then RESULT := True else RESULT := False; end; function BlockRead(var F: TFILE; var Buffer; Count: Integer): LongInt; begin RESULT := F.FileStream.Read(Buffer,F.RECSIZE * Count); end; procedure Seek(var F: TFILE; N: Integer); begin F.FileStream.Position := N * F.RECSIZE; end; function FilePos(var F: TFILE): Int64; begin RESULT := F.FileStream.Position; end; function FileSize(var F: TFILE): Int64; begin RESULT := (F.FileStream.Size div F.RECSIZE); end; function BlockWrite(var F: TFILE; var Buffer; Count: Integer): LongInt; begin RESULT := F.FileStream.Write(Buffer,F.RECSIZE * Count); end; //データ作成 procedure TForm2.Button1Click(Sender: TObject); var F: TFILE; I: Integer; begin AssignFile(F,'A.TXT'); Rewrite(F,SizeOf(TDATA)); for I := Low(DATA) to High(DATA) do begin BlockWrite (F,DATA[I],1); end; CloseFile(F); end; //全部表示 procedure TForm2.Button2Click(Sender: TObject); var F: TFILE; DATA: TDATA; function XXX(Value: Int64): String; begin RESULT := ' ' + IntToStr(Value); RESULT := Copy(RESULT,Length(RESULT)-6,6); end; begin AssignFile(F,'A.TXT'); FILEMODE := fmOpenRead; Reset(F,SizeOf(TDATA)); while Eof(F) = False do begin BlockRead(F,DATA,1); Memo1.Lines.Add(DATA.Day + ' ' + XXX(DATA.Inc) + ' ' + XXX(DATA.Eat) + ' ' + XXX(DATA.Oth) + ' ' + XXX(DATA.Sum) + ' ' + XXX(DATA.Bal)); end; CloseFile(F); end; //追加 procedure TForm2.Button3Click(Sender: TObject); var F: TFILE; I: Integer; begin AssignFile(F,'A.TXT'); FILEMODE := fmOpenWrite; Reset(F,SizeOf(TDATA)); Seek(F,FileSize(F)); for I := Low(DATA2) to High(DATA2) do begin BlockWrite (F,DATA2[I],1); end; CloseFile(F); end; //3-4 procedure TForm2.Button4Click(Sender: TObject); var I: Integer; F: TFILE; DATA: TDATA; function XXX(Value: Int64): String; begin RESULT := ' ' + IntToStr(Value); RESULT := Copy(RESULT,Length(RESULT)-6,6); end; begin AssignFile(F,'A.TXT'); FILEMODE := fmOpenRead; Reset(F,SizeOf(TDATA)); Seek(F,2); for I:= 1 to 2 do begin BlockRead(F,DATA,1); Memo1.Lines.Add(DATA.Day + ' ' + XXX(DATA.Inc) + ' ' + XXX(DATA.Eat) + ' ' + XXX(DATA.Oth) + ' ' + XXX(DATA.Sum) + ' ' + XXX(DATA.Bal)); end; CloseFile(F); end; procedure TForm2.FormCreate(Sender: TObject); begin Memo1.Font.Name := 'MS ゴシック'; end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.