Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
ВнизВыделение строк таблицы разным цветом по времени Найти похожие ветки
← →
K_Lock © (2006-07-13 18:18) [0]Есть таблица, в каждой строке задано некоторое время {Time}, которое > текущего;
Нужно выделять строки разным цветом:
{Time} < 20 мин до текущего времени - синий;
{Time} < 15 мин до текущего времени - зеленый;
{Time} < 10 мин до текущего времени -красный;
-----------------------------
Каким образом лучше организовать такую проверку;
Если прописать ее в Таймере, не будет ли сильных тормозов при наличии большого числа записей? Может есть другой вариант?
← →
Vlad © (2006-07-13 18:45) [1]
> K_Lock © (13.07.06 18:18)
Речь о DBGrid или о чем?
← →
unknown © (2006-07-13 18:46) [2]
function GetCellColor(D: TDateTime; DefColor: TColor): TColor;
var
Mins: integer;
begin
Mins := MinutesBetween(NOW, D);
if Mins < 10 then
Result := clRed
else if Mins < 15 then
Result := clGreen
else if Mins < 20 then
Result := clBlue
else
Result := DefColor;
end;
← →
unknown © (2006-07-13 18:51) [3]Как отрисовывать - зависит от типа грида, но в любом
случае в обработчике OnDraw***Cell
← →
Плохиш © (2006-07-13 18:54) [4]
> Каким образом лучше организовать такую проверку;
Ну про это уже сказали.
А перерисовку грида вызывай по таймеру раз в минуту.
← →
K_Lock © (2006-07-13 18:54) [5]DBGridEh
← →
unknown © (2006-07-13 19:06) [6]
procedure TForm1.DBGridEh1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
function GetCellColor(D: TDateTime; DefColor: TColor): TColor;
var
Mins: integer;
begin
Mins := MinutesBetween(TimeOf(NOW), TimeOf(D));
if Mins < 10 then
Result := clRed
else if Mins < 15 then
Result := clGreen
else if Mins < 20 then
Result := clBlue
else
Result := DefColor;
end;
begin
if AnsiUpperCase(Field.FieldName) = "EVENT_TIME" then
with DBGridEh1.Canvas do
begin
Brush.Color := GetCellColor(Field.AsDateTime, Brush.Color);
FillRect(Rect);
TextOut(Rect.Left + 2, Rect.Top + 2, Field.AsString);
end;
end;
← →
K_Lock © (2006-07-14 00:08) [7]Спасибо, все работает.
Только не могу разобраться КАК ВЫДЕЛИТЬ ВСЮ СТРОКУ, а не ячейку.
← →
Vlad © (2006-07-14 00:14) [8]
> K_Lock © (14.07.06 00:08) [7]
подозреваю нужно вот эту строчку:
> Brush.Color := GetCellColor(Field.AsDateTime, Brush.
> Color);
а именно Field.AsDateTime заменить на Query.FieldByName(<поле_с_временем>).AsDateTime
← →
K_Lock © (2006-07-14 00:34) [9]
> Vlad
Чет не катит;
Результат один и тот же. :-(
← →
K_Lock © (2006-07-14 01:14) [10]С эти разобрался, надо было сделать так:
procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
begin
with DBGridEh1.Canvas do
begin
Brush.Color := GetCellColor(ADOQuery1.fieldbyname("Время").AsDateTime, Brush.Color);
FillRect(Rect);
TextOut(Rect.Left + 2, Rect.Top + 2, Column.Field.Text);
end;
end;
Но появилась проблема. Некоторые строки выделяются не до конца, а только первые две ячейки. Только после того как пробежишь по ним курсором - все становится ОК...
Добавил Refresh после прорисовки - стал тормозить, даже с 10 записями...
Можно от этого избавиться???
← →
unknown © (2006-07-14 01:27) [11]
> K_Lock © (14.07.06 00:08) [7]
Строки... Хм. В [0] как-то незаметил даже...
> K_Lock © (14.07.06 01:14) [10]
> Добавил Refresh после прорисовки - стал тормозить, даже
> с 10 записями...
> Можно от этого избавиться???
Refresh чего после прорисовки? Датасета или грида?
В любом случае неправильно.
Вполне должно быть достаточно 1 раз в минуту перерисовывать грид и
(а оно надо? зачем?) обновлять датасет.
← →
K_Lock © (2006-07-14 01:38) [12]Refresh Датасета. Без обновления
> Некоторые строки выделяются не до конца, а только первые
> две ячейки. Только после того как пробежишь по ним курсором
> - все становится ОК...
И такой вопрос : не могу понять - DrawColumnCell вызывается автоматически. А как его заставить вызываться только по таймеру??
← →
unknown © (2006-07-14 01:44) [13]Завести глобальную переменную, например NeedRefresh:boolean;
В таймере сделать
begin
NeedRefresh:=true;
Grid.Refresh;
end;
и
procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
begin
if not NeedRefresh then exit;
...
end;
← →
K_Lock © (2006-07-14 01:50) [14]
> unknown спасибо.
А что все таки делать с частичной прорисовкой?
← →
K_Lock © (2006-07-14 02:05) [15]:-) Всем огромное спасибо.
Разобрался!!!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.017 c