![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Уважаемые форумчане, подскажите как сделать:
есть 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; |
|
#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. |