Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Как раскрасить DBGrid по условию ?  [new]
Sensor230
Member

Откуда:
Сообщений: 12
На форме DBGrid, отображение четез DataSource1-ADOQuery1, в таблице есть два поля с датами (1-Дата создания заявки, 2- дата до которой заявка должна быть выполнена). Как мне раскрасить автоматически DBGrid по условию: ЕСЛИ (ДАТА2 -(Data(сейчас))<2 ТО СТРОЧКА ЖЕЛТАЯ, ЕСЛИ (ДАТА2 -(Data(сейчас))>5 ТО СТРОЧКА ЗЕЛЕНАЯ, ЕСЛИ (ДАТА2 -(Data(сейчас))<0 ТО СТРОЧКА КРАСНАЯ.
Что то типа напоминалки, только в DBGride и по цветам. Если до ококнчания срока выполнения заявки больше 5 дней заявка -зеленая, если меньше двух дней -заявка желтая, прозевал срок -заявка красная.
Спасибо! Вы крутые!!! )))
10 сен 18, 22:02    [21670327]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3651
Все примеры есть тут:
http://www.sql.ru/forum/158789/kak-mozhno-raskrasit-stroki-dbgrid-po-usloviu
10 сен 18, 22:06    [21670329]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
Спасибо! Я это видел и оно не совсем подходит. Разукрасить строчки в зависимости от того, что написано в ячейке вопросов не вызывает. Мозги кипят, а вот как разрисовать не по данным в записи, а по результатам манипуляций этими данными - не складывается.
10 сен 18, 22:18    [21670335]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3651
Sensor230,

Так же, как и написано в условии:
d1, d2: TDate;

d1 := dataset.FieldValues['date1'];
d2 := dataset.FieldValues['date2'];

if (d2 - d1 > 5) then
begin
...
end
10 сен 18, 22:34    [21670347]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
JaDi, что не так? пару раз коряво, но запустилось, а теперь вылетает при присвоении значения переменной d2.

procedure TForm2.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var d1, d2: TDateTime;
begin
if (ADOQuery1.FieldByName('Статус').AsString ='В работе') then begin
 DBGrid1.Canvas.Brush.Color:=clLime;
  DBGrid1.Canvas.FillRect(rect);
  DBGrid1.Canvas.TextOut(Rect.Left,Rect.Top,Column.Field.AsString);
end;
if (ADOQuery1.FieldByName('Статус').AsString ='В очередь') then begin
  DBGrid1.Canvas.Brush.Color:=clSilver;
  DBGrid1.Canvas.FillRect(rect);
  DBGrid1.Canvas.TextOut(Rect.Left,Rect.Top,Column.Field.AsString);
end;
Label39.Caption := IntToStr(ADOQuery1.RecordCount);
d1 := Date();
d2:=ADOQuery1.FieldValues ['Дата'];
if ((d2 - d1) > 5) then begin
DBGrid1.Canvas.Brush.Color:=clRed;
DBGrid1.Canvas.FillRect(rect);
10 сен 18, 23:42    [21670382]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3651
Sensor230,

ошибку надо сюда копипастить... Возможно, речь о том, что в поле с датой не везде заполнено, тогда перед присвоением надо проверять значение на Null.
11 сен 18, 00:05    [21670385]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Gator
Member

Откуда: Москва
Сообщений: 13866
Из старья 12391453
Gator
НеОбычный TDBGrid
Grid с человеческим лицом
Разноцветный D B G R I D
По следам «полосатого DBGrid»
и до кучи DrawText
11 сен 18, 01:31    [21670401]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
JaDi, Точно!!! Поле с датой выполнения добавлено позже к рабочей БД и на ранних заявлениях поля пустые , ща буду пробывать. JaDi, спасибо!!! Не знаю кто ты, но ты крут!!! ))))
11 сен 18, 20:34    [21671463]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
Gator, Большое спасибо, есть много чего вытащить из не ломая голову и экономя время.
11 сен 18, 20:35    [21671466]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
JaDi,
Что то не клеиться скриншот с ошибкой

