Главная страница
    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
3-1148966505
WG
2006-05-30 09:21
2006.08.06
SQL выборка из таблицы с датами последнего изменения


2-1152877100
learner
2006-07-14 15:38
2006.08.06
Установление коннекта между NamedPipe-ми по сети.


8-1139581971
sally
2006-02-10 17:32
2006.08.06
Сохранение картинки в XML файл


15-1152520236
iddddi
2006-07-10 12:30
2006.08.06
Рисование штрих-кода Code 128


5-1137497165
Anatoly_71
2006-01-17 14:26
2006.08.06
TDateTimePicker заставить выпасть календарь





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