powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как раскрасить DBGrid по условию ?
33 сообщений из 33, показаны все 2 страниц
Как раскрасить DBGrid по условию ?
    #39700665
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На форме DBGrid, отображение четез DataSource1-ADOQuery1, в таблице есть два поля с датами (1-Дата создания заявки, 2- дата до которой заявка должна быть выполнена). Как мне раскрасить автоматически DBGrid по условию: ЕСЛИ (ДАТА2 -(Data(сейчас))<2 ТО СТРОЧКА ЖЕЛТАЯ, ЕСЛИ (ДАТА2 -(Data(сейчас))>5 ТО СТРОЧКА ЗЕЛЕНАЯ, ЕСЛИ (ДАТА2 -(Data(сейчас))<0 ТО СТРОЧКА КРАСНАЯ.
Что то типа напоминалки, только в DBGride и по цветам. Если до ококнчания срока выполнения заявки больше 5 дней заявка -зеленая, если меньше двух дней -заявка желтая, прозевал срок -заявка красная.
Спасибо! Вы крутые!!! )))
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39700667
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39700670
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Я это видел и оно не совсем подходит. Разукрасить строчки в зависимости от того, что написано в ячейке вопросов не вызывает. Мозги кипят, а вот как разрисовать не по данным в записи, а по результатам манипуляций этими данными - не складывается.
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39700675
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sensor230,

Так же, как и написано в условии:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
d1, d2: TDate;

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

if (d2 - d1 > 5) then
begin
...
end
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39700678
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDi, что не так? пару раз коряво, но запустилось, а теперь вылетает при присвоении значения переменной d2.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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);
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39700680
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sensor230,

ошибку надо сюда копипастить... Возможно, речь о том, что в поле с датой не везде заполнено, тогда перед присвоением надо проверять значение на Null.
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39700684
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701108
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDi , Точно!!! Поле с датой выполнения добавлено позже к рабочей БД и на ранних заявлениях поля пустые , ща буду пробывать. JaDi , спасибо!!! Не знаю кто ты, но ты крут!!! ))))
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701109
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gator, Большое спасибо, есть много чего вытащить из не ломая голову и экономя время.
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701118
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDi,
Что то не клеиться скриншот с ошибкой
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701126
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sensor230,

ошибка в том, что в поле пустое значение (null -- незаполнено). Прежде, чем получать его значение, надо проверь на <> Null -- как писал выше.
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701140
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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;
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701146
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новые записи автоматически заполняют это поле, а к старым или вручную допишу или удалю их совсем -это что касаемо ошибки. Попробовал так: Очистил всю БД и создал 2 заявки с разными сроками, ошибка как ты и сказал исчезла, но получается что то не то от слова совсем... Красит или весь DBGrid или ни чего, при чем граница разделения по "0".
и еще если вывести результат в d2-d1 в лейбл или DateTimePicker для кoнтроля= хрень какая то получается... Пробывал
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701149
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr , Спасибо за готовый код, вот посидишь тут, а потом ложишься спать и пол ночи уснуть не можешь потому, что чуствуешь себя полным лошарой среди профи ))))). Твой код красит весь грид в желтый цвет в не зависимости от разницы дат то ли 1 день, то ли 100 то ли просрочено.
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701172
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiПрежде, чем получать его значение, надо проверь на <> Null -- как писал выше.
На <> Null не стоит проверять ничто и никогда

DimaBr
Код: pascal
1.
2.
3.
  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.
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701249
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer> как Вы сконструируете тестовый пример, в котором будет задействован clRed.

Да, смешной косяк. :) Хотя на самом деле достаточно поменять местами два последних if-a.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701352
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамХотя на самом деле достаточно поменять местами два последних if-a.
Это не уберёт вопроса "что будет при d2 = 5, d1 = 2" и ряда других к этому коду. Я бы сказал, что это пример спагетти, только не в коде, а в мыслях в тот момент, когда рождался этот код.
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701400
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё согласно тех заданию
авторЕСЛИ (ДАТА2 -(Data(сейчас))<2 ТО СТРОЧКА ЖЕЛТАЯ, ЕСЛИ (ДАТА2 -(Data(сейчас))>5 ТО СТРОЧКА ЗЕЛЕНАЯ, ЕСЛИ (ДАТА2 -(Data(сейчас))<0 ТО СТРОЧКА КРАСНАЯ.
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701436
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer> Это не уберёт вопроса "что будет при d2 = 5, d1 = 2" и ряда других к этому коду.

На этот счёт в ПЗ/ТЗ ничего не сказано. :) Так что вопросы
(уточнения) должны быть не к коду, а ещё до его появления.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701440
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНа этот счёт в ПЗ/ТЗ ничего не сказано. :) Так что вопросы (уточнения) должны быть не к коду, а ещё до его появления.
Безусловно. Тот, кто кодирует, должен был бы остановиться и задать эти вопросы постановщику. Чего мы не увидели.

Вы, конечно, можете спросить, почему я прицепился именно к коду, а не к исходной реплике. Отвечу: потому что спрашивающий имеет моральное право не знать/не уметь, а вот к отвечающему требования, имхо, выше. Дать плохой ответ - хуже, чем не дать никакого. Поэтому я счёл целесообразным привлечь внимание к вопросу именно таким образом.
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701525
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sensor230А мне видимо так и придется ходить с нераскрашеным гридом (вернее раскрашенным по статике ячеек, а не как хотелось).
Кто мешает раскрасить как хотелось ?
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701600
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr,
Отсутствие опыта... Да, точно нашел нужное оправдание )))), надо теперь в диаппазоны лезть, а то так получается что например 1 и меньше 5 и меньше 2, и еще результат вычитания дат представляется числовым эквивалентом почемуто,.. Но я над этим работаю ))))
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701780
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sensor230, перпиши ИФы на КЕЙС - нагляднее будет
Код: pascal
1.
2.
3.
4.
5.
6.
7.
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; 
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39701822
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GatorSensor230, перпиши ИФы на КЕЙС - нагляднее будет
Код: pascal
1.
2.
3.
4.
5.
6.
7.
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 нельзя задавать условия, тем более пересекающиеся...
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39702156
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpub,
напиши диапазоны, делов-то...
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39702335
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может я чего не правильно сказал или неправильно был понят, но раз тема не закрывается попробую еще раз написать "хотелки" (хотелки - не могут быть ТЗ, т.к. ТЗ для программистов должно писаться программистом).
Так вот...
ДАНО:
Сетевой диск, на нем БД MS Access, несколько компов привязаны к ней ADOConneck+ADOQuery, Кто то из пользователей создает задачу/заявку, которая добавляется в таблицу и видна всем другим. При создании, в зависимости от категории создаваемой задачи, при помощи incDay(ДатаСоздания, +Х) устанавливается срок "+Х" до которого создаваемая задача должна быть выполнена/решена. Дата создания и дата выполнения записаны в таблицу. Для понтов таблица раскрашивается пастэльными тонами в зависимости от категории (жалобы-синие, благодарности - зеленые и т.д.)
НУНО (хотца):
Чтоб строки в таблице окаршивались как и было, но за 5 дней до истечения срока выполнения становились желтыми , за 3 для до окончания срока оранжевыми, а за 1 день или при просрочке - красными.

Вот как то так.
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39702337
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Топики не закрываются без необходимости (нарушения правил и пр.).
Получение автором кода/ответа на вопрос необходимостью не является.

2. Воздержитесь от коверкания, пожалуйста.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39702349
Sensor230Чтоб строки в таблице окаршивались как и было, но за 5 дней до истечения срока выполнения становились желтыми , за 3 для до окончания срока оранжевыми, а за 1 день или при просрочке - красными.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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);
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39702356
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это же так просто, Почему то красит всю таблицу в один цвет. Что за один день до окончания срока, что за месяц, полностью вся таблица красная. Может у меня что в настройках не так? и так работают все предложенные варианты. Разноцвета не получается...
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39702358
Sensor230Это же так просто, Почему то красит всю таблицу в один цвет. Что за один день до окончания срока, что за месяц, полностью вся таблица красная. Может у меня что в настройках не так? и так работают все предложенные варианты. Разноцвета не получается...
Значит d1 и d2 перепутаны
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39702363
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это же так простоSensor230Это же так просто, Почему то красит всю таблицу в один цвет. Что за один день до окончания срока, что за месяц, полностью вся таблица красная. Может у меня что в настройках не так? и так работают все предложенные варианты. Разноцвета не получается...
Значит d1 и d2 перепутаны

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

кстати а оренжевого цвета в палитре нет ))))
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39702366
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sensor230,

ты невнятно задаешь вопрос, требуешь float и сравниваешь с целым...
и кстати, в " палитре" ЕСТЬ все цвета. Учись
...
Рейтинг: 0 / 0
Как раскрасить DBGrid по условию ?
    #39702404
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sensor230
кстати а оренжевого цвета в палитре нет ))))

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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);




:-)
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как раскрасить DBGrid по условию ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]