能不能把“结构文件”当作变量传递到procedure中去

a442417164 2017-08-26 08:31:19
有很多不同类型的type,用 结构文件 存成.bat文件,例如下面的

type
a=packed record
a1:integer;
a2:integer;
end;

type
b=packed record
b1:double;
b2:integer;
end;

type
c=packed record
c1:char;
c2:double;
end;

var
af:file of a;
bf:file of b;
cf:file of c;


能不能把用一个函数或者过程把上面不同的类型都存到文件中去,即把af,bf,cf当变量传递。
要是没有的话需要写好多重复代码。
...全文
397 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
a442417164 2017-09-01
  • 打赏
  • 举报
回复
引用 3 楼 wdonghai 的回复:

//处理同一结构体写入同一文件
type
  a=packed record
      a1:integer;
      a2:integer;
end;

type
  b=packed record
      b1:double;
      b2:integer;
end;

type
  c=packed record
      c1:char;
      c2:double;
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure WriteData(AStream:TStream;AValue:Pointer;ASize:Integer);
begin
  AStream.WriteBuffer(AValue^,ASize);
end;

procedure TForm1.btnWriteAClick(Sender: TObject);
var
  i:Integer;
  aa:a;
  fs:TFileStream;
  mode:Word;
begin
  mode:=fmCreate;
  if FileExists('c:\a.dat') then mode:=fmOpenWrite;
  fs:=TFileStream.Create('c:\a.dat',mode);
  try
    fs.Seek(0,soEnd);

    for i:=1 to 9 do
    begin
      aa.a1:=i;
      aa.a2:=i*10+i;
      WriteData(fs,@aa,sizeof(aa));
    end;
  finally
    fs.Free;
  end;
end;

procedure TForm1.btnReadAClick(Sender: TObject);
var
  fs:TFileStream;
  aa:a;
  i,iC:Integer;
begin
  fs:=TFileStream.Create('c:\a.dat',fmOpenRead);
  try
    iC:=fs.Size div sizeof(aa);
    for i:=1 to iC do
    begin
      fs.ReadBuffer(aa,sizeof(aa));
      showmessage(inttostr(aa.a1)+','+inttostr(aa.a2));
    end;
  finally
    fs.Free;
  end;
end;

procedure TForm1.btnWriteBClick(Sender: TObject);
var
  i:Integer;
  bb:b;
  fs:TFileStream;
  mode:Word;
begin
  mode:=fmCreate;
  if FileExists('c:\b.dat') then mode:=fmOpenWrite;
  fs:=TFileStream.Create('c:\b.dat',mode);
  try
    fs.Seek(0,soEnd);

    for i:=1 to 10 do
    begin
      bb.b1:=i;
      bb.b2:=i*10+i;
      WriteData(fs,@bb,sizeof(bb));
    end;
  finally
    fs.Free;
  end;
end;
你这种功能方法可以存储,但是导出数据时不好处理
a442417164 2017-08-27
  • 打赏
  • 举报
回复
ini查找文件太慢,
怎么把af:file of a;当变量传递。
求大神。
赵4老师 2017-08-27
  • 打赏
  • 举报
回复
wdonghai 2017-08-27
  • 打赏
  • 举报
回复

//处理同一结构体写入同一文件
type
  a=packed record
      a1:integer;
      a2:integer;
end;

type
  b=packed record
      b1:double;
      b2:integer;
end;

type
  c=packed record
      c1:char;
      c2:double;
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure WriteData(AStream:TStream;AValue:Pointer;ASize:Integer);
begin
  AStream.WriteBuffer(AValue^,ASize);
end;

procedure TForm1.btnWriteAClick(Sender: TObject);
var
  i:Integer;
  aa:a;
  fs:TFileStream;
  mode:Word;
begin
  mode:=fmCreate;
  if FileExists('c:\a.dat') then mode:=fmOpenWrite;
  fs:=TFileStream.Create('c:\a.dat',mode);
  try
    fs.Seek(0,soEnd);

    for i:=1 to 9 do
    begin
      aa.a1:=i;
      aa.a2:=i*10+i;
      WriteData(fs,@aa,sizeof(aa));
    end;
  finally
    fs.Free;
  end;
end;

procedure TForm1.btnReadAClick(Sender: TObject);
var
  fs:TFileStream;
  aa:a;
  i,iC:Integer;
begin
  fs:=TFileStream.Create('c:\a.dat',fmOpenRead);
  try
    iC:=fs.Size div sizeof(aa);
    for i:=1 to iC do
    begin
      fs.ReadBuffer(aa,sizeof(aa));
      showmessage(inttostr(aa.a1)+','+inttostr(aa.a2));
    end;
  finally
    fs.Free;
  end;
end;

procedure TForm1.btnWriteBClick(Sender: TObject);
var
  i:Integer;
  bb:b;
  fs:TFileStream;
  mode:Word;
begin
  mode:=fmCreate;
  if FileExists('c:\b.dat') then mode:=fmOpenWrite;
  fs:=TFileStream.Create('c:\b.dat',mode);
  try
    fs.Seek(0,soEnd);

    for i:=1 to 10 do
    begin
      bb.b1:=i;
      bb.b2:=i*10+i;
      WriteData(fs,@bb,sizeof(bb));
    end;
  finally
    fs.Free;
  end;
end;
hongss 2017-08-26
  • 打赏
  • 举报
回复
可以写成ini文件读取 结构体也可以当做参数传递的

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