Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2013, 20:57   #1
silent_lab
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 36
Вопрос выделение строк в ячейках которых повторяются значения в dbgrid

Помогите разобраться, уже попробовал все варианты найденные в интернете по раскрашиванию DBgrid.

В результате запроса выдается список данных, в которых дублируется, в одной ячейки записи

id_|num_|__SRNR____|_______title__________|
+++++++++++++++++++++++++++++++++++ +++
01| 23 | 2356000001 | препарат1 |
02| 34 | 2356000001 | препарат1 |
03| 66 | 2356000004 | препарат3 |
04| 67 | 2356000004 | препарат3 |
05| 32 | 2356000011 | препарат56 |
06| 34 | 2356000011 | препарат56 |
07| 46 | 2356000034 | препарат87 |
08| 49 | 2356000034 | препарат87 |
-------------------------------------------------

вот примерно так...
вот мне нужно каждую дубль строку выделить. в идеале 1 строка остается как положено, следующая строка если есть дубль в записи выделяется цветом(к примеру желтым); Дубли проверяются по полю SRNR

попробовал сделать вот так :
Код:
procedure TformColorGrid.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
Begin
	s:= DBGrid1.DataSource.DataSet.FieldByName('SRNR').AsString;
	// Красим нечетные строки
	IF numsrnr = s 
	Then TDBGrid(Sender).Canvas.Brush.Color:=RGB($CC,$CC,$99)
		else numsrnr := s; 

	// Восстанавливаем выделение текущей позиции курсора
	IF  gdSelected   IN State
	Then Begin
		TDBGrid(Sender).Canvas.Brush.Color:= clHighLight;
		TDBGrid(Sender).Canvas.Font.Color := clHighLightText;
	End;
	// Просим GRID перерисоваться самому
	TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
End;
закрашивает все строки ,а первую колонку через раз((((((
Изображения
Тип файла: jpg что вышло.jpg (178.5 Кб, 107 просмотров)

Последний раз редактировалось silent_lab; 22.03.2013 в 21:28.
silent_lab вне форума Ответить с цитированием
Старый 22.03.2013, 21:42   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

При прорисовке событие отрабатывает для каждой колонке грида по каждой записи. Информации о соседних записях нет. Эта информация должна быть в каком-то поле каждой записи
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.03.2013, 21:50   #3
silent_lab
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 36
По умолчанию

мне просто нужно все стоки с повторами выделить.
перемененная numsrnr является проверочной ,содержит новая строка с ячейкой совпадение или нет.
в примере переменная s присваиваю содержимое колонки SRNR новой строки,
проверю содержимое ячейки SRNR равно оно значению numsrnr, если нет, то строка без измения цвета и numsrnr присваиваю значение s
иначе поле содержит совпадение и строчку целиком нужно перекрасить.

вот примерно алгоритм , но что то не так работает(((

Последний раз редактировалось silent_lab; 22.03.2013 в 22:00.
silent_lab вне форума Ответить с цитированием
Старый 22.03.2013, 22:59   #4
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Не верный алгоритм, поскольку цвет строки не запоминаете. Когда грид просит отрисовать ячейку из столбца ACol из строки ARow, то именно здесь нужен цвет ячейки или шрифта. А у вас его нет...
ReportCube вне форума Ответить с цитированием
Старый 22.03.2013, 23:33   #5
silent_lab
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 36
По умолчанию

А пример можно ?
silent_lab вне форума Ответить с цитированием
Старый 22.03.2013, 23:43   #6
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

А какой пример вы хотите? Либо цвет должен определяться по какому-то полю из запроса/таблицы, либо создавать отдельное хранилище, где для каждой строки будет храниться цвет. Других вариантов вроде бы и нет...
ReportCube вне форума Ответить с цитированием
Старый 23.03.2013, 11:03   #7
silent_lab
Пользователь
 
Регистрация: 16.06.2009
Сообщений: 36
По умолчанию

Честно сказать не пойму о чем речь идет. цвет всего один для дублированы записей, для остальных обычный.
Вопрос стоит именно как сверить повторяться ли записи, и если есть совпадение то строку окрасить в другой цвет.
Запрос уже выдает строки по порядку возрастания или убывания(это как настроить).
Мне же нужно при совпадении значения поля SRNR с предыдущей отрисованной уже строй закрасить ее, а если нет совпадения оставить без изменения.
silent_lab вне форума Ответить с цитированием
Старый 23.03.2013, 11:12   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В момент отрисовки нет информации о предыдущей записи. Что бы ее взять нужно указатель записи датасета переместить, попробуйте переместите и все рухнет. Следствие - вся информация должна быть именно в одной записи или в каком-то левом источнике данных, к которому можно обратиться. Можно попытаться в запросе сформировать некий признак, но подозреваю, что будет куча сложностей. Самый простой и дубовый вариант - два идентичных датасета, один отображаемый, второй для анализа предыдущей записи при прорисовке.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.03.2013, 11:21   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

перед тем как что-то показывать для кажой записи из полученного набора данных необходимо определить является ли она дубликатом. Затем в процессе показа (OnDraw) надо воспользоваться этим знанием и раскрасить. Никаких предыдущих (последующих) строк во время раскраски не существует. Обращение к дугим записям означает переход к этой строке.
Если строки отсортированы можно было бы попробовать где-то сохранять код(текст) последней отрисованной и анализивать (сравнивать) с текущей.
Да вот беда никто не может знать с какой строки начнется рисоватние и в каком порядке оно будет идти.

Цитата:
Мне же нужно при совпадении значения поля SRNR с предыдущей отрисованной уже строй закрасить ее, а если нет совпадения оставить без изменения.
Во время рисования каждая строка должна знать является ли она дубликатом и БЕЗ обрашения к другим строкам.
Как этого добиться?
Цитата:
Либо цвет (читай является ли дубликатом) должен определяться по какому-то полю из запроса/таблицы, либо создавать отдельное хранилище, где для каждой строки будет храниться цвет. Других вариантов вроде бы и нет...
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 23.03.2013 в 11:24.
evg_m вне форума Ответить с цитированием
Старый 23.03.2013, 11:22   #10
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Реализация требуемого с TDBGrid для вас будет слишком сложной. Попробуйте поискать сторонний компонент, где это уже реализовано. Если записей будет немного, то я бы вообще отказался от TDBGrid и реализовал всё через обычный TDrawGrid с отображением внешней коллекции записей, например TCollectionItems или TObjectList с вложенными TStringList. Там можно было бы и хранить цвет строки.

Последний раз редактировалось ReportCube; 23.03.2013 в 11:27.
ReportCube вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить слова, в которых буквы повторяются Artoo Помощь студентам 0 16.12.2011 22:09
Выделение несколько строк в DBGrid Blood_ghosT БД в Delphi 6 05.12.2011 11:13
Выпадающий список, если значения в книге повторяются. kamarella Microsoft Office Excel 18 25.08.2010 09:11
Вопрос про выделение строк в DBGrid RamireZ БД в Delphi 0 03.12.2009 17:40
Выделение цветом нужных строк таблицы DBGrid XFilippowX Общие вопросы Delphi 4 16.02.2009 10:02