Главная страница
    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.01 c
6-1143079681
vadim1
2006-03-23 05:08
2006.08.06
"Asynchronous socket error 10061".


15-1152129774
Имя не скажу
2006-07-06 00:02
2006.08.06
Проблема больших целых чисел


8-1139150998
guitarist
2006-02-05 17:49
2006.08.06
ScreenMate


2-1153123735
Leonid
2006-07-17 12:08
2006.08.06
Нужен компонент для отсылки e-mail


15-1152708886
NailMan
2006-07-12 16:54
2006.08.06
Никому работа не нужна? А то предлагают у нас...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский