お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"型付きファイルの読み書き"





■型付きファイルの読み書き
# nifty/FDELPHI/MES/6/14017 からのツリーのまとめ(^^;

■・Form1にButtonを5つ、SpinEditを1つ、Editを3つ置きます。
 ・入力は Edit1 : Name(氏名)
      Edit2 : Address(住所)
      Edit3 : Age(年齢)
  とします。

■コード 
//--------------------------------------------------------------------

type
  TPersonData = Record  {レコード}
      Name : String[20];
      Address : String[50];
      Age : Byte;
  end;

  TForm1 = class(TForm)
    ・
    ・
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;
var
  Form1: TForm1;
  F:File of TPersonData;
  rec:TPersonData;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);//OnCreateでの処理
begin
  AssignFile(F, 'Test.dat');
  try
     Reset(F);// ファイルがあれば開く
  except
     Rewrite(F);//なければ新規作成
  end;
  SpinEdit1.MaxValue:=FileSize(F);
  SpinEdit1.MinValue:=0;//コードを分かりやすくするため、
end;                    //MinValueを0にしました

procedure TForm1.Button1Click(Sender: TObject);   //挿入
var i:integer;
begin
  if SpinEdit1.Value < FileSize(F) then
  begin
     Reset(F);
     for i:=FileSize(F)-1 downto SpinEdit1.Value do
     begin
        Seek(F,i);
        Read(F,rec);//iの位置のデータを読む
        Seek(F,i+1);
        Write(F,rec)//i+1の位置に書き込み
     end;
     Seek(F,SpinEdit1.Value)
  end
  else
     Seek(F,FileSize(F)) ;
  rec.Name:=Edit1.Text;
  rec.Address:=Edit2.Text;;
  rec.Age:=StrToInt(Edit3.Text);
  Write(F,rec);
  SpinEdit1.MaxValue:=FileSize(F);
end;

procedure TForm1.Button2Click(Sender: TObject);  //追加
begin
  Seek(f,FileSize(F));//Fileの最終位置
  rec.Name:=Edit1.Text;
  rec.Address:=Edit2.Text;;
  rec.Age:=StrToInt(Edit3.Text);
  Write(F,rec);
  SpinEdit1.Value:=FileSize(F)-1;
  SpinEdit1.MaxValue:=FileSize(F);
end;

procedure TForm1.Button3Click(Sender: TObject);//上書き
begin
   if SpinEdit1.Value < FileSize(F) then
   begin
     Seek(F,SpinEdit1.Value);
     rec.Name:=Edit1.Text;
     rec.Address:=Edit2.Text;;
     rec.Age:=StrToInt(Edit3.Text);
     Write(F,rec);
   end;
end;

procedure TForm1.Button4Click(Sender: TObject); //削除
var i:integer;
begin
  if SpinEdit1.Value < FileSize(F) then
  begin
     if SpinEdit1.Value < FileSize(F)-1 then //最終レコードでない場合
        for i:=SpinEdit1.Value to FileSize(F)-2 do
        begin
          Seek(F,i+1);
          Read(F,rec);
          Seek(F,i);
          Write(F,rec);
        end;
     Seek(f,FileSize(F)-1);
     Truncate(F);//最終レコード削除
     SpinEdit1.MaxValue:=FileSize(F);
  end;
end;

procedure TForm1.Button5Click(Sender: TObject);//氏名で検索
var DataF:Boolean;
begin
  DataF:=False;
  Reset(F);
  while not EOF(F) do
  begin
     Read(F,rec);
     if (rec.Name) = Edit1.Text  then
     begin
        DataF:=True;
        SpinEdit1.Value:=FilePos(F)-1;//該当データの位置
        Edit2.Text:=rec.Address;
        Edit3.Text:=IntToStr(rec.Age);
        Break;
     end;
  end;
  if not DataF then
  ShowMessage('No Data');
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);//移動
begin
  if SpinEdit1.Value < FileSize(F) then
  begin
     Seek(F,SpinEdit1.Value);
     Read(F,rec);
     Edit1.Text:=rec.Name;
     Edit2.Text:=rec.Address;
     Edit3.Text:=IntToStr(rec.Age);
  end
  else
  begin
     SpinEdit1.Value:=FileSize(F);
     Edit1.Text:='';
     Edit2.Text:='';
     Edit3.Text:='';
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   CloseFile(F);
end;

end.
//-------------------------------------------------------------------


                   _/_/   Athena ( VYH00522 )  _/_/





Original document by Athena          氏 ID:(VYH00522)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum