Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1151396003
Nous Mellon_
2006-06-27 12:13
2006.08.06
О летнем отдыхе


9-1132400846
Timskiy
2005-11-19 14:47
2006.08.06
уменьшения образа DVD диска


15-1152691078
Еж
2006-07-12 11:57
2006.08.06
Умер основатель Pink Floyd Сид Баррет


15-1152498011
Мазут Береговой
2006-07-10 06:20
2006.08.06
Не были славяне безграмотными!


15-1150718022
pavel_guzhanov
2006-06-19 15:53
2006.08.06
Проблема при переходе с MSSQL2000 на MSSQL2005





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский