![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выделение строк таблицы разным цветом по времени [D7, XP]
K_Lock © (2006-07-13 18:18:00)Есть таблица, в каждой строке задано некоторое время {Time}, которое > текущего;
Нужно выделять строки разным цветом:
{Time} < 20 мин до текущего времени - синий;
{Time} < 15 мин до текущего времени - зеленый;
{Time} < 10 мин до текущего времени -красный;
-----------------------------
Каким образом лучше организовать такую проверку;
Если прописать ее в Таймере, не будет ли сильных тормозов при наличии большого числа записей? Может есть другой вариант?
K_Lock (2006-07-14 02:05:00) [1]:-) Всем огромное спасибо.
Разобрался!!!
K_Lock (2006-07-14 01:50:00) [2]
> unknownспасибо.
А что все таки делать с частичной прорисовкой?
unknown (2006-07-14 01:44:00) [3]Завести глобальную переменную, например 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:38:00) [4]Refresh Датасета. Без обновления
> Некоторые строки выделяются не до конца, а только первые
> две ячейки. Только после того как пробежишь по ним курсором
> - все становится ОК...
И такой вопрос : не могу понять - DrawColumnCellвызывается автоматически. А как его заставить вызываться только по таймеру??
unknown (2006-07-14 01:27:00) [5]
> 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:14:00) [6]С эти разобрался, надо было сделать так:
procedure TForm1.DBGridEh1 DrawColumnCell(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 записями...
Можно от этого избавиться???
K_Lock (2006-07-14 00:34:00) [7]
> Vlad
Чет не катит;
Результат один и тот же. :-(
Vlad (2006-07-14 00:14:00) [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:08:00) [9]Спасибо, все работает.
Только не могу разобраться КАК ВЫДЕЛИТЬ ВСЮ СТРОКУ, а не ячейку.
unknown (2006-07-13 19:06:00) [10]
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;
Плохиш (2006-07-13 18:54:00) [11]
> Каким образом лучше организовать такую проверку;
Ну про это уже сказали.
А перерисовку грида вызывай по таймеру раз в минуту.
K_Lock (2006-07-13 18:54:00) [12]DBGridEh
unknown (2006-07-13 18:51:00) [13]Как отрисовывать - зависит от типа грида, но в любом
случае в обработчике OnDraw***Cell
unknown (2006-07-13 18:46:00) [14]
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;
Vlad (2006-07-13 18:45:00) [15]
> K_Lock © (13.07.06 18:18)
Речь о DBGrid или о чем?