Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];

Вниз

Как закрасить ячейки в DBGrid?   Найти похожие ветки 

 
rom900   (2002-10-31 10:20) [0]

Добрый день. Помогите пожалуйста. Можно ли в DBGrid закрашивать ячейки по номеру строки и столбца? Как это сделать? Если можно покажите на примере.
В обработчике DBGrid1DrawColumnCell у меня
выделяются номер столбца и строки ячеек, которых нужно закрасить, из массива, содержащего элементы, в которых перечисляются номер столбца и строки данных ячеек.
Использую Query для MSSQL.


 
ЮЮ   (2002-10-31 10:53) [1]

в обработчике ты уже должен "красить", а массив, содержащего элементы, в которых перечисляются номер столбца и строки данных ячеек следует заполнить раньше.
Кстати, номер строки - тонкое место, лучше использовать значение ключевого поля


 
rom900   (2002-10-31 11:18) [2]

Массив, содержащий элементы, в которых перечисляются номер столбца и строки данных ячеек заполняется раньше в другой процедуре.В обработчике DBGrid1DrawColumnCell у меня выделяются номер столбца и строки ячеек, которых нужно закрасить.


 
Aristarh   (2002-10-31 11:29) [3]

Пример выделения цветом строки:

with DBGrid1.Canvas do
begin

if (quDolg.FieldByName("DisconnectDate").AsDateTime <> 0) and not (gdSelected in State)
then begin
Brush.Color := clRed;
FillRect(Rect);
if (Column.Field.DataType=ftString) or (Column.Field.DataType=ftDateTime)
then TextOut(Rect.Left+2, Rect.Top+2, Column.Field.Text)
else TextOut(Rect.Right-TextWidth(Column.Field.Text)-3, Rect.Top+2, Column.Field.Text);
end
else DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end; // with


 
ЮЮ   (2002-10-31 11:32) [4]

TDrawColumnCellEvent = procedure (Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState) of object;

Используешь DBGrid(Sender).Canvas
Либо рисуешь всё сам его методами в прямоугольнике Rect (тогда установи DefaultDrawing=false), либо изменяешь у Canvas цвет, шрифт и т.п. и рисовать будет сам Грид.

Но... у тебя здесь есть DataCol - номер сторбца, но нет никаких номеров строк, т.к. у грида их равно столько, сколько отображается, а не сколько записей в НД. Поэтому я и говорю, что запоминать надо не номер строки, а значение ключа. Или вообще ничего запоминать не надо, если всё это определяется полями самой записи. Внутри обработчика и определи, надо ли красить для этой записи. Если же всё сохранено вовне, то теперь, исходя из ключа текущей записи находишь элемент, соответствующий этой записи, сравниваешь DataCol с номером столбца в элементе и если совпадают, то меняешь св-ва Canvas


 
Александр Спелицин   (2002-10-31 11:46) [5]

http://www.delphikingdom.com/helloworld/dbgridcolor.htm


 
rom900   (2002-10-31 12:02) [6]

Вообще то задача стоит такая. Сравнить содержимое таблиц за 2
интервала времени и если в таблицах в одинаковых столбцах при одинаковых значениях строки 0-столбца будет не пусто, какие-то значения, то выделить их цветом, для этого и создается массив, содержащий элементы, в которых перечисляются номер столбца и строки данных ячеек.
И если для таблицы StringGrid действует правильно, т.к. есть ACol,ARow код:

if Query1.Active=true then
begin

if (StringGrid1.Cells[ACol,ARow]<>"") and (ACol<>0) and (ARow<>0) then
begin

