Здравствуйте.
"Затупы":
1. Граничные значения индексов ячейки - [0..*Count-1];
2. Собственно алгоритм, который может быть таким:
- поиск индекса столбца с датой по первой строке;
- внешний цикл - перебор строк, вычисление цвета по значению времени из столбца с датой;
- внутренний цикл - закраска ячеек в выбранной строке.
var i,j,k:integer;
sqldate:TDateTime;
cellcolor:Cardinal;
begin
with Table1 do begin
if RowCount < 2 then exit; // пустая таблица
k:=-1;
for j:=0 to ColumnsCount-1 do // поиск первого столбца с датой
if SecondsBetween(NOW,strtodateTime(GetCell(j,1).Text)) > 2 then begin
k:=j;
break;
end;
if k < 0 then exit;
for i:=1 to RowCount-1 do
begin
sqldate:=strtodateTime(GetCell(k,i).Text); // дата-время в текущей строке
if (Date1box1.AsDateTime < sqldate) and (sqldate < Date2box1.AsDateTime) then cellcolor:=clGreen // цвет по условию
else cellcolor:= clRed;
for j:=0 to ColumnsCount-1 do GetCell(j,i).Color:=cellcolor; // расскрас строки
end;
end;
end.
На всякий случай - условия проверки "... или равно" определяют вхождение соответствующей границы в заданную область.
Пример во вложении.
Да все получилось по второму способу, берите эту проверочку на заметочку!) ;) Можно в принципе сделать и ручной ввод данных через field
var i,j,k:integer;
sqldate:TDateTime;
cellcolor:Cardinal;
begin
with Table1 do begin
if RowCount < 2 then
exit; // пустая таблица
k:=-1;
for j:=0 to ColumnsCount-1 do // поиск первой строки с датой
if (strtodateTime(GetCell(j,1).Text) > strTODateTime('01.01.2022 00:00:00')) then
begin
k:=j;
break;
end;
if k < 0 then
begin
exit;
end;
for i:=1 to RowCount-1 do
begin
sqldate:=strtodateTime(GetCell(k,i).Text); // дата-время в текущей строке
if (Date1box1.AsDateTime < sqldate) and (sqldate < Date2box1.AsDateTime)
then
cellcolor:=clGreen // цвет по условию
else
cellcolor:= clRed;
for j:=0 to ColumnsCount-1 do
GetCell(j,i).Color:=cellcolor; // расскрас строки
end;
end;
//ShowMessageClient(getclientname(),'asf',DateTimeToStr(sqldate));
end.