К сообщению приложен файл. Размер - 44Kb
11 сен 18, 20:44    [21671478]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3651
Sensor230,

ошибка в том, что в поле пустое значение (null -- незаполнено). Прежде, чем получать его значение, надо проверь на <> Null -- как писал выше.
11 сен 18, 20:59    [21671495]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
DimaBr
Member

Откуда:
Сообщений: 10651
procedure TForm2.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var d1, d2: Variant;
    S: string;
begin
  S := ADOQuery1['Статус'];
  if S = 'В работе' then DBGrid1.Canvas.Brush.Color:=clLime else
  if S = 'В очередь' then DBGrid1.Canvas.Brush.Color:=clSilver;
  DBGrid1.Canvas.FillRect(Rect);
  DBGrid1.Canvas.TextOut(Rect.Left,Rect.Top,Column.Field.AsString);
  d1 := Date();
  d2 := ADOQuery1['Дата'];
  if VarIsNull(d2) then Exit;
  if (d2 - d1) > 5 then DBGrid1.Canvas.Brush.Color:=clGreen else
    if (d2 - d1) < 2 then DBGrid1.Canvas.Brush.Color:=clYellow else
    if (d2 - d1) < 0 then DBGrid1.Canvas.Brush.Color:=clRed;
  DBGrid1.Canvas.FillRect(rect);
end;
11 сен 18, 21:30    [21671524]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
Новые записи автоматически заполняют это поле, а к старым или вручную допишу или удалю их совсем -это что касаемо ошибки. Попробовал так: Очистил всю БД и создал 2 заявки с разными сроками, ошибка как ты и сказал исчезла, но получается что то не то от слова совсем... Красит или весь DBGrid или ни чего, при чем граница разделения по "0".
и еще если вывести результат в d2-d1 в лейбл или DateTimePicker для кoнтроля= хрень какая то получается... Пробывал
11 сен 18, 21:42    [21671537]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
DimaBr, Спасибо за готовый код, вот посидишь тут, а потом ложишься спать и пол ночи уснуть не можешь потому, что чуствуешь себя полным лошарой среди профи ))))). Твой код красит весь грид в желтый цвет в не зависимости от разницы дат то ли 1 день, то ли 100 то ли просрочено.
11 сен 18, 21:55    [21671547]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 53452
Блог
JaDi
Прежде, чем получать его значение, надо проверь на <> Null -- как писал выше.

На <> Null не стоит проверять ничто и никогда

DimaBr
  if (d2 - d1) > 5 then DBGrid1.Canvas.Brush.Color:=clGreen else
    if (d2 - d1) < 2 then DBGrid1.Canvas.Brush.Color:=clYellow else
    if (d2 - d1) < 0 then DBGrid1.Canvas.Brush.Color:=clRed;

Из всего написанного мне наиболее интересно, как Вы сконструируете тестовый пример, в котором будет задействован clRed.
12 сен 18, 00:30    [21671628]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59003
softwarer> как Вы сконструируете тестовый пример, в котором будет задействован clRed.

Да, смешной косяк. :) Хотя на самом деле достаточно поменять местами два последних if-a.

Posted via ActualForum NNTP Server 1.5

12 сен 18, 09:06    [21671737]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 53452
Блог
Гаджимурадов Рустам
Хотя на самом деле достаточно поменять местами два последних if-a.

Это не уберёт вопроса "что будет при d2 = 5, d1 = 2" и ряда других к этому коду. Я бы сказал, что это пример спагетти, только не в коде, а в мыслях в тот момент, когда рождался этот код.
12 сен 18, 11:38    [21671894]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
DimaBr
Member

Откуда:
Сообщений: 10651
Всё согласно тех заданию
автор
ЕСЛИ (ДАТА2 -(Data(сейчас))<2 ТО СТРОЧКА ЖЕЛТАЯ, ЕСЛИ (ДАТА2 -(Data(сейчас))>5 ТО СТРОЧКА ЗЕЛЕНАЯ, ЕСЛИ (ДАТА2 -(Data(сейчас))<0 ТО СТРОЧКА КРАСНАЯ.
12 сен 18, 12:40    [21671990]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59003
softwarer> Это не уберёт вопроса "что будет при d2 = 5, d1 = 2" и ряда других к этому коду.

На этот счёт в ПЗ/ТЗ ничего не сказано. :) Так что вопросы
(уточнения) должны быть не к коду, а ещё до его появления.

Posted via ActualForum NNTP Server 1.5

12 сен 18, 13:28    [21672081]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 53452
Блог
Гаджимурадов Рустам
На этот счёт в ПЗ/ТЗ ничего не сказано. :) Так что вопросы (уточнения) должны быть не к коду, а ещё до его появления.

Безусловно. Тот, кто кодирует, должен был бы остановиться и задать эти вопросы постановщику. Чего мы не увидели.

Вы, конечно, можете спросить, почему я прицепился именно к коду, а не к исходной реплике. Отвечу: потому что спрашивающий имеет моральное право не знать/не уметь, а вот к отвечающему требования, имхо, выше. Дать плохой ответ - хуже, чем не дать никакого. Поэтому я счёл целесообразным привлечь внимание к вопросу именно таким образом.
12 сен 18, 13:35    [21672094]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
DimaBr
Member

Откуда:
Сообщений: 10651
Sensor230
А мне видимо так и придется ходить с нераскрашеным гридом (вернее раскрашенным по статике ячеек, а не как хотелось).

Кто мешает раскрасить как хотелось ?
12 сен 18, 14:54    [21672272]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Sensor230
Member

Откуда:
Сообщений: 12
DimaBr,
Отсутствие опыта... Да, точно нашел нужное оправдание )))), надо теперь в диаппазоны лезть, а то так получается что например 1 и меньше 5 и меньше 2, и еще результат вычитания дат представляется числовым эквивалентом почемуто,.. Но я над этим работаю ))))
12 сен 18, 16:13    [21672417]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Gator
Member

Откуда: Москва
Сообщений: 13866
Sensor230, перпиши ИФы на КЕЙС - нагляднее будет
case (D2-D1) of
  > 5: curColor := clGreen;
  < 0: curColor := clRed;
  < 2: curColor := clYellow // just one & zero;
  else curColor := clCyan;
end;
DBGrid1.Canvas.Brush.Color := curColor; 
13 сен 18, 03:29    [21672981]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
zinpub
Member

Откуда:
Сообщений: 214
Gator
Sensor230, перпиши ИФы на КЕЙС - нагляднее будет
case (D2-D1) of
  > 5: curColor := clGreen;
  < 0: curColor := clRed;
  < 2: curColor := clYellow // just one & zero;
  else curColor := clCyan;
end;
DBGrid1.Canvas.Brush.Color := curColor; 


В case нельзя задавать условия, тем более пересекающиеся...
13 сен 18, 08:26    [21673046]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Gator
Member

Откуда: Москва
Сообщений: 13866
zinpub,
напиши диапазоны, делов-то...
13 сен 18, 14:59    [21673680]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Sensor230
Member

Откуда:
Сообщений: 12
Может я чего не правильно сказал или неправильно был понят, но раз тема не закрывается попробую еще раз написать "хотелки" (хотелки - не могут быть ТЗ, т.к. ТЗ для программистов должно писаться программистом).
Так вот...
ДАНО:
Сетевой диск, на нем БД MS Access, несколько компов привязаны к ней ADOConneck+ADOQuery, Кто то из пользователей создает задачу/заявку, которая добавляется в таблицу и видна всем другим. При создании, в зависимости от категории создаваемой задачи, при помощи incDay(ДатаСоздания, +Х) устанавливается срок "+Х" до которого создаваемая задача должна быть выполнена/решена. Дата создания и дата выполнения записаны в таблицу. Для понтов таблица раскрашивается пастэльными тонами в зависимости от категории (жалобы-синие, благодарности - зеленые и т.д.)
НУНО (хотца):
Чтоб строки в таблице окаршивались как и было, но за 5 дней до истечения срока выполнения становились желтыми , за 3 для до окончания срока оранжевыми, а за 1 день или при просрочке - красными.

