Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.06;
Скачать: CL | DM;

Вниз

Выделение строк таблицы разным цветом по времени   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.034 c
15-1152699427
qwe777
2006-07-12 14:17
2006.08.06
Тока поступил и все говорят САБЖ. Что то такое?


2-1152790137
novill
2006-07-13 15:28
2006.08.06
Какой тип лучше использовать для небольших строк?


2-1153325727
!_SM_!
2006-07-19 20:15
2006.08.06
Типы в Dll


2-1153411217
Ivolg
2006-07-20 20:00
2006.08.06
Сообщение


2-1152823256
Footballer
2006-07-14 00:40
2006.08.06
И снова "открыть с помощью..."