Здравствуйте.
Красный лучше оставь белым.
(Если время пребывания меньше - время сушки - красный, если время пребывания больше - время сушки - зеленый.)
Раскраска строк в два цвета (красный-зеленый) не соответствует Вашему первому сообщению - там красный цвет (предупреждающий/аварийный) означает что сушка закончилась преждевременно, и лучше не использовать его для нормально идущего процесса. Должна быть явная индикация (в общей таблице или в отдельной). Это позволяет визуально контролировать ошибки (сейчас выкатил тележку раньше времени и концы в воду) операторов тележки. Да и то только если таблицы видит начальник.
... корректно записываются и удаляются данные.
На мой взгляд более правильно использовать БД именно как БД, а не как некоторый сохраняемый массив данных. Т.е. по хорошему в БД при заезде тележки должно фиксироваться дата-время заезда и некоторая идентифицирующая информация о загрузке тележки (доски, брус, ... кирпич и т.д.)
При выезде тележки БД дополняется временем сушки, текущем интервалом контроля и идентификатором выкатившего тележку оператора/бригады. В этом случае начальник может контролировать многие очень интересные вещи.
Замечание по скрипту обработки SQL-запроса - к сожалению окончание скрипта не видно, но если у условия "if DataSet.IsEmpty = false then" нет альтернативы "else" с очисткой таблицы, то группа тележек, умудрившаяся выкатиться, полностью освободив помещение в течение последней минуты, может и не удалиться из таблиц формы.
Можно обрезать "жирок" со скриптов:
begin
// запрашиваем первые до 20 строк
RunSQL('SELECT numberCart,timeCart1,timeCart2 FROM cart1 LIMIT 20;', Table1, 3);
// запрашиваем остаток строк
RunSQL('SELECT numberCart,timeCart1,timeCart2 FROM cart1 LIMIT 20 OFFSET 20;', Table2, 3);
end.
var aRow, i: integer;
aColor: cardinal;
begin
if DataSet.Tag = 3 then
with DataSet.Sender as TM_Table do
for aRow := 0 to 19 do
if not DataSet.EOF then
begin
if DataSet.Fields[2].AsInt > dryingTime1.AsInt then aColor := clGreen
else aColor := clRed;
for i := 0 to DataSet.FieldCount - 1 do
begin
GetCell(i, aRow).Text := DataSet.Fields[i].AsStr;
GetCell(i, aRow).Color := aColor;
end;
DataSet.Next;
end
else
for i := 0 to 2 do
begin
GetCell(i, aRow).Text := '';
GetCell(i, aRow).Color := clNone;
end;
end.
Что касается упорядочивания строк в порядке заезда тележек, то только одни времена суток (без даты) сортировкой упорядочить не удастся. Для случая только времени суток можно добавить в качестве первичного ключа новый столбец с автоинкрементом (см. в примере).
С проблемой считывателя меток нужно разбираться по его документации. Без этого пытаться городить всевозможные фильтры и логику бесполезно, т.к. доподлинно не известно всегда ли это будет работать или перестанет по изменению погоды, скоростью движения тележки и т.д.
В качестве шаманства с бубном, можно изменить фронт срабатывания TagRead (в предположении что один фронт индицирует начало считывания, а другой собственно завершение).