Вот как то так.
13 сен 18, 21:01    [21674194]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59003
1. Топики не закрываются без необходимости (нарушения правил и пр.).
Получение автором кода/ответа на вопрос необходимостью не является.

2. Воздержитесь от коверкания, пожалуйста.

Posted via ActualForum NNTP Server 1.5

13 сен 18, 21:10    [21674200]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Это же так просто
Guest
Sensor230
Чтоб строки в таблице окаршивались как и было, но за 5 дней до истечения срока выполнения становились желтыми , за 3 для до окончания срока оранжевыми, а за 1 день или при просрочке - красными.

S := ADOQuery1['Статус'];
with DBGrid1.Canvas.Brush do
  if (d2 - d1) < 1 then Color:=clRed else // за 1 день и просроченные
  if (d2 - d1) < 3 then Color:=clOrange else // за 3 дня
  if (d2 - d1) < 5 then Color:=clYellow else // за 5 дней
// раскраска по категориям
  if S = 'В работе' then Color:=clLime else
  if S = 'В очередь' then Color:=clSilver else Color := clWhite;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.TextOut(Rect.Left,Rect.Top,Column.Field.AsString);
13 сен 18, 22:04    [21674229]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Sensor230
Member

Откуда:
Сообщений: 12
Это же так просто, Почему то красит всю таблицу в один цвет. Что за один день до окончания срока, что за месяц, полностью вся таблица красная. Может у меня что в настройках не так? и так работают все предложенные варианты. Разноцвета не получается...
13 сен 18, 22:41    [21674260]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Это же так просто
Guest
Sensor230
Это же так просто, Почему то красит всю таблицу в один цвет. Что за один день до окончания срока, что за месяц, полностью вся таблица красная. Может у меня что в настройках не так? и так работают все предложенные варианты. Разноцвета не получается...

Значит d1 и d2 перепутаны
13 сен 18, 22:44    [21674266]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Sensor230
Member

Откуда:
Сообщений: 12
Это же так просто
Sensor230
Это же так просто, Почему то красит всю таблицу в один цвет. Что за один день до окончания срока, что за месяц, полностью вся таблица красная. Может у меня что в настройках не так? и так работают все предложенные варианты. Разноцвета не получается...

Значит d1 и d2 перепутаны


"Значит d1 и d2 перепутаны" - вот так просто раз и все!!!
Будешь в Ногинске позвони! С меня рюмка чаю! Оказалось (замыленная) проблема в том, что d1:=(Сегодня), а d2 вместо (СрокИсполнения) присваивалось (Дата) что одно и тоже с разницей в несколько секунд, в итоге получалось что всегда d1-d2=всегда чуть меньше "0".
УРА!!! УРА!!! УРА!!! Теперь буду раскрашеным гридом всем в глазах рябить)))))

кстати а оренжевого цвета в палитре нет ))))
13 сен 18, 23:16    [21674279]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Gator
Member

Откуда: Москва
Сообщений: 13866
Sensor230,

ты невнятно задаешь вопрос, требуешь float и сравниваешь с целым...
и кстати, в " палитре" ЕСТЬ все цвета. Учись
13 сен 18, 23:30    [21674282]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
zinpub
Member

Откуда:
Сообщений: 214
Sensor230

кстати а оренжевого цвета в палитре нет ))))


function GetMixColor(c1, c2: TColor): TColor;
begin
  Result := RGB(
    (GetRValue(c1) + GetRValue(c2)) div 2,
    (GetGValue(c1) + GetGValue(c2)) div 2,
    (GetBValue(c1) + GetBValue(c2)) div 2
    );
end;

GetMixColor(clRed, clYellow);



:-)
14 сен 18, 08:46    [21674344]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить