Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.006 c
15-1259587923
12
2009-11-30 16:32
2010.02.28
sql server, ms. Общая оптимизация. Прошу подсказки.


1-1238629573
Opilki_Inside
2009-04-02 03:46
2010.02.28
Непонятное поведение accelerator character


15-1260971239
Артур Пирожков
2009-12-16 16:47
2010.02.28
НЕ програмное выполнение несложной задачи


15-1260807632
Kostafey
2009-12-14 19:20
2010.02.28
Шрифты в редакторе формул Word-а


4-1229520484
belmol
2008-12-17 16:28
2010.02.28
работа с dll





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский