FileToGrid (Delphi)
From RAD Studio Code Examples
Language:
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
- System.SysUtils.FileExists ( fr | de | ja )
- System.SysUtils.FileOpen ( fr | de | ja )
- System.SysUtils.FileSeek ( fr | de | ja )
- System.SysUtils.FileRead ( fr | de | ja )
- System.SysUtils.FileWrite ( fr | de | ja )
- System.SysUtils.FileClose ( fr | de | ja )