Topic: Хранение стиля ячейки таблицы в бд

Добрый день!

Подскажите пожалуйста, как лучше реализовать следующую схему:

На главной форме есть таблица, некоторые ячейки берут свои значения из связанных таблиц (словари), и некоторым из этих значений нужно помимо содержимого еще и настроить цвет фона\текста, причем эти настройки также нужно хранить в бд.

Пока что у меня две мысли:

1) Просто добавить цвета в таблицу словаря, и подтягивать их в виде дополнительных столбцов в тейблгрид. далее на Onchange скрывать эти столбцы, брать из них значения и раскрашивать все что нужно. Это, конечно, самый простой метод, но меня расстраивает количество "лишней" информации. Получается что на 4 столбца с данными у меня будет 8 столбцов с цветами.

2) Загружать стили из словарей заранее в некоторую переменную и дальше уже применять исходя из номера столбца и содержимого ячейки. В этом случае я не могу найти типа данных, который бы мне подошел. То есть например у меня есть строка и два цвета к ней - фона и текста. Есть ли какое-то key-value хранилище кроме tsringlist с его values?

Как будет лучше? Может кто-то уже делал что-то подобное? Спасибо.

Re: Хранение стиля ячейки таблицы в бд

На первое время сделал следующим образом:

В таблице справочнике кроме полей id и name добавил bg (задний фон) и fg (передний фон).

При обновлении основной таблицы читаю "стили" и прохожусь по строкам:

procedure f_Main_tgItems_OnChange (Sender: string);
var i, rows : integer;
    Results: TDataSet;
begin
    SQLQuery('select id,bg,fg from dic_doctype order by id', Results);
    f_Main.tgItems.BeginUpdate;
    rows := f_Main.tgItems.RowCount-1;
    for i:= 0 to rows do
        begin
            if f_Main.tgItems.Cell[2,i].asInteger >0 then
            begin
                if Results.Locate('id',f_Main.tgItems.Cell[2,i].asInteger,0) then
                begin
                    if Results.Fields[1].Value <> NULL then f_Main.tgItems.Cell[2,i].Color :=  Results.Fields[1].asInteger;
                    if Results.Fields[2].Value <> NULL then f_Main.tgItems.Cell[2,i].TextColor :=  Results.Fields[2].asInteger;
                end;
            end;
        end;
    f_Main.tgItems.EndUpdate;
end;

Получается довольно быстро,если "мерять" скорость с помощью MilliSecondsBetween, то раскраска двух столбцов в таблице из 10000 строк у меня занимает около 1 секунды. Но минимум половину времени занимает locate,так что ищу более забавные методы.

Re: Хранение стиля ячейки таблицы в бд

Ваш способ вполне приемлем, не думаю что возможно как то еще быстрей. Почему не хотите использовать key-value от TStringList?

Dmitry.