for i:=1 to inach-1 do
for i1:=1 to ikon-1 do
begin
if pos(",",mas2[i,i1])<>0 then
begin
if (ACol=strtoint(copy(mas2[i,i1],1,pos(",",mas2[i,i1])-1))) and (ARow=strtoint(copy(mas2[i,i1],pos(",",mas2[i,i1])+1,length(mas2[i,i1])-pos(",",mas2[i,i1])))) then
begin
StringGrid1.Canvas.Brush.Color:=clRed;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.Font.Style:=[fsBold];
StringGrid1.Canvas.TextOut(Rect.left+2,Rect.top+2,StringGrid1.Cells[ACol, ARow]);
end
else begin
StringGrid1.Canvas.Brush.Color:=clYellow;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.Font.Style:=[fsBold];
StringGrid1.Canvas.TextOut(Rect.left+2,Rect.top+2,StringGrid1.Cells[ACol, ARow]);
end;
end


if ARow=0 then
begin
StringGrid1.Canvas.Brush.Color:=clMenu;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.Font.Style:=[fsBold];
StringGrid1.Canvas.TextOut(Rect.left+2,Rect.top+2,StringGrid1.Cells[ACol, ARow]);
end;

А для DBGrid, я не могу это сделать, т.к.RecNo -только для локальных баз :

With DBGrid1.Canvas do Begin
if Query1.Active=true then
begin
if (Query1.Fields[DataCol].AsString<>"") and (DataCol<>0) then
begin

for i:=1 to ComboBox1.Items.Count do
for i1:=1 to Query1.RecordCount-1 do
begin
if pos(",",mas2[i,i1])<>0 then
begin

if (DataCol=strtoint(copy(mas2[i,i1],1,pos(",",mas2[i,i1])-1))) and (DBGrid1.DataSource.DataSet.RecNo = strtoint(copy(mas2[i,i1],pos(",",mas2[i,i1])+1,length(mas2[i,i1])-pos(",",mas2[i,i1])))) then
begin
DBGrid1.Canvas.Brush.Color:=clRed;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.Font.Style:=[fsBold];
FillRect(Rect);
TextOut(Rect.left+2,Rect.top+2,Column.Field.text);
end
else begin
DBGrid1.Canvas.Brush.Color:=clYellow;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.Font.Style:=[fsBold];
FillRect(Rect);
TextOut(Rect.left+2,Rect.top+2,Column.Field.text);
//DBGrid1.Canvas.TextOut(Rect.left+2,Rect.top+2,StringGrid1.Cells[ACol, ARow]);
end;
end

end;

end
else
DBGrid1.DefaultDrawColumnCell(Rect,datacol,Column,State);

end;
end;


 
rom900   (2002-10-31 12:07) [7]

Спасибо за ссылку http://www.delphikingdom.com/helloworld/dbgridcolor.htm, но она
все таки не ответила на мой вопрос


 
ЮЮ   (2002-10-31 12:09) [8]

>для этого и создается массив, содержащий элементы, в которых перечисляются номер столбца и строки данных ячеек

Ты глухой, или как? Оставь в покое номер строки и обрати внимание на ключевое поле. Более того, не проще ли объединить всё в одном запросе, чтобы по самой записи определять, красить или не красить, а не городить огород в стороне от DBGrida


 
rom900   (2002-10-31 12:28) [9]

А какое ключевое поле здесь может быть, если может быть закрашена или не закрашена любая ячейка любого столбца,а что касается запроса, то он сам по себе сложен, чтобы объединять его в одном запросе.


 
ЮЮ   (2002-10-31 12:39) [10]

Я говорю замени номер строки на ключевое поле записи (или несколько полей, однозначно определяющих эту запись), которую ты обрабатывал, когда работал со строкой N. Про столбцы я ничего не говорил.
А в OnDraw смотришь есть ли что-то для отрисовываемой записи в твоей куче или нет.

>а что касается запроса, то он сам по себе сложен, чтобы объединять его в одном запросе
Оптимизируй :-)


 
MsGuns   (2002-10-31 12:50) [11]

Если надо красить определенные записи НД по значению некоторых полей (ключей или номеров записи, если последние имеются), создай TList, куда после открытия (обновления) запроса закачай ссылки на записи (ключи или номера), которые надо красить, а в событии OnDrawColumnCells проверяй ключи записи на предмет наличия в TList, и если есть, то устанавливай для "рисовальщика" выделенные цвета, а потом DefaultDrawColumnCell.


 
rom900   (2002-10-31 13:01) [12]

А можно пример какой-нибудь простенький, а то сразу не соображу?

А запросы такие:

select Tab.device,Sum(R1),Sum(R2) from
(select a_data_general.device ,
R1=(case when (a_data_general.ats="28") and (Count(a_data_general.ats)/a_por.mar)/"1"> porog
then (Count(a_data_general.ats)/a_por.mar)/"1" else null end),
R2=(case when (a_data_general.ats="21") and (Count(a_data_general.ats)/a_por.mar)/"1"> porog
then (Count(a_data_general.ats)/a_por.mar)/"1" else null end)
from a_data_general,a_por
where (a_por.device=a_data_general.device) and (a_por.ats=a_data_general.ats)
and (a_data_general.device<>"2-ГИ") and (a_data_general.device<>"2-ГИМ")
and (a_data_general.device<>"ЭВРД") and (a_data_general.device<>"ПКВ")
and (dt >= "20021022 00:00:00") and (dt <= "20021023 23:59:59") and datepart(hh, dt) >= 1
and datepart(hh, dt) < 23 and datepart(dw, dt) NOT IN (1,7)
group by a_data_general.ats,a_data_general.device,a_por.mar,porog )
Tab
group by Tab.device


select Tab.device,Sum(R1),Sum(R2) from
(select a_data_general.device ,
R1=(case when (a_data_general.ats="28") and (Count(a_data_general.ats)/a_por.mar)/"1"> porog
then (Count(a_data_general.ats)/a_por.mar)/"1" else null end),
R2=(case when (a_data_general.ats="21") and (Count(a_data_general.ats)/a_por.mar)/"1"> porog
then (Count(a_data_general.ats)/a_por.mar)/"1" else null end)
from a_data_general,a_por
where (a_por.device=a_data_general.device) and (a_por.ats=a_data_general.ats)
and (a_data_general.device<>"2-ГИ") and (a_data_general.device<>"2-ГИМ")
and (a_data_general.device<>"ЭВРД") and (a_data_general.device<>"ПКВ")
and (dt >= "20021020 00:00:00") and (dt <= "20021021 23:59:59") and datepart(hh, dt) >= 1
and datepart(hh, dt) < 23 and datepart(dw, dt) NOT IN (1,7)
group by a_data_general.ats,a_data_general.device,a_por.mar,porog )
Tab
group by Tab.device


, как их оптимизировать


 
MsGuns   (2002-10-31 13:13) [13]

Прочитай свой же пост. Из траблы раскраски ветка плавно мутировала в проблему оптимизации запросов.

В связи с этим старый анекдот:

Приходит молодая женщина к гинекологу. Заходит в кабинет, а там два молодых чела в халатах обедают. Ну она без лишнитх слов давай им про свои беды, мол, фригидность совсем жить не дает и т.д. А сама разделась уже и расположилась.
Вот один из парней дожевал, подошел к ней, вы.... классно и спрашивает "Ну как, почувствовали ?". Дамочка отвечает "Нет, ничего абсолютно".
"Тогда давай ты, Вася !" Вася проделал то же самое. Застегивает брюки и спрашивает "Ну что ?"
"Нет, говорит, никакого эффекта"
"Даа, тяжелый случай, вам к врачу надо"
"А вы кто ???!!!"
"Да мы вообще-то маляры, стены в коридоре красим, а сюда нас пообедать пустили"


 
ЮЮ   (2002-10-31 13:14) [14]

