dateset都有savetofile和loadfromfile函数,试验一下吧

解决方案 »

  1.   

    记录文件的打开和创建同文本文件一样也需要关联和初始化两个步骤。同文本文件唯一的不同是不能使用Append过程。
      记录文件缺省情况下以读写方式打开,如果想以只读或只写方式打开,则需要修改System单元中定义的变量FileMode的值。
      FileMode的取值和意义如下表。
       表6.3  FileMode的取值和意义
        ━━━━━━━━━━━━━━
        取值     意义
        ──────────────
        0 只读
        1 只写
        2 读写
        ━━━━━━━━━━━━━━
      FileMode是一个全局变量,对它的每次修改都将影响所有Reset的操作,因此在打开自己的文件后应还原它的值。
      在本系统中,当用户按下“打开”按钮时,首先弹出一个标准文件打开对话框,要求用户输入或选择文件名。确认后如果该文件名的文件存在,则用Reset打开,若不存在则创建。程序清单如下。
    procedure TRecFileForm.OpenButtonClick(Sender: TObject);
    begin
      if OpenDialog1.Execute then
        FileName := OpenDialog1.FileName
      else
        exit;
      AssignFile(MethodFile,Filename);
      try
        Reset(MethodFile);
        FileOpened := True;
      except
        On EInOutError do
      begin
        try
           if FileExists(FileName) = False then
          begin
            ReWrite(MethodFile);
            FileOpened := True;
          end
          else
          begin
            FileOpened := False;
            MessageDlg('文件不能打开',mtWarning,[mbOK],0);
          end;
        except
          On EInOutError do
          begin
            FileOpened := False;
            MessageDlg('文件不能创建',mtWarning,[mbOK],0);
          end;
        end;
           end;
      end;
      if FileOpened = False then exit;
      Count := FileSize(MethodFile);
      if Count>0 then
        ChangeGrid;
      RecFileForm.Caption := FormCaption+' -- '+FileName;
      NewButton.Enabled := False;
      OpenButton.Enabled := False;
      CloseButton.Enabled := True;
    end;

      首先系统试图用Reset打开一个文件,并置FileOpened为True。如果文件不能打开,则引发一个I/O异常。在异常处理过程中,首先检测文件是否存在。若不存在则创建这个文件。否则是其它原因引发的异常,则把FileOpend重置为False, 并显示信息“文件不能打开”。在文件创建过程中仍可能引发异常,因而在一个嵌套的异常处理中把FileOpened重置为False,并提示信息“文件不能创建”。
      有关异常处理的内容请读者参看第十二章。这段程序说明:异常处理机制不仅能使我们的程序更健壮,而且为编程提供了灵活性。
      当用户按下“创建”按钮时,系统首先弹出一个标准输入框,要求用户输入文件名,确认后系统首先检测文件是否存在。若存在则直接打开,否则创建一个新文件。打开或创建过程导致异常,则重置FileName和FileOpened两个全局变量。
    procedure TRecFileForm.NewButtonClick(Sender: TObject);
    begin
      FileName := InputBox('输入框','请输入文件名','');
      if FileName = '' then Exit;
      try
        AssignFile(MethodFile,FileName);
        if FileExists(FileName) then
        begin
          Reset(MethodFile);
          Count := FileSize(MethodFile);
          if Count>0 then
            ChangeGrid;
        end
        else
        begin
          Rewrite(MethodFile);
          count := 0;
        end;
        FileOpened := true;
      Except
        on EInOutError do
        begin
          FileName := '';
          FileOpened := False;
        end;
      end;
      if FileOpened then
      begin
        NewButton.Enabled := False;
        OpenButton.Enabled := False;
        CloseButton.Enabled := True;
        RecFileForm.Caption := FormCaption+' -- '+FileName;
      end;
    end;
      当文件打开或创建后,所要做的工作有:
      ● 若文件非空,则计算文件长度,并用文件内容填充StringGrid1
      ● “创建”、“打开”按钮变灰,“关闭”按钮使能
      ● 把文件名附到窗口标题后

    6.2.4 记录文件的读入和显示
      定义一个全局变量Count用来保存文件中的记录个数。当文件装入时:
      Count := FileSize(MethodFile);
      如果Count > 0,则首先确定StringGrid1的高度、行数。为保证StringGrid1不会覆盖窗口下面的编辑框,定义一个常量MaxShow。当Count < MaxShow时,记录可全部显示;当Count >= MaxShow时,StringGrid1自动添加一个滚动棒。为保证滚动棒不覆盖掉显示内容,StringGrid1的宽度应留有余地。
      确定StringGrid1高度、行数的代码如下:
      With StringGrid do
          if count < MaxShow then
            Height := DefaultRowHeight * (Count+1)+10
           else
           Height := DefaultRowHeight * MaxShow+10;
          RowCount := Count+1;
        end;
        而后从文件中逐个读入记录并显示在StringGrid1的相应位置:
      for i := 1 to Count do 
         begin
           Read(MethodFile,MethodRec);
           ShowMethod(MethodRec,i);
         end;
         ShowMehtod是一个过程,用来把一条记录填入StringGrid1的一行中。对于Name、Condition域而言,只须直接赋值即可;而对Nature 域需要把枚举类型值转化为对应意义的字符串(0:“微观”,1:“宏观”);而对Result域则需要把数值转化为一定格式的字符串:
    Str (MethodRec.Result:6:4,ResultStr);
      StringGrid1.Cells[3,Pos] := ResultStr;
        即Result显示域宽为6,其中小数点后位数为4。