|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Разноцветный 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
|
||||
|
||||
Если значений 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
|
|||
|
|||
значений - то не много, но они могут быть каждый раз разные, в том-то и дело, что с двумя значениями я понимаю как сделать а как с большим количеством не очень (((
как-то их надо из грида прочитать (заранее не известны значения StrID пока хп не выполнится) и сравнивать... |
#4
|
||||
|
||||
ХЗ, первое что в голову идет- это делать distinct для StrID и написать функцию распределения цвета для каждого значения. Т.е. написать функцию соответствия значения int из StrId c цветом. Погугли как это сделать и будет счастье, а может кто- то тут уже знает ответ. ))
|
#5
|
||||
|
||||
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
|
|||
|
|||
Не, у тебя опять прибито гвоздями.
Надо делать через map. Создаешь массив записей, куда прописываешь значение StrID и выбранные для этого значения цвета. И в окраске используешь. Для того, что бы не делать лишних запросов и телодвижений, массив можно сбрасывать в момент открытия основного запроса и заполнять по мере отрисовки. Теперь о том, как выбирать цвета. Опять же, можно сделать заранее (вообще при создании формы) некоторый массив (список) комбинаций цветов (текст и фон) и потом по очереди брать эти комбинации из него, а то Random'ом генерить может фигня получиться. Хотя можно и Random'ом. Тогда, например, текст у нас будет всегда черный, а фон надо всегда генерить светлый, т.е. отдельно генерим составляющие RGB, причем так, что значение любой из низ должно быть > 200. Ну и еще можно при этом близкие цвета пропускать - далее уже навороты по вкусу. |
#7
|
||||
|
||||
Да не надо ему много цветов, ему просто надо группы с разным значением аттрибута раскрасить в разные цвета.
Нет, так не пойдет. Количество атрибутов заранее неизвестно, к тому-же не факт что это будет число. Мне кажется надо просто завести глобальную переменную, и при несовпадении значения этой пременной и аттрибута менять цвет, присвоить пременной значение аттрибута. Все это проделывать в DrawDataCell. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 02.09.2010 в 21:17. |
#8
|
|||
|
|||
в общем, ты прав, в прочем, как и я. только у него сортировка по одному полю, а раскрашивать надо другое. Так что мой метод правильный...
|
#9
|
|||
|
|||
Цитата:
Правильно, хватит и двух всего, главное чтоб группы разделялись Цитата:
Вот это факт StrID - всегда число у меня и никак иначе ) Цитата:
а вот здесь поподробней можно? (с примерчиком если не затруднит) - этот способ мне кажется самый оптимальный в данном случае, о чем-то наподобие думал, но вот как сделать туплю чет - никак не могу сообразить ( Последний раз редактировалось Marchelly, 03.09.2010 в 12:08. |
#10
|
||||
|
||||
Ну вот примерно так:
Код:
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
|
|||
|
|||
Страдалец, еще одна проблемка возникла - не хочет работать метод OnDrawDataCell - ошибку все время выдает и пишет Undeclaired identifier: TField почему-то и показывает на строку объвления процедуры... ( как это исправить?
Последний раз редактировалось Marchelly, 06.09.2010 в 13:32. |
#12
|
||||
|
||||
А вы точно в событие DrawDataCell код вставляете? У меня есть подозрение что оно для колонки.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#13
|
|||
|
|||
Так... еще разок пожалуйста для особо продвинутых вроде меня =)
нажимаю в ObjectInspector вкладку events (выбран DbGrid), выбираю OnDrawDataCell, открывается код процедуры, но чтобы я не писал, даже строку с комментарием и никакого кода, delphi выдает ошибку. |
#14
|
|||
|
|||
Все, вроде заработало, думаю дальше разберусь )))
Последний раз редактировалось Marchelly, 07.09.2010 в 10:32. |