Форум: "Базы";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];
ВнизЦветовое выделение групп записей в DBGrid Найти похожие ветки
← →
Nika (2009-02-22 21:23) [0]И снова полосатый DBGrid. Есть таблица в БД Access, читаем ADO выводим в Grid. Таблица отсортирована по полю х. В разных записях в поле х встречаются одинаковые значения. Для удобства анализа данных необходимо вделить группы с одинаковыми значениями х (полосатый Grid), число записей в группе от 1 до n. Реализовано:
sRec : string;
b : boolean;
procedure TForm1.MyGrid1DrawColumnCell ...
begin
if sRec <> Q1.FieldByName("NDoc").AsString then begin
sRec := Q1.FieldByName("NDoc").AsString;
b := not b;
end;
if b then
MyGrid1.Canvas.Brush.Color := clInfoBk
else
MyGrid1.Canvas.Brush.Color := $00FDF8DB;
end;
...
При первичном выводе Grida на экран все хорошо раскраска верная. Если последовательно перемещятся по записям тоже все хорошо. Если прыгать по записям мышкой, цветовые группы изменяются (запись на которую перемещен указатель меняет цвет).
Есть идеи как реализовать такую задачу, только средствами Grida, без предварительной обработки таблицы с дополнительным служебным полем ???
Спасибо.
← →
Johnmen © (2009-02-22 21:42) [1]Какую задачу?
← →
Nika (2009-02-22 22:12) [2]Цветовое выделение групп записей должно быть стабильным и не должно изменяться при перемещении по записям.
← →
Johnmen © (2009-02-22 22:26) [3]Оно такое и есть, если применять корректно знания статьи "полосатый грид" на дельфикингдом.
← →
Плохиш © (2009-02-23 11:03) [4]
> b : boolean;
>
> procedure TForm1.MyGrid1DrawColumnCell ...
> begin
>
> if sRec <> Q1.FieldByName("NDoc").AsString then begin
> sRec := Q1.FieldByName("NDoc").AsString;
> b := not b;
> end;
Что за чушь?
← →
MsGuns © (2009-02-23 13:09) [5]Весь код в обработчике прорисовки - сплошная чушь
← →
Nika (2009-02-23 20:26) [6]Спасибо за идеи. Наверно я не достаточно понятно сформулировал вопрос. С вашего позволения, попробую еще раз. Для тех кто захочет отправить к первоисточникам, есть прекрасная статья http://www.delphikingdom.com/asp/viewitem.asp?catalogid=168 (Разноцветный D B G R I D).
И так. Есть таблица с набором данных, и полем ‘Х’. По полю ‘X’ набор отсортирован. В колонке ‘X’ будут данные, например:
Поле X ... Поле N
1 ... ...
1 ... ...
1 ... ...
2 ... ...
2 ... ...
3 ... ...
3 ... ...
... ... ...
40 ... ...
40 ... ...
40 ... ...
40 ... ...
... ... ...
Таким образом получаем группы одинаковых записей по полю "Х" c 1, с 2, с 3 и т.д. Кол-во записей в группе может меняться.
Необходимо в DBGrid подсветить записи группы. Например: 1 – на сером фоне, 2 – на желтом, 3 – на сером и т.д. не используя дополнительные (служебные) поля в таблице.
← →
MsGuns © (2009-02-23 21:31) [7]Уж тыщу раз твердили миру..
Да совершенно фиолетово как они там посортированы, идея подсветки "по значению" бредова изначально, ибо каким образом определять цвета для НЕИЗВЕСТНОГО количества "групп" ?
Само же выделение реализуется элементарно и об этом здесь уже писано-переписано. Но это если просто "выделено"("выбрано") - "не выделено" ("не выбрано")
То, что Вы пытаетесь выделить цветом, по всей вероятности, решается "группами", т.е. в БД надо добавить такую сущность, - группы, каждый объект засунуть в определенную группу и показывать все иерархически (в виде дерева или сгруппированного справочника как в 1С)
Группы могут сами быть в иерархии, т.е. входить в другие, более крупные группы. Короче, смортите как это сделано в проф.выполненных приложениях
← →
Johnmen © (2009-02-24 09:29) [8]
> Nika (23.02.09 20:26) [6]
Ну и в чём проблема? В написании case?
case <Поле X>.AsInteger of
1 : <цвет фона серый>;
2 : <цвет фона желтый>;
3 : <цвет фона серый>;
...
else
<цвет фона хрен знает какой>;
end;
← →
Плохиш © (2009-02-24 11:13) [9]
> Nika (23.02.09 20:26) [6]
>
> Спасибо за идеи. Наверно я не достаточно понятно сформулировал
> вопрос. С вашего позволения, попробую еще раз. Для тех кто
> захочет отправить к первоисточникам, есть прекрасная статья
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=168
> (Разноцветный D B G R I D).
Советую перечитывать приведённую статью до просвещения. Там всё написано.
← →
Nika (2009-02-24 19:36) [10]Спасибо за внимание. Доброго времени суток. Хотелось бы пообщаться с MsGuns, остальные такое ощущение просто не читают вопрос.
И так, было 2 комментария:
>> Весь код в обработчике прорисовки - сплошная чушь
>> Уж тыщу раз твердили миру..
>> Да совершенно фиолетово как они там посортированы, идея подсветки "по значению" >> бредова изначально, ибо каким образом определять цвета для НЕИЗВЕСТНОГО количества "групп" ?
Для удобочитаемости достаточно ДВА цвета.
Посмотрим на код (кстати я писал в самом начале что он работает):
Глобальные переменные (можно другие, но это не обсуждаем), при инициализации в них что ни будь, нам не важно.
s : string;
b : boolean;
Есть набор данных (Q1) c отсортированным полем ‘X’ (отсортированным это важно, здесь и есть группы, еще раз группа – это записи с одинаковыми значениями в поле ‘X’) .
Смотрим на процедуру прорисовки, предварительно вспоминаем, что Grid прорисовывает набор данных построчно по записям
procedure TForm1.GridDrawColumnCell ...
begin
При первом вхождении мы провалимся внутрь условия произойдет инициализация s и b, соответственно строки группы будут подсвечиваться единым фоном, пока не изменится значение X, при изменении значения произойдет и изменение фона подсветки и т. д.
if s <> Q1.FieldByName("X").AsString then begin
s := Q1.FieldByName("X").AsString;
b := not b;
end;
if b then
Grid.Canvas.Brush.Color := clInfoBk
else
Grid.Canvas.Brush.Color := $00FDF8DB;
end;
...
Дабы не терять выделение групп при перемещении по записям в обработчик Q1AfterScroll вставляем Grid.Refresh и получаем то, что хотим (за одним исключением, но об этом позже).
Для проверки данного алгоритма необходимо не более 10 минут. Попробуйте, если не влом. Если влом закрываем тему.
← →
sniknik © (2009-02-24 21:32) [11]> Для проверки данного алгоритма необходимо не более 10 минут.
и без проверки видно, что алгоритм "кривой", т.к. в основе лежит заблуждение о срабатывании событий отрисовки записей строго последовательно, что не так.
← →
MsGuns © (2009-02-24 23:36) [12]>Nika (24.02.09 19:36) [10]
>Для удобочитаемости достаточно ДВА цвета.
С какого бодуна два ? А если "групп" будет 3 ? Или 4 ?. Т.е. сегодня их две и все пушисто-розово (или колюче-сиренево), а завтра появится третья, то приложение - в капремонт ?
>Посмотрим на код (кстати я писал в самом начале что он работает):
Ну посмотрим и что ? С первых же фраз становится ясно следующее:
1) Привязка АЛГОРИТМА к КОНКРЕТНЫМ данным, т.е. некая отсортированность (упорядоченность) внешних данных.
Ошибка концептуальная. Чтоб Вам было понятнее, это все равно, что делать табуретку с ножками разной длины потому что пол в комнате неровный. В одном месте одной комнаты табуретка будет стоять ровно, при прочих условиях сидеть на ней без риска покалечиться будет нельзя
2) У Вас очень смутное представление о том, что, как, и главное КОГДА "прорисовывается" в событии OnColumnDrawCell
3) У Вас неверен сам подход, в котором Вы обращаетесь не к записи, соответствующей ПРОРИСОВЫВАЕМОЙ строке грида, а к ТЕКУЩЕЙ записи датасета.
4) Метода Refresh у грида нет, никогда не было и не может быть в принципе, если это, конечно, не какой-нибудь Ух-и-Ах-грид!!! Следовательно, вызвать Вы его не можете, а если Вы имеете в виду метод Update (Invalidate), "заставляющий" сетку перерисоваться, то, к Вашему сведению, не всегда грид "соглашается" на перерисовку.
Короче, Вам совершенно правильно посоветовали внимательно исследовать статью про тигровый грид - вот и займитесь этим
ЗЫ. Если Вы полагаете, что тут кто-то будет проверять что-то писанное Вами, то это заблуждение. Во-первых, потому что людям есть чем еще заняться, а во-вторых тут и проверять нечего - ясно, что Ваша "технология" ошибочна в корне и работать правильно никогда не будет
← →
Германн © (2009-02-25 01:40) [13]
> MsGuns © (24.02.09 23:36) [12]
>
> >Nika (24.02.09 19:36) [10]
> >Для удобочитаемости достаточно ДВА цвета.
>
> С какого бодуна два ? А если "групп" будет 3 ? Или 4 ?.
> Т.е. сегодня их две и все пушисто-розово (или колюче-сиренево),
> а завтра появится третья, то приложение - в капремонт ?
>
>
Автору достаточно два.
Чередование групп, каждая отличается цветом от предыдущей и от последующей.
← →
MsGuns © (2009-02-25 07:58) [14]>Германн © (25.02.09 01:40) [13]
>Автору достаточно два.
Точна ! Невнимательно читал Nika (23.02.09 20:26) [6]
;)
← →
Плохиш © (2009-02-25 10:58) [15]
> Глобальные переменные (можно другие, но это не обсуждаем),
> при инициализации в них что ни будь, нам не важно.
> s : string;
> b : boolean;
>
Глобальные переменные в событии отрисовки?
Дальше этот бред даже читать смысла нет...
← →
Сергей М. © (2009-02-25 16:27) [16]
> Nika (23.02.09 20:26) [6]
> В колонке ‘X’ будут данные, например
Если упорядоченная последовательность целочисленных значений в поле X гарантированно непрерывна, то задача а-ля "каким цветом раскрасить группу" решается до смешного просто:
if Odd(X) then
КрасимВЗеленыйВКрапинку
else
КрасимВЦветДетскойНеожиданности
← →
Johnmen © (2009-02-25 16:50) [17]
> Сергей М. © (25.02.09 16:27) [16]
А так:
1
3
5
...
:)
← →
Сергей М. © (2009-02-25 20:02) [18]
> Johnmen © (25.02.09 16:50) [17]
А тут "дырки")
Под определение непрерывной посл-ти натур.чисел явно не попадает)
← →
Германн © (2009-02-26 00:45) [19]
> Сергей М. © (25.02.09 20:02) [18]
> > Johnmen © (25.02.09 16:50) [17]
> А тут "дырки")
Ага! Вот Johnmen и прокололся!
А ведь он был таким ярым противником "наличия дырок" в БД. :)
А вообще задача интересная. И далеко не такая бессмысленная, как большинство вопросов по "раскраске" таблиц, списков и т.п.
Но, имхо, нормальное решение его вряд ли возможно.
← →
AndreyV © (2009-02-26 08:12) [20]> [19] Германн © (26.02.09 00:45)
> Ага! Вот Johnmen и прокололся!
> А ведь он был таким ярым противником "наличия дырок" в БД.:)
Не наличия, а поиска и заполнения "дырок".:)
← →
MsGuns © (2009-02-26 09:03) [21]>Германн © (26.02.09 00:45) [19]
>А вообще задача интересная. И далеко не такая бессмысленная, как большинство вопросов по >"раскраске" таблиц, списков и т.п.
Пожалуй, да
>Но, имхо, нормальное решение его вряд ли возможно.
DataLink ?
← →
AndreyV © (2009-02-26 09:22) [22]> [21] MsGuns © (26.02.09 09:03)
> >Германн © (26.02.09 00:45) [19]
> >Но, имхо, нормальное решение его вряд ли возможно.
>
> DataLink ?
Прыгнуть можно на любую запись, а что там перед нею было неизвестно. Это и не понравилось, как я понял, автору.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.005 c