Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.09.2010, 16:18
Marchelly Marchelly вне форума
Прохожий
 
Регистрация: 02.09.2010
Сообщения: 13
Репутация: 10
Вопрос Разноцветный dbgrid

Уважаемые форумчане, подскажите как сделать:

есть dbgrid в который выводится результат выполнения хп, он имеет следующий вид



характеристика |Значение| StrID(visible=false)
--------------------------------------------------------------------
Характеристика 1 | знач | 1
Характеристика 2 | знач | 1
Характеристика 3 | знач | 1
Характеристика 1 | знач | 4
Характеристика 2 | знач | 4
Характеристика 3 | знач | 4

итд

и таких наборов характеристик может быть много. Вопрос в следующем: как раскрасить строки dbgrid с одинаковыми значениями StrID, чтобы наборы характеристик визуально можно было различить, а то все на белом фоне - какая-то каша получается?

Последний раз редактировалось Marchelly, 02.09.2010 в 16:21.
Ответить с цитированием
  #2  
Старый 02.09.2010, 16:35
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Если значений StrId немного, то вот так (в DrawColumnCell грида):
Код:
if DBGrid1.datasource.dataset.fieldbyname('StrID').AsInteger= 1 then
 begin 
 DBGrid1.Canvas.Brush.Color := clRed;
 DBGrid1.Canvas.Font.Color := clYellow;
 end
 else
  begin
  DBGrid1.Canvas.Brush.Color := clYelow;
  DBGrid1.Canvas.Font.Color := clRed;
  end;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

DefaultDrawing=false у грида не забываем
Ответить с цитированием
  #3  
Старый 02.09.2010, 16:42
Marchelly Marchelly вне форума
Прохожий
 
Регистрация: 02.09.2010
Сообщения: 13
Репутация: 10
По умолчанию

значений - то не много, но они могут быть каждый раз разные, в том-то и дело, что с двумя значениями я понимаю как сделать а как с большим количеством не очень (((
как-то их надо из грида прочитать (заранее не известны значения StrID пока хп не выполнится) и сравнивать...
Ответить с цитированием
  #4  
Старый 02.09.2010, 17:08
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

ХЗ, первое что в голову идет- это делать distinct для StrID и написать функцию распределения цвета для каждого значения. Т.е. написать функцию соответствия значения int из StrId c цветом. Погугли как это сделать и будет счастье, а может кто- то тут уже знает ответ. ))
Ответить с цитированием
  #5  
Старый 02.09.2010, 19:54
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Marchelly, я бы сделал так:
Код:
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
begin
case DBGrid1.fieldbyname('StrID').AsInteger of 
1 :begin 
   DBGrid1.Canvas.Brush.Color := clRed;
   DBGrid1.Canvas.Font.Color := clYellow;
   end;
2 :begin
   еще какие-то цвета
   end;
и т.д.
else
  DBGrid1.Canvas.Brush.Color := clYelow;
  DBGrid1.Canvas.Font.Color := clRed;
end;
end;
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #6  
Старый 02.09.2010, 21:15
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,513
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Не, у тебя опять прибито гвоздями.
Надо делать через map.
Создаешь массив записей, куда прописываешь значение StrID и выбранные для этого значения цвета. И в окраске используешь. Для того, что бы не делать лишних запросов и телодвижений, массив можно сбрасывать в момент открытия основного запроса и заполнять по мере отрисовки. Теперь о том, как выбирать цвета. Опять же, можно сделать заранее (вообще при создании формы) некоторый массив (список) комбинаций цветов (текст и фон) и потом по очереди брать эти комбинации из него, а то Random'ом генерить может фигня получиться.
Хотя можно и Random'ом. Тогда, например, текст у нас будет всегда черный, а фон надо всегда генерить светлый, т.е. отдельно генерим составляющие RGB, причем так, что значение любой из низ должно быть > 200. Ну и еще можно при этом близкие цвета пропускать - далее уже навороты по вкусу.
Ответить с цитированием
  #7  
Старый 02.09.2010, 21:15
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,714
Репутация: 52347
По умолчанию

Да не надо ему много цветов, ему просто надо группы с разным значением аттрибута раскрасить в разные цвета.
Нет, так не пойдет. Количество атрибутов заранее неизвестно, к тому-же не факт что это будет число. Мне кажется надо просто завести глобальную переменную, и при несовпадении значения этой пременной и аттрибута менять цвет, присвоить пременной значение аттрибута. Все это проделывать в DrawDataCell.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 02.09.2010 в 21:17.
Ответить с цитированием
  #8  
Старый 02.09.2010, 21:30
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,513
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

в общем, ты прав, в прочем, как и я. только у него сортировка по одному полю, а раскрашивать надо другое. Так что мой метод правильный...
Ответить с цитированием
  #9  
Старый 03.09.2010, 10:43
Marchelly Marchelly вне форума
Прохожий
 
Регистрация: 02.09.2010
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Да не надо ему много цветов.

Правильно, хватит и двух всего, главное чтоб группы разделялись

Цитата:
Сообщение от Страдалецъ
не факт что это будет число.

Вот это факт StrID - всегда число у меня и никак иначе )

Цитата:
Сообщение от Страдалецъ
Мне кажется надо просто завести глобальную переменную, и при несовпадении значения этой пременной и аттрибута менять цвет, присвоить пременной значение аттрибута. Все это проделывать в DrawDataCell.

а вот здесь поподробней можно? (с примерчиком если не затруднит) - этот способ мне кажется самый оптимальный в данном случае, о чем-то наподобие думал, но вот как сделать туплю чет - никак не могу сообразить (

Последний раз редактировалось Marchelly, 03.09.2010 в 12:08.
Ответить с цитированием
  #10  
Старый 03.09.2010, 18:44
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,714
Репутация: 52347
По умолчанию

Ну вот примерно так:
Код:
procedure TForm3.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
begin
 if DBGrid1.DataSource.DataSet.FieldByName('Attribute').AsInteger <> Attribute
 then begin
      if BrushColor = clMoneyGreen
      then BrushColor := clSkyBlue
      else BrushColor := clMoneyGreen;
      Attribute := DBGrid1.DataSource.DataSet.FieldByName('Attribute').AsInteger;
      end;
 DBGrid1.Canvas.Brush.Color := BrushColor;
 DBGrid1.DefaultDrawDataCell(Rect, Field, State);
end;

procedure TForm3.FormActivate(Sender: TObject);
begin
 DBGrid1.Canvas.Font.Color := clBlack;
 BrushColor := clMoneyGreen;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 06.09.2010, 13:29
Marchelly Marchelly вне форума
Прохожий
 
Регистрация: 02.09.2010
Сообщения: 13
Репутация: 10
По умолчанию

Страдалец, еще одна проблемка возникла - не хочет работать метод OnDrawDataCell - ошибку все время выдает и пишет Undeclaired identifier: TField почему-то и показывает на строку объвления процедуры... ( как это исправить?

Последний раз редактировалось Marchelly, 06.09.2010 в 13:32.
Ответить с цитированием
  #12  
Старый 06.09.2010, 13:33
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,714
Репутация: 52347
По умолчанию

А вы точно в событие DrawDataCell код вставляете? У меня есть подозрение что оно для колонки.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 06.09.2010, 13:48
Marchelly Marchelly вне форума
Прохожий
 
Регистрация: 02.09.2010
Сообщения: 13
Репутация: 10
По умолчанию

Так... еще разок пожалуйста для особо продвинутых вроде меня =)

нажимаю в ObjectInspector вкладку events (выбран DbGrid), выбираю OnDrawDataCell, открывается код процедуры, но чтобы я не писал, даже строку с комментарием и никакого кода, delphi выдает ошибку.
Ответить с цитированием
  #14  
Старый 07.09.2010, 09:26
Marchelly Marchelly вне форума
Прохожий
 
Регистрация: 02.09.2010
Сообщения: 13
Репутация: 10
По умолчанию

Все, вроде заработало, думаю дальше разберусь )))

Последний раз редактировалось Marchelly, 07.09.2010 в 10:32.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter