Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выделение строк таблицы разным цветом по времени [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 или о чем?


Наверх

Титульная страница Поиск, карта сайта Написать письмо