Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
126 / 124 / 107
Регистрация: 09.01.2017
Сообщений: 1,644
1

Сохранение таблицы StringGrid вместе с объектами

05.08.2017, 20:33. Показов 2351. Ответов 3
Метки нет (Все метки)

Доброго времени суток. Есть StringGrid с закрашенными ячейками. Как сохранить таблицу вместе с цветами ячеек?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2017, 20:33
Ответы с готовыми решениями:

Сохранение stringgrid c многострочными ячейками
Подскажите как сохранить содержимое stringgrig в файл, чтобы потом обратно можно было его загрузить...

Сохранение и загрузка таблицы (StringGrid)
Мне задали задание сохранить, сохранить как и открыть stringgrid. С диалогами умею делать ток memo....

Сохранение таблицы StringGrid в картинку
Добрый день уважаемые форумчани , у меня возник вопрос по сохранению таблицы StringGrid в формат...

StringGrid Сохранение в файл в виде таблицы
Здравствуйте! Подскажите пожалуйста, как сохранять из StringGrid в текстовый файл, чтобы в тхт...

3
357 / 157 / 40
Регистрация: 11.07.2013
Сообщений: 857
05.08.2017, 21:02 2
А StringGrid1.SaveToFile или StringGrid1.SaveToCSVFile не подходят?
0
126 / 124 / 107
Регистрация: 09.01.2017
Сообщений: 1,644
05.08.2017, 21:21  [ТС] 3
Эти функции не сохраняют цвета. Проверил...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31045 / 20279 / 7897
Регистрация: 22.10.2011
Сообщений: 35,179
Записей в блоге: 6
05.08.2017, 21:30 4
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Поскольку встроенных методов, сохраняющих значения Objects в классе TStringGrid нет - то придется делать все вручную. Самое первое приближение:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
procedure TForm1.ButtonSaveClick(Sender: TObject);
 
  function ObjToColorStr(Obj: TObject): string;
  begin
    if Assigned(Obj) then
      Result := ColorToString(TColor(Lo(PtrUInt(Obj))))
    else
      Result := '';
  end;
 
var
  L: TStringList;
  s: string;
  c, r: integer;
  g: TStringGrid;
begin
  g := StringGrid1;
  L := TStringList.Create;
  try
    for r := 0 to Pred(g.RowCount) do
    begin
      s := '';
      for c := 0 to Pred(g.ColCount) do
      begin
        if c <> 0 then
          s := s + ';';
        s := s + Format('%s | %s', [g.Cells[c, r], ObjToColorStr(g.Objects[c, r])]);
      end;
      L.Add(s);
    end;
    L.SaveToFile('grid.txt');
  finally
    L.Free;
  end;
 
end;
 
procedure TForm1.ButtonLoadClick(Sender: TObject);
var
  L, row: TStringList;
  r, c: integer;
  sCell, sObj: string;
  g: TStringGrid;
begin
  g := StringGrid1;
  L := TStringList.Create;
  row := TStringList.Create;
  try
    row.Delimiter := ';';
    row.StrictDelimiter := True;
    L.LoadFromFile('grid.txt');
    for r := 0 to Pred(L.Count) do
    begin
      row.Clear;
      row.DelimitedText := L[r];
      for c := 0 to Pred(row.Count) do
      begin
        sCell := Trim(ExtractWord(1, row[c], ['|'])); // uses StrUtils для использования этой функции
        if sCell <> '' then
          StringGrid1.Cells[c, r] := sCell;
        sObj := Trim(ExtractWord(2, row[c], ['|']));
        if sObj <> '' then
          StringGrid1.Objects[c, r] := TObject(PtrUInt(StringToColor(sObj)));
      end;
    end;
  finally
    row.Free;
    L.Free;
  end;
end;
Текст ячеек грида не должен содержать пайпов (символов "|") и точек с запятой. Если содержит - то придется заменить в тексте программы эти символы на те, которые гарантированно в ячейках не содержатся. Тестировалось на 64-битном Лазарусе, поэтому конвертация из/в TObject именно такая.

Update:
Что-то посмотрел я на код - не нравится он мне. Можно использовать стандартные SaveToCSVFile/LoadFromCSVFile, но нужно написать маленький класс-перехватчик для StringGrid, в котором нужно переопределить поведение GetCells/SetCells, чтобы они при определенных условиях заносили информацию не только в Cells[], а еще и в Objects[]. Итак: перед классом формы пишем:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type
 
  { TStringGrid }
  TStringGrid = class(Grids.TStringGrid)
  public
    saving : boolean;
 
  protected
    function GetCells(ACol, ARow: Integer): string; override;
    procedure SetCells(ACol, ARow: Integer; const AValue: string); override;
  end;
 
  { TForm1 }
  TForm1 = class(TForm) // дальше все остается как было, без изменений...
Реализация переопределенных методов:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{ TStringGrid }
function TStringGrid.GetCells(ACol, ARow: Integer): string;
 
  function ObjToColorStr(Obj: TObject): string;
  begin
    if Assigned(Obj) then
      Result := ColorToString(TColor(Lo(PtrUInt(Obj))))
    else
      Result := '';
  end;
 
begin
  if not Saving then Result := inherited GetCells(ACol, ARow)
  else
    Result := inherited GetCells(ACol, ARow) + '|' + ObjToColorStr(Objects[ACol, ARow]);
end;
 
procedure TStringGrid.SetCells(ACol, ARow: Integer; const AValue: string);
var
  sCell, sObj : string;
begin
  if not saving then inherited SetCells(ACol, ARow, AValue)
  else
  begin
    sCell := Trim(ExtractWord(1, ' ' + AValue + ' ', ['|']));
    if sCell <> '' then
      inherited SetCells(ACol, ARow, sCell);
    sObj := Trim(ExtractWord(2, ' ' + AValue + ' ', ['|']));
    if sObj <> '' then
      Objects[ACol, ARow] := TObject(PtrUInt(StringToColor(sObj)));
  end;
end;
И теперь можно будет сохранять/загружать содержимое грида вот так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.ButtonSaveClick(Sender: TObject);
begin
  StringGrid1.saving := true;
  StringGrid1.SaveToCSVFile('grid.csv', ';');
  StringGrid1.saving := false;
end;
 
procedure TForm1.ButtonLoadClick(Sender: TObject);
begin
  StringGrid1.saving := true;
  StringGrid1.LoadFromCSVFile('grid.csv', ';');
  StringGrid1.saving := false;
end;
Так будет лучше.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2017, 21:30

Помощь в написании контрольных, курсовых и дипломных работ здесь.

StringGrid Сохранение в файл в виде таблицы ( через - и | )
Здравствуйте! Подскажите пожалуйста, как сохранять из StringGrid в текстовый файл, чтобы в тхт...

Сохранение содержимого StringGrid-а в виде таблицы в текстовом документе
Есть заполненая таблица Stringgrid размером Nx2 (n&gt;3) как сохранить в текстовом документе все эти...

Сохранение из StringGrid массива в файл и загрузка из файла в StringGrid
Всем доброго времени суток =) У меня есть загрузка массива из StringGrid на Delphi 2010:...

Сохранение в БД объекта связанного с другими объектами
Класс Game public class Game { public int GameId { get; set; } public...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.