StringGrid сохранение и загрузка
Для хранения табличных данных вполне подойдёт обыкновенный текстовый файл. Код будет такой:
//Запись данных в файл. procedure TForm1.Button1Click(Sender: TObject);
const
Fn = 'data.txt';
var
F : TextFile;
Sg : TStringGrid;
i, j, Cnt, CntMax : Integer;
begin
Sg := StringGrid1;
AssignFile(F, Fn);
Rewrite(F);
//Запись сведений о рамерах таблицы.
Writeln(F, Sg.RowCount); Writeln(F, Sg.ColCount);
Writeln(F, Sg.FixedRows);
Writeln(F, Sg.FixedCols);
//Общее количество ячеек в таблице.
CntMax := Sg.RowCount * Sg.ColCount; //Счётчик записанных в файл ячеек.
Cnt := 0;
//Построчная запись данных из ячеек таблицы.
for j := 0 to Sg.ColCount - 1 do for i := 0 to Sg.RowCount - 1 do begin
Write(F, Sg.Cells[j, i]);
Inc(Cnt);
if Cnt < CntMax then Writeln(F);
end;
CloseFile(F);
end; //Чтение данных из файла. procedure TForm1.Button2Click(Sender: TObject);
const
Fn = 'data.txt';
var
F : TextFile;
Sg : TStringGrid;
i, j, Num : Integer;
S : String;
begin
Sg := StringGrid1;
AssignFile(F, Fn);
Reset(F);
//Чтение сведений о размерах таблицы.
//Общее количество строк.
Readln(F, Num);
if Num = 0 then begin ShowMessage('Неверный формат файла. Действие отменено.'); CloseFile(F);
Exit;
end;
//Очистка лишних строк. Это действие предусмотрено для устранений
//последствий бага TStringGrid. - TStringGrid при уменьшении числа
//строк, может на самом деле их не удалить, а только скрыть.
//И в дальнейшем, при добавлении новых строк, вместо появления пустых
//строк могут появиться ранее скрытые строки с прежними данными.
//Это касается также и столбцов.
if Num < Sg.RowCount then for i := Num - 1 to Sg.RowCount - 1 do
Sg.Rows[i].Clear
;
Sg.RowCount := Num;
//Общее количество столбцов.
Readln(F, Num);
if Num = 0 then begin ShowMessage('Неверный формат файла. Действие отменено.'); CloseFile(F);
Exit;
end;
//Очистка лишних столбцов.
if Num < Sg.ColCount then for i := Num - 1 to Sg.ColCount - 1 do
Sg.Cols[i].Clear
;
Sg.ColCount := Num;
//Количество фиксированных строк и толбцов.
Readln(F, Num); Sg.FixedRows := Num;
Readln(F, Num);
Sg.FixedCols := Num;
//Построчное чтение данных ячеек таблицы.
for j := 0 to Sg.ColCount - 1 do for i := 0 to Sg.RowCount - 1 do begin
Readln(F, S);
Sg.Cells[j, i] := S;
end;
CloseFile(F);
end; |