Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  03:22[Войти] | [Зарегистрироваться]
Ответ на вопрос № 83823

04-09-2022 01:15
Всем доброго дня.

  Казалось бы, простой и древний вопрос по поводу раскраски DbGrid'а, для меня оказался не так прост.
  Он касается цветного, полосатого DbGrid, размеченного в соответствии с группами (т.е. "черезгрупно").
 
  В БД есть таблица Nodes2(Node2_id, Node1_id, Name). В ней: Node2_id - первичный ключ, а Node1_id - вторичный ключ, указывающий на другую таблицу Nodes1(Node1_id, Name). Ориентировочно, строк в таблице около 100, строк в группе 0-10. Для примера, данные таблицы, для полей Node2_id, Node1_id, такие:

1 1
2 2
3 3
4 2
5 1


  Запрос, выводит данные отсортированные по полю Node1_id. Группой считаются одинаковые, подряд идущие значения Node1_id:

select Node2_id, Node1_id
  from Nodes2
  order by Node1_id;


1 1
5 1
2 2
4 2
3 3


  В DbGrid, потребовалось раскрасить строки в два цвета, в соответствии с чередованием групп (третья колонка). Предполагалась, что пользователю, просматривающего таблицу с группировками, будет удобно ориентироваться в таблице по чередованию цветов группировок:

1 1 цвет по умолчанию
5 1 цвет по умолчанию
2 2 цвет 1
4 2 цвет 1
3 3 цвет по умолчанию


  Первоначально, такая раскраска была выполнена только через событие TDBGridEh.onGetCellParams, в котором проверялись предыдущие и запоминались новые значения Node1_id и "метод закраски". Т.е. исходя из различия данных предыдущей и текущей записи. Такой способ работал до тех пор, пока таблица Nodes2 была мала и не вызывался scroll.
  После этого, задача выбора цвета закраси группировки, целиком была перенесана в sql запрос. Простая выборка из Nodes2, соединяется с группировкой по Nodes2 и Nodes1, в котором и определяется будет закрашиваться строка цветом или нет. В этом варианте, sql запрос получился достаточно тяжёлым. Да и для правильной раскраски после каждого редактирования, требует перезагрузки данных всех записей запроса.
  В первом варианте - подкупает его простота. А второй - ну очень уж громоздок для такой простой задачи.
 
  Использую: Delphi 7, EhLib 7, FibPlus, Firebird 3.
   
  Вопрос.
  Как бы вы решили такую задачу:
  - раскраси DbGrid, в два цвета, с чередованием по группам записей?
  - удобной и простой в исполненнии навигации по таблице с группировками? Вполне возможно, что сама идея раскраски с чередованием цвета по группам, для этого избыточна.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

04-10-2022 02:26 | Вопрос к автору: запрос дополнительной информации
а если скомбинировать оба варианта? одно состояние один цвет, ярче-темнее, другое состояние другой цвет... и чересполосица, и цвет разный.

27-09-2022 02:48 | Сообщение от автора вопроса
>>> в одной проге у меня есть справочник состояний поверки приборов, в котором пользователь задаёт цвет строки и шрифта. в результате в таблице, пользователь видит по цвету состояние прибора ...
  На мой взгляд, в вашем примере решается задача "изображения состояния". Количество "возможных состояний" заранее известо и их небольшое число. Поэтому для каждого из них можно настроить специфическое изображение цветом и типом шрифта.
  У меня же задача "вспомогательной навигации по таблице". Например, для вашего примера такое можно представить следующим образом. Допустим у вас, среди прочих, есть числовой параметр-свойство и таблица отсортирована по нему. Задача "изображения состояния" приборов никуда не делась и отображается цветом и типом шрифта. Но кроме этого, желательно как-то выделить группы значений, у которых параметр отличается, скажем, на 10. Другими словами, не изменяя задачу "изображения состояния", поверх неё, наложить задачу "вспомогательной навигации по таблице".
  Так как вид группировки по числовому параметру заранее неизвестен (сколько будет в группе записей, сколько будет групп и в какой очерёдности они следуют), то, для простоты и было предложено использовать "черезполосицу по группам".
 
  Приведу ещё один поясняющий мой вопрос пример. Это задача "отображения списка параметров", в которой нам потребовалась "вспомогательная навигация по таблице". Предполагается отобразить список параметров-переменных. У каждой такого параметра-переменной есть свойство "тип данных". Для примера, пусть значения свойства "тип данных" будут соответствовать перечню TFieldType из модуля Db (значений там около 40).
  При отображении такого списка параметров-переменных в DbGrid, для каждого "типа данных" установить свою цветовую схему - избыточно сложно. Но если сгруппировать список по параметру "тип данных", то в каждую группу попадёт всего насколько записей, которые можно раскрасить "черезполосицей по этим группам". А такая раскраска намного удобнее для навигации, чем просто однотонный список. Образно, сравнивая с печатным текстом, можно сказать, что в первом случае у нас есть текст, разграниченный абзацами, а во втором - весь текст одним куском.
 
  На словах всё выглядит просто. Но программная реализация, на мой взгляд, оказалась слишком сложна для такой задачи. Мой вопрос и касается этого несоответствия по сложности...

20-09-2022 03:39 | Комментарий к предыдущим ответам
в одной проге у меня есть справочник состояний поверки приборов, в котором пользователь задаёт цвет строки и шрифта. в результате в таблице пользователь видит по цвету состояние прибора, а при сортировке таблицы по состоянию поверки - приборы группируются по цвету и пользователь видит: как много приборов принято к работе, проверяется, поверено, выдано заказчику.
может этот вариант вам больше подойдёт?

19-09-2022 01:35 | Сообщение от автора вопроса
для  eugeni
  Изначально, при решении задачи этого вопроса, было использовано два способа:
  Первый - сравнение значений соседних записей в таблице.
  Второй - создание отдельной, дополнительной таблицы с вычислением значения требуемого поля цвета раскраски.
  Причём, такие способы можно использовать на разных уровнях компонент программы: DbGrid, DataSet, на сервере БД (в sql запросе).

  Вы предложили третий способ решения, основанный на анализе значения "вторичного ключа".
  Такое программное решение, подкупает своей простотой и эффективностью (хоть и несколько нарушает правила работы с БД ;-) ).

  Но у меня сложилось впечатление, что предложенный вами способ не решит задач, заданного мною вопроса. При его использовании:
- раскраска Grid, с чередованием по группам записей, будет происходить лишь иногда. Вернее сказать, раскраска Grid будет происходить всегда, но соседние группы могут быть окрашены в один и тот же цвет. Но нам то нужно постоянное чередование цвета раскраски.
- непредсказуемость раскраски групп в Grid, скорее смутит пользователя, чем поможет ему в навигации по таблице с группировками.

07-09-2022 04:27
если значение поля Node1_id чётное, то один цвет, нечётное - другой. строки раскрашивать в DBGrid1DrawColumnCell

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Раз дощечка, два дощечка будет лесенка. Раз словечко, два словечко, будет ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования