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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2015, 13:31   #1
Tanzor69
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 90
По умолчанию Выделение цветом определенных строк в DBGRID

"Выделить цветом строки в одной таблице, id которых присутствуют в другой таблице в определенном столбце" - собственно вот что требуется.
Всю голову сломал как это сделать. В итоге один вариант заработал, но программа при нем оочень медленно работала, из-за разных вложенных циклов при прорисовке DBGrida. Собственно есть у кого какие мысли как это лучше сделать?
Tanzor69 вне форума Ответить с цитированием
Старый 17.08.2015, 13:47   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я так понимаю делал совсем не так как тут?: http://delphiworld.narod.ru/base/dbg...red_cells.html
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.08.2015, 13:49   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Выполнить ДВА условия
1) написать SQL запрос получения данных, в котором ПРЕДУСМОТРЕТЬ поле-индикатор "наличия данных в другой" таблице'.
Код:
select t1.id, t2.id as indicator ...
from t1
left join t2 on t1.id= t2.id
2) написать обработчик события OnDrawColumn в котором изменять(устанавливать) отображения(Canvas.Pen|Font/Brush) в соответствии c указанном выше полем-индикатором.
Код:
if dbgrid.datasource.dataset.fieldbyname('indicator').isnull then 
  canvas.font.color:=clwindowtext
else 
  canvas.font.color:=clred;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.08.2015 в 13:59.
evg_m вне форума Ответить с цитированием
Старый 17.08.2015, 14:05   #4
Tanzor69
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 90
По умолчанию

да ну примерно так же закрашивал. Тут проблема в другом, как закрашивать СТРОКУ, id в которой равно значению в определенном столбце другой таблицы.
Код:
procedure TForm3.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
	if (Column.Field.Dataset.FieldByName('order_status').AsString = '4') and (gdSelected in State)  then begin
      TDBGrid(Sender).Canvas.Brush.Color:=TColor($CCFFCC);
			TDBGrid(Sender).Canvas.Font.Color:=clBlack;
      TDBGrid(Sender).Canvas.Font.Style:=[fsBold];
		End else if (Column.Field.Dataset.FieldByName('order_status').AsString = '4') and not (gdSelected in State) then begin
      TDBGrid(Sender).Canvas.Brush.Color:=TColor($CCFFCC);
			TDBGrid(Sender).Canvas.Font.Color:=clBlack;
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
вот пример моего кода, но это просто закрашивает строки где в этой же таблице столбец "order_status" равен значению 4

Цитата:
Сообщение от evg_m Посмотреть сообщение
Выполнить ДВА условия
1) написать SQL запрос получения данных, в котором ПРЕДУСМОТРЕТЬ поле-индикатор "наличия данных в другой" таблице'.
Код:
select t1.id, t2.id as indicator ...
from t1
left join t2 on t1.id= t2.id
2) написать обработчик события OnDrawColumn в котором изменять(устанавливать) отображения(Canvas.Pen|Font/Brush) в соответствии c указанном выше полем-индикатором.
Код:
if dbgrid.datasource.dataset.fieldbyname('indicator').isnull then 
  canvas.font.color:=clwindowtext
else 
  canvas.font.color:=clred;
спасибо! правда ничего не знаю про поля индикаторы, буду пытаться щас искать про это информацию

ничего не нашел про 'as indicator'.. если можно, поподробнее

вот думаю может проще сделать вычисляемое поле в таблице №1, в событие OnCacl как раз и проверять наличие id из первой таблице во второй таблице и писать в вычисляемом поле "да" или "нет". А дальше уже будет элементарно раскрасить таблицу в зависимости от значений в этом столбце

Последний раз редактировалось Stilet; 17.08.2015 в 14:43.
Tanzor69 вне форума Ответить с цитированием
Старый 17.08.2015, 14:45   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
не нашел про 'as indicator'.. если можно, поподробнее
t2.id as indicator
если коротко, то это означает
поле id из таблицы t2 именовать как indicator
а подробно Мартин Грубер. Понимание SQL.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 17.08.2015, 15:02   #6
Tanzor69
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 90
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
t2.id as indicator
если коротко, то это означает
поле id из таблицы t2 именовать как indicator
а подробно Мартин Грубер. Понимание SQL.
Код:
select 
prikaz.prikaz_id,
prikaz.prikaz_nomer,
prikaz.prikaz_data,
prikaz.prikaz_soderzhanie,
prikaz.prikaz_ispolnitel,

status_prikaz.status_prikaz,
vid_prikaz.vid_prikaz,
naprav_deyat_prikaz.naprav_deyat_prikaz,

prikaz.prikaz_status_id,
prikaz.prikaz_vid_id,
prikaz.prikaz_naprav_deyat_id,

prikaz1.id_prikaz1 as indicator