Если в гриде отображается только один запрос, то в OnDraw
Сделать Locate для второго НД по полям группировки со значениями из первого.(Их, ктати тоже надо добавить в выборку. Или для одного Tab.device возможна толька одна запись? Тогда тут целое поле непаханное для оптимизации, ведь группировка делается по 4 полям!) Записи в обоих НД будут синхронизированы. Здесь и делать анализ.


 
rom900   (2002-10-31 13:26) [15]

В гриде отображается только один запрос.Второй нужен для того, чтобы узнать какие ячейки закрашивать. И вообще можно ли какой-
нибудь пример в Delphi даже простенький по закраске ячеек по выше сказанному вами ЮЮ и MsGuns или никто этим не занимался.


 
MsGuns   (2002-10-31 13:31) [16]

>rom900 © (31.10.02 13:26)

Получай мыло !


 
ЮЮ   (2002-10-31 13:34) [17]

Но здесь всё определяется по одной, текущей, записи

procedure TForm1.DBGrid_SpisokDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
Var ARect:TRect;
DBGrid1:TDBGrid;
begin
DBGrid1:=TDBGrid(Sender);

if (gdSelected in State) or (gdFocused in State)
then begin
DBGrid1.Canvas.Brush.Color := $F0F0F0;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.Pen.Color := clBlue;
DBGrid1.Canvas.MoveTo(Rect.Left,Rect.Top);
DBGrid1.Canvas.LineTo(Rect.Right,Rect.Top);
DBGrid1.Canvas.MoveTo(Rect.Left,Rect.Bottom-1);
DBGrid1.Canvas.LineTo(Rect.Right,Rect.Bottom-1);
end
else begin
DBGrid1.Canvas.Brush.Color := clWindow;
DBGrid1.Canvas.FillRect(Rect);
end;

ARect:=Types.Rect(Rect.Left+1,Rect.Top+1,Rect.Right-2,Rect.Bottom-1);
if DBGrid1.DataSource.DataSet.FieldByName("RepSend").Value
then DBGrid1.Canvas.Font.Color := clBlack
else
if DBGrid1.DataSource.DataSet.FieldByName("SubRepSend").Value
then DBGrid1.Canvas.Font.Color := clNavy
else
DBGrid1.Canvas.Font.Color := clRed;
if DBGrid1.DataSource.DataSet.FieldByName("ReadyToRep").Value
and not DBGrid1.DataSource.DataSet.FieldByName("RepSend").Value
or
DBGrid1.DataSource.DataSet.FieldByName("ReadyToSubRep").Value
and not DBGrid1.DataSource.DataSet.FieldByName("SubRepSend").Value
then DBGrid1.Canvas.Font.Style:=[fsBold]+[fsUnderline]
else DBGrid1.Canvas.Font.Style:=[];

if Column.Field.AsString<>"0"
then begin

if Column.Alignment=taRightJustify
then begin
ARect.Left:=ARect.Left+Column.Width-Canvas.TextWidth(Column.Field.AsString)-3;
if ARect.Left<Rect.Left+1 then ARect.Left:=Rect.Left+1;
end;
DBGrid1.Canvas.TextOut(ARect.Left,ARect.Top,Column.Field.AsString);
end;

end;


 
MsGuns   (2002-10-31 13:47) [18]

Кстати, я заметил одну фигню. Если в Options у грида стоит AlwaysShowSelection, то при DBGrid1DrawColumnCell State никогда не будет gdSelected. Несмотря на то, что в опциях нет RowSelect. Интересно, почему ?



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.007 c
14-69497
Дремучий
2002-10-29 22:28
2002.11.21
Задачка по SQL...


3-69126
kserg@ukr.net
2002-10-24 18:02
2002.11.21
подходы в разработке БД


1-69363
comandos
2002-11-10 10:38
2002.11.21
график


1-69426
Vetalar
2002-11-10 21:47
2002.11.21
Как ограничить количество знаков после запятой?


3-69115
dim-
2002-11-03 02:51
2002.11.21
Как узнать путь к БД isc4.gdb





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский