FileToGrid (Delphi)

From RAD Studio Code Examples
Jump to: navigation, search

Description

The following example uses a button, a string grid, and an Open dialog box on a form. When the button is clicked, you for a file name. When you click OK, the specified file is opened, read into a buffer, and closed. Then the buffer is displayed in two columns of the string grid. The first column contains the character values in the buffer. The second column contains the numeric values of the characters in the buffer.

Code

// Read File to Grid
procedure TForm1.Button1Click(Sender: TObject);
var
  iFileHandle: Integer;
  iFileLength: Integer;
  iBytesRead: Integer;
  Buffer: PAnsiChar;
  X, Y, I: Integer;
  StringLen, colcnt, rowcnt: Integer;
  cellString: String;
begin
  if OpenDialog1.Execute then
  begin
    try
      iFileHandle := SysUtils.FileOpen(OpenDialog1.FileName, fmOpenRead);
      iFileLength := SysUtils.FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
//      Buffer := PChar(System.AllocMem(iFileLength + 1));
//      iBytesRead := SysUtils.FileRead(iFileHandle, Buffer^, iFileLength);
//      FileClose(iFileHandle);
//      iFileHandle := SysUtils.FileOpen(OpenDialog1.FileName, fmOpenRead);
//      iFileLength := SysUtils.FileSeek(iFileHandle,0,2);
//      FileSeek(iFileHandle,0,0);
      colcnt := StringGrid1.ColCount;
      iBytesRead := SysUtils.FileRead(
        iFileHandle,
        colcnt,
        4);  // 4 because it's an integer
      rowcnt := StringGrid1.RowCount;
      iBytesRead := SysUtils.FileRead(
        iFileHandle,
        rowcnt,
        4);  // 4, because it is an integer.
    for X := 0 to StringGrid1.ColCount - 1 do
    begin
      for Y := 0 to StringGrid1.RowCount - 1 do
      begin
        try
          iBytesRead := SysUtils.FileRead(iFileHandle, StringLen, 4);  // 4 because it's an integer
          Buffer := System.AllocMem(StringLen + 1);
//          GetMem(Buffer, StringLen); { allocate the buffer }
          iBytesRead := SysUtils.FileRead(iFileHandle, Buffer^, StringLen);
//          for I := 1 to StringLen do
//            cellString[I] := Buffer[I - 1];
          StringGrid1.Cells[X,Y] := AnsiString(Buffer);
        finally
          FreeMem(Buffer);
        end;
      end;
    end;
    finally
      FileClose(iFileHandle);
    end;
  end;
end;

// Write Grid into File.
procedure TForm1.Button2Click(Sender: TObject);
var
  BackupName: string;
  FileHandle: Integer;
  StringLen: Integer;
  X, Y, I: Integer;
  colCountLength, rowCountLength: Integer;
  Buffer: PAnsiChar;
  cellString: AnsiString;
begin
  if SaveDialog1.Execute then
  begin
    if FileExists(SaveDialog1.FileName) then
    begin
      BackupName := SysUtils.ExtractFileName(SaveDialog1.FileName);
      BackupName := ChangeFileExt(BackupName, '.BAK');
      //Removing previously created .BAK files, if found.
      if FileExists(BackupName) then
      begin
        DeleteFile(BackupName);
      end;
      if not RenameFile(SaveDialog1.FileName, BackupName) then
        raise Exception.Create('Unable to create backup file.');
    end;
    FileHandle := FileCreate(SaveDialog1.FileName);
    { Write out the number of rows and columns in the grid. }
    colCountLength := SizeOf(StringGrid1.ColCount);
    FileWrite(FileHandle, 
      PAnsiChar(StringGrid1.ColCount), colCountLength);
    rowCountLength := SizeOf(StringGrid1.RowCount);
    FileWrite(FileHandle,
      PAnsiChar(StringGrid1.RowCount), rowCountLength);
    for X := 0 to StringGrid1.ColCount - 1 do
    begin
      for Y := 0 to StringGrid1.RowCount - 1 do
      begin
        try
          { Write out the length of each string, followed by the string itself. }
          StringLen := Length(StringGrid1.Cells[X,Y]);
          FileWrite(FileHandle, PChar(StringLen), SizeOf(StringLen));
          GetMem(Buffer, StringLen); { Allocate the buffer. }
          cellString := StringGrid1.Cells[X,Y];
          for I := 1 to StringLen do
             Buffer[I - 1] := cellString[I];
          FileWrite(FileHandle, Buffer^, StringLen);
        finally
          FreeMem(Buffer, StringLen);
        end;
      end;
    end;
    FileClose(FileHandle);
  end;
end;

Uses