我自己定义的记录格式
      DR=Record
        A:String[20];
        B:Integer;
     end;
又自己定义文件将这个记录存到物理磁盘文件中(用的是文件流方式);
    
我做的是把这个磁盘文件的所有记录显示在StringGrid(只是2列(A,B))中,
并在修改StringGrid中的数据后,能够把所有的记录保存到我的那个文件中,这个怎么做
   或有关资料发给我 [email protected]
   或有关网站地址写一下

解决方案 »

  1.   

    我觉得很简单的实现啊,你定义变量对应 DR, 都多少个就写入到 Stream中, 读出的也是,
    var r: dr; i: integer;
    begin
      ...
       fS.LoadFromFile('..
       for I:= 0 to fs.size div sizeof(dr) do
       begin
         fs.read(...
       end;
      ...
    end;
      

  2.   

    当修该stringgrid 中的数据时,怎么保存
      

  3.   

    用 stringgrid 修改後, 你還是用定義的 var r: dr; 先付值, 然後, 打開,讀入對應文件到流, 定位到(seek) 要修改位置, 寫入, 保存 stream 到文件!!
    如你覺得定位復雜, 也可每次都重新將整個 stringgrid 的內容重新寫入!!!
      

  4.   

    给段代码你:这是《参透》一书的代码稍微转换一下就是你的要求了
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids;type
      TForm1 = class(TForm)
        ButtonRead: TButton;
        StringGrid: TStringGrid;
        ButtonWrite: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure ButtonReadClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure ButtonWriteClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ButtonReadClick(Sender: TObject);
    var
      FS: TFileStream;
      Str: string[13];
      N: Integer;
      I: Integer;
      EditStr: string[100];
    begin
      FS := TFileStream.Create('eg.dat', fmOpenRead);
      try
        I := 1;
        repeat
          FS.Read(Str, SizeOf(Str));
          Self.StringGrid.Cells[0, I] := Str;
          FS.Read(N, SizeOf(N));
          Self.StringGrid.Cells[1, I] := IntToStr(N + 10);
          Inc(I);
        until FS.Position >= FS.Size - SizeOf(EditStr);
        FS.Read(EditStr, SizeOf(EditStr));
        Edit2.Text := EditStr;  finally
        FS.Free();
        FS := nil;
      end;
      Self.StringGrid.Update();
    end;procedure TForm1.FormCreate(Sender: TObject);
    const
      Str: string[13] = 'This is line ';
    var
      I: Integer;
    begin
      Self.StringGrid.Cells[0, 0] := 'String';
      Self.StringGrid.Cells[1, 0] := 'Integer';
      for I := 1 to 9 do
      begin
        Self.StringGrid.Cells[0, I] := Str;
        Self.StringGrid.Cells[1, I] := IntToStr(I);
      end;
    end;procedure TForm1.ButtonWriteClick(Sender: TObject);
    var
      FS: TFileStream;
      Str: string[13];
      N: Integer;
      I: Integer;
      EditStr: string[100];
    begin
      FS := TFileStream.Create('eg.dat', fmCreate or fmOpenWrite and fmShareDenyWrite);
      try
        for I := 1 to 9 do
        begin
          Str := Self.StringGrid.Cells[0, I];
          FS.Write(Str, SizeOf(Str));
          N := StrToIntDef(Self.StringGrid.Cells[1, I], 0);
          FS.Write(N, SizeOf(N));
        end;
        EditStr := Edit1.Text;
        Fs.Write(EditStr, Sizeof(EditStr));
      finally
        FS.Free();
        FS := nil;
      end;
    end;end.