from (((prikaz 
left join status_prikaz on status_prikaz.id_status_prikaz = prikaz.prikaz_status_id)
left join vid_prikaz on  vid_prikaz.id_vid_prikaz=prikaz.prikaz_vid_id) 
left join naprav_deyat_prikaz on naprav_deyat_prikaz.id_naprav_deyat_prikaz = prikaz.prikaz_naprav_deyat_id)
left join prikaz1 on prikaz1.id_prikaz1 = prikaz.prikaz_id


ORDER BY prikaz.prikaz_id DESC
вот так не работает, пишет - "неопознанная ошибка" при активации этого запроса

чтобы было понятнее, на схеме нарисовал, что надо сравнивать в таблице prikaz есть ли в таблице prikaz1 значения в поле id_prikaz1 равные prikaz_id
Изображения
Тип файла: png 111.png (72.7 Кб, 225 просмотров)

Последний раз редактировалось Tanzor69; 17.08.2015 в 15:26.
Tanzor69 вне форума Ответить с цитированием
Старый 17.08.2015, 15:40   #7
Tanzor69
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 90
По умолчанию

Вот приложу код, который работает вроде как надо, только оооочень медленно работает программа и всё прорисовывается. Может кто сможет его оптимизировать?
Код:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
  var i : integer;
begin
DataModule2.MainSelectQuery_prikaz1.First;
for i := 1 to DataModule2.MainSelectQuery_prikaz1.RecordCount do begin
 if DataModule2.MainSelectQuery_prikaz1.FieldByName('id_prikaz1').Value>0 then
  if DataModule2.MainSelectQuery1.FieldByName('prikaz_id').Value=DataModule2.MainSelectQuery_prikaz1.FieldByName('id_prikaz1').Value then begin
      TDBGrid(Sender).Canvas.Brush.Color:=TColor($CCFFCC);
			TDBGrid(Sender).Canvas.Font.Color:=clBlack;
      TDBGrid(Sender).Canvas.Font.Style:=[fsBold];
  end;
DataModule2.MainSelectQuery_prikaz1.Next;
end;
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
Tanzor69 вне форума Ответить с цитированием
Старый 19.08.2015, 14:05   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1) нам совсем не обязательно прокручивать набор до конца после того как мы нашли)
Код:
if DataModule2.MainSelectQuery1.FieldByName('prikaz_id').Value=DataModule2.MainSelectQuery_prikaz1.FieldByName('id_prikaz1').Value then begin
      TDBGrid(Sender).Canvas.Brush.Color:=TColor($CCFFCC);
			TDBGrid(Sender).Canvas.Font.Color:=clBlack;
      TDBGrid(Sender).Canvas.Font.Style:=[fsBold];
BREAK;
  end;
2) чтобы что-то найти в имеющемся наборе данных есть Locate
Код:
begin
 if DataModule2.MainSelectQuery_prikaz1.Locate('id_prikaz1',  DataModule2.MainSelectQuery1.FieldByName('prikaz_id').Value, []) then begin
      TDBGrid(Sender).Canvas.Brush.Color:=TColor($CCFFCC);
      TDBGrid(Sender).Canvas.Font.Color:=clBlack;
      TDBGrid(Sender).Canvas.Font.Style:=[fsBold];
  end;
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
Цитата:
вот так не работает, пишет - "неопознанная ошибка" при активации этого запроса
попробуй запрос без вот этого " as indicator "

Код:
select 
prikaz.prikaz_id,
prikaz.prikaz_nomer,
prikaz.prikaz_data,
prikaz.prikaz_soderzhanie,
prikaz.prikaz_ispolnitel,

status_prikaz.status_prikaz,
vid_prikaz.vid_prikaz,
naprav_deyat_prikaz.naprav_deyat_prikaz,

prikaz.prikaz_status_id,
prikaz.prikaz_vid_id,
prikaz.prikaz_naprav_deyat_id,

prikaz1.id_prikaz1

from (((prikaz 
left join status_prikaz on status_prikaz.id_status_prikaz = prikaz.prikaz_status_id)
left join vid_prikaz on  vid_prikaz.id_vid_prikaz=prikaz.prikaz_vid_id) 
left join naprav_deyat_prikaz on naprav_deyat_prikaz.id_naprav_deyat_prikaz = prikaz.prikaz_naprav_deyat_id)
left join prikaz1 on prikaz1.id_prikaz1 = prikaz.prikaz_id


ORDER BY prikaz.prikaz_id DESC
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.08.2015 в 14:13.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение строк цветом Sergey112233 Microsoft Office Excel 2 19.01.2011 22:41
выделение цветом повторяющихся строк Wally-Val Microsoft Office Excel 4 29.08.2010 21:26
Выделение цветом при определенных значениях Умпут Microsoft Office Excel 1 04.11.2009 20:58
Выделение цветом нужных строк таблицы DBGrid XFilippowX Общие вопросы Delphi 4 16.02.2009 10:02
выделение строк цветом в StringGrid kate158 Помощь студентам 1 06.08.2008 09:56