На первое время сделал следующим образом:
В таблице справочнике кроме полей 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,так что ищу более забавные методы.