DBGrid agrupado, separado por cor
Criemos uma tabela com dois campos:
DESCRICAO STRING 50
GRUPO STRING 30
Agora vamos inserir os dados:
Agora no Grid, gostaria que todos os dados que pertencem ao Grupo a, esteja em vermelho, os do grupo b em preto, os do grupo c em vermelho, os do grupo d em preto e assim sucessivamente. ATENÇÃO!!!
Não é colorir linha sim e linha não, mas sim todos os itens do mesmo grupo, alternadamente.
DESCRICAO STRING 50
GRUPO STRING 30
Agora vamos inserir os dados:
Agora no Grid, gostaria que todos os dados que pertencem ao Grupo a, esteja em vermelho, os do grupo b em preto, os do grupo c em vermelho, os do grupo d em preto e assim sucessivamente. ATENÇÃO!!!
Não é colorir linha sim e linha não, mas sim todos os itens do mesmo grupo, alternadamente.
Paulo
Curtidas 0
Respostas
Diogoalles
02/03/2004
Olá
No evento do DbGrid , OnDrawColumnCell faça :
abraço
Diogo
No evento do DbGrid , OnDrawColumnCell faça :
if(QueryCodigo.Value >= 1)then begin // nesse if vc coloca todas as colunas do DbGrid if(Column.FieldName = ´Codigo´)or (Column.FieldName = ´Codigo´)then begin with DbGrid.Canvas do begin Brush.Color := $004242FF; // VERMELHO FillRect(Rect); // aqui tb dá pra mudar a cor da fonte Font.Color := clYellow; TextOut(Rect.Left+2,Rect.Top+2,Column.Field.DisplayText); end; end; end else // aqui vc pode prosseguir e definir outras cores utilizando a mesma rotina acima. ...
abraço
Diogo
GOSTEI 0
Paulo
02/03/2004
Diogo, não é bem isso que eu to querendo. Vou tentar explicar melhor:
Tenho duas tabelas:
GRUPO E PRODUTOS.
A estrutura da tabela grupo é:
COD(Autoinc) e NOME(String 30)
A estrutura da tabela Produtos é:
COD(Autoinc)
DESCRICAO(String 50)
CODBAR(STRING 13)
CODALFA(STRING 13)
GRUPO(STRING 30)
Inseri estes dados:
1 Driver
2 Cpu
3 Placa
No cadstro de produtos eu insiro, normalmente sendo que no campo grupo eu
tenho uma DBLookupComboBox, com o ListSource para a tabela de GRUPO.
Na tabela eu tenho:
Na tabela Produtos eu insiro:
Cpu Pentium IV HT 3.0 ela é do grupo CPU
Cpu Ahtlon 2.8 grupo CPU
Cpu Duron 1.8 grupo CPU
Driver de 3 1/2 grupo DRIVER
Driver Combo LG grupo DRIVER
Gravador 48X24X48 LG grupo DRIVER
Pl. Video AGP 64 Mb grupo PLACA
Pl. Mãe Asus SIS 740 grupo PLACA
Na hora de mostrar no grid, todos os itens do grupo CPU de uma cor,
exemplo:
Os do grupo CPU VERMELHO,grupo DRIVER BRANCO e os do grupo PLACA VERMELHO.
Não é colorir as colunas mas as linhas, que satisfaçam as condições
citadas. Consegui com a juda de um colega fazer com StringGrid, mas
não adianta, pois o grid é usado para efetuar as vendas. É preciso
o DBGrid, por causa do DataSource.
Tenho duas tabelas:
GRUPO E PRODUTOS.
A estrutura da tabela grupo é:
COD(Autoinc) e NOME(String 30)
A estrutura da tabela Produtos é:
COD(Autoinc)
DESCRICAO(String 50)
CODBAR(STRING 13)
CODALFA(STRING 13)
GRUPO(STRING 30)
Inseri estes dados:
1 Driver
2 Cpu
3 Placa
No cadstro de produtos eu insiro, normalmente sendo que no campo grupo eu
tenho uma DBLookupComboBox, com o ListSource para a tabela de GRUPO.
Na tabela eu tenho:
Na tabela Produtos eu insiro:
Cpu Pentium IV HT 3.0 ela é do grupo CPU
Cpu Ahtlon 2.8 grupo CPU
Cpu Duron 1.8 grupo CPU
Driver de 3 1/2 grupo DRIVER
Driver Combo LG grupo DRIVER
Gravador 48X24X48 LG grupo DRIVER
Pl. Video AGP 64 Mb grupo PLACA
Pl. Mãe Asus SIS 740 grupo PLACA
Na hora de mostrar no grid, todos os itens do grupo CPU de uma cor,
exemplo:
Os do grupo CPU VERMELHO,grupo DRIVER BRANCO e os do grupo PLACA VERMELHO.
Não é colorir as colunas mas as linhas, que satisfaçam as condições
citadas. Consegui com a juda de um colega fazer com StringGrid, mas
não adianta, pois o grid é usado para efetuar as vendas. É preciso
o DBGrid, por causa do DataSource.
GOSTEI 0
Fabio.hc
02/03/2004
Tente assim:
Vc vai colocando uma cor para cada código de grupo.
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); begin case Query1GRUPO.Value of 1: DBGrid1.Canvas.Brush.Color:= clRed; 2: DBGrid1.Canvas.Brush.Color:= clAqua; 3: DBGrid1.Canvas.Brush.Color:= clBlue; 4: ... end; DBGrid1.Canvas.FillRect(Rect); DBGrid1.Canvas.TextOut(Rect.Left+2, Rect.Top+2, Field.Text); end;
Vc vai colocando uma cor para cada código de grupo.
GOSTEI 0
Paulo
02/03/2004
Companheiros, consegui fazer a separação por cor. Tive que criar
mais um campo na tabela(indice). Este indice recebe o valor integer
do grupo da tabela de grupo e qdo eu insiro na minha tabela de pro
dutos, ele recebe este valor. Ex: 1 CPU, 2 Pl. Mae
Na tabela de produtos eu tenho:
Descrição
Pentium IV 3.0
Grupo
CPU
Indice
1
e assim vai, depois no OnDrawDataCell eu coloco:
procedure TfrmVenda.Grid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
if not odd(AdoQuery1indice.Value) then begin
Grid1.Canvas.Brush.Color:=clRed;
Grid1.Canvas.FillRect(Rect);
Grid1.Canvas.TextOut(Rect.Left+2, Rect.Top+2, Field.Text);
end;
Agora só tem um problema. ele só funciona se selecionar todos os campos
da tabela. Se eu criar colunas no DBGrid, ele não funciona. Eu preciso
trabalhar somente com alguns campos. Na query(no select) eu especifico
Os campos que quero trabalhar, aí funciona, só que o nome dos campos
na tabela não é o mesmo que o usuário vai usar, e estão todos em mi
núscula. Preciso criar colunas no Grid, com o editor de colunas e reno
mear os captions dos campos. Assim ele não funciona, ou seja, os campos eu
posso selecionar no select, tipo(select prod, cod from tabela), mas
no Grid eu não posso criar colunas. Como fazer venda numa tabela, inserir
dados, com order by? É necessário o order by para ordenar os campos, mas
as vendas são feitas no grid(a pedido do cliente).
mais um campo na tabela(indice). Este indice recebe o valor integer
do grupo da tabela de grupo e qdo eu insiro na minha tabela de pro
dutos, ele recebe este valor. Ex: 1 CPU, 2 Pl. Mae
Na tabela de produtos eu tenho:
Descrição
Pentium IV 3.0
Grupo
CPU
Indice
1
e assim vai, depois no OnDrawDataCell eu coloco:
procedure TfrmVenda.Grid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
if not odd(AdoQuery1indice.Value) then begin
Grid1.Canvas.Brush.Color:=clRed;
Grid1.Canvas.FillRect(Rect);
Grid1.Canvas.TextOut(Rect.Left+2, Rect.Top+2, Field.Text);
end;
Agora só tem um problema. ele só funciona se selecionar todos os campos
da tabela. Se eu criar colunas no DBGrid, ele não funciona. Eu preciso
trabalhar somente com alguns campos. Na query(no select) eu especifico
Os campos que quero trabalhar, aí funciona, só que o nome dos campos
na tabela não é o mesmo que o usuário vai usar, e estão todos em mi
núscula. Preciso criar colunas no Grid, com o editor de colunas e reno
mear os captions dos campos. Assim ele não funciona, ou seja, os campos eu
posso selecionar no select, tipo(select prod, cod from tabela), mas
no Grid eu não posso criar colunas. Como fazer venda numa tabela, inserir
dados, com order by? É necessário o order by para ordenar os campos, mas
as vendas são feitas no grid(a pedido do cliente).
GOSTEI 0
Paulo
02/03/2004
ainda nada. Sobe.
GOSTEI 0
Marco Salles
02/03/2004
Criemos uma tabela com dois campos:
DESCRICAO STRING 50
GRUPO STRING 30
Agora vamos inserir os dados:
Agora no Grid, gostaria que todos os dados que pertencem ao Grupo a, esteja em vermelho, os do grupo b em preto, os do grupo c em vermelho, os do grupo d em preto e assim sucessivamente. ATENÇÃO!!!
Não é colorir linha sim e linha não, mas sim todos os itens do mesmo grupo, alternadamente.
Se Eu Entendi Bem:
Num Seria Voce Em Nivel De Projeto, Com a Propiedade [color=red:550a23cf19]Active:=True [/color:550a23cf19]Do Table Ou Query ,Ir Na Opção [color=red:550a23cf19]Colunms Do Grid [/color:550a23cf19]=> Ira Abrir o [color=red:550a23cf19]´Editing DbGrid1.Colunms´[/color:550a23cf19] Escolher a Opção [color=red:550a23cf19]´Add All Fields´[/color:550a23cf19]...Pronto, a Partir Dai Voce, [color=red:550a23cf19]No Objecto Inspector [/color:550a23cf19]Dos [color=red:550a23cf19]´Componentes DbGrid[i].Colunms´[/color:550a23cf19] Selecionar a Opção[color=red:550a23cf19] ´Font´ [/color:550a23cf19]e Escolher a Cor......
GOSTEI 0
Paulo
02/03/2004
Marcos não é a fonte, mas sim as linhas inteiras. Se apenas eu abro a query ou table em runtime e o dbgrid ligado a ela funciona como eu quero, porem se uso ColumsEditor do DBGrid não funciona. Deixa-me explicar melhor:
São duas tabelas, uma de produtos e outra de grupo. Na tabela de produtos tenho um campo chamado grupo que vem, através de um DBCombolookup, da tabela de grupos. Na tabela de produtos eu tenho vários itens cadastrados, porem de um mesmo grupo. Esses que são do mesmo grupo da mesma cor e de grupo diferente outra cor, alternadamente. Isso eu já consegui fazer, porem só com DBGrid ligado direto, se modifico o LayOut do grid, com Colums Editor, aí a cobra fuma!
Só quero saber isso:
Fiz assim, onde Indice é o código do grupo, que qdo eu gravo na tabela de produtos ele busca o Código do grupo e grava no cammpo indice, para poder funcionar, é muito simples. Se caso estiver algo errado, é q eu to longe do meu computador, não me lembro tudo de cabeça, mas os códigos estão certos em casa, podes crer.
if not odd(queryindice.value) then begin
DBGrid1.Canvas.color:=cor1;
....
DBGrid1.Canvas.TextOut(Rect.Left+2, Rect.Top+2, Field.Text)
end;
São duas tabelas, uma de produtos e outra de grupo. Na tabela de produtos tenho um campo chamado grupo que vem, através de um DBCombolookup, da tabela de grupos. Na tabela de produtos eu tenho vários itens cadastrados, porem de um mesmo grupo. Esses que são do mesmo grupo da mesma cor e de grupo diferente outra cor, alternadamente. Isso eu já consegui fazer, porem só com DBGrid ligado direto, se modifico o LayOut do grid, com Colums Editor, aí a cobra fuma!
Só quero saber isso:
Fiz assim, onde Indice é o código do grupo, que qdo eu gravo na tabela de produtos ele busca o Código do grupo e grava no cammpo indice, para poder funcionar, é muito simples. Se caso estiver algo errado, é q eu to longe do meu computador, não me lembro tudo de cabeça, mas os códigos estão certos em casa, podes crer.
if not odd(queryindice.value) then begin
DBGrid1.Canvas.color:=cor1;
....
DBGrid1.Canvas.TextOut(Rect.Left+2, Rect.Top+2, Field.Text)
end;
GOSTEI 0
Marco Salles
02/03/2004
Paul, Se Voce Quiser Resolver Este ProBlema Em Runtime Eu Vou Lhe Sugerir Um Fragmento De Um Código Que Muda a Cor Do Campo, a Cor Da Fonte Etc...Talves Este Fragmento Possa Te Ajudar a Alcançar O Seu Objetivo...
No Evento OnDBGrid1DrawColumnCell Da Grid Escreva:
Voce Pode Usar IF Seguidos Para os Outros Campos Que Voce Quer...Voce Pode Ainda Colocar Un And Nestes If Para Filtrar Ainda Mais...
Faça o Exemplo Com Uma Coluna, Que Ela Vai Mudar De Cor, etc...E Depois Se For o Caso Faça a Adaptação Para O Que Voce Quer...
Espero Ter Contribuido...
No Evento OnDBGrid1DrawColumnCell Da Grid Escreva:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin begin if (Column.Field= Table1.FieldByName(´Nome De Um Campo´)) then begin DBGrid1.Canvas.Brush.Color:= clAqua;//Escolha a Que V.c Quer Usar DBGrid1.Canvas.Font.Color:=clHighlightText; end; DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end;
Voce Pode Usar IF Seguidos Para os Outros Campos Que Voce Quer...Voce Pode Ainda Colocar Un And Nestes If Para Filtrar Ainda Mais...
Faça o Exemplo Com Uma Coluna, Que Ela Vai Mudar De Cor, etc...E Depois Se For o Caso Faça a Adaptação Para O Que Voce Quer...
Espero Ter Contribuido...
GOSTEI 0
Paulo
02/03/2004
No OnDrawColumnCell, eu consegui em termos, ou seja, consegui separa por cor, mas as fontes vêm da mesma cor das células. Não consegui alterar. Creio q o problema está na última linha do código, que é essa:
Grid.Canvas.TextOut(rect.left+2,grid.top+2,text);
No lugar de Text, eu deveria por assim:Column.FiledValue, só que FieldValue não é aceito no OnDrawColumn.., mas sim Fieldname, só que FieldName, vem os nomes dos cmpos e não os valores deles. Antes dessa linha eu pus:
Grid.Canvas.Font.Color:=clWhite; Ne assim. Coloquei para o final do código e nada. A primeira e segunda linha é:
if not odd(Tabelacampo.Value) then begin..//Aqui eu seleciono as linhas
Grid.Canvas.Brush.Color:=clBlue;//Aqui eu pinto as células obedecendo o comando ODD.
Grid.Canvas.FillRect(Rect);//Crio as células
Grid.Canvas.Font.Color:=clWhite;//Tento pintar as fontes
Grid.Canvas.TextOut(rect.left+2,grid.top+2,text);//aqui eu me perco
Este basicamente é o meu código no OnDrawColumnCell. No OnDrawDataCell, funciona mas se eu usar um Grid personalisado, no Columns propriedade, ele não funciona, vem branco com fontes pretas mesmo se mudar a cor das fontes. Agora eu preciso de Grids personalizados, pois os nomes dos campos nem sempre são interativos para o usuário, e eu preciso às vezes de todos os campos na tabela, mas no grid eu quero mostrar somente alguns. Vou experimentar esse seu exemplo, Marcus, e depois t digo.
Grid.Canvas.TextOut(rect.left+2,grid.top+2,text);
No lugar de Text, eu deveria por assim:Column.FiledValue, só que FieldValue não é aceito no OnDrawColumn.., mas sim Fieldname, só que FieldName, vem os nomes dos cmpos e não os valores deles. Antes dessa linha eu pus:
Grid.Canvas.Font.Color:=clWhite; Ne assim. Coloquei para o final do código e nada. A primeira e segunda linha é:
if not odd(Tabelacampo.Value) then begin..//Aqui eu seleciono as linhas
Grid.Canvas.Brush.Color:=clBlue;//Aqui eu pinto as células obedecendo o comando ODD.
Grid.Canvas.FillRect(Rect);//Crio as células
Grid.Canvas.Font.Color:=clWhite;//Tento pintar as fontes
Grid.Canvas.TextOut(rect.left+2,grid.top+2,text);//aqui eu me perco
Este basicamente é o meu código no OnDrawColumnCell. No OnDrawDataCell, funciona mas se eu usar um Grid personalisado, no Columns propriedade, ele não funciona, vem branco com fontes pretas mesmo se mudar a cor das fontes. Agora eu preciso de Grids personalizados, pois os nomes dos campos nem sempre são interativos para o usuário, e eu preciso às vezes de todos os campos na tabela, mas no grid eu quero mostrar somente alguns. Vou experimentar esse seu exemplo, Marcus, e depois t digo.
GOSTEI 0
Paulo
02/03/2004
Marcus, assim fica um tanto inviável, e o exemplo só colore colunas, e eu quero linhas. Vou tentar colorir somente as fontes obedecendo os critério já citados bem acima. Somente as fontes.
GOSTEI 0
Marco Salles
02/03/2004
Marcus, assim fica um tanto inviável, e o exemplo só colore colunas, e eu quero linhas. Vou tentar colorir somente as fontes obedecendo os critério já citados bem acima. Somente as fontes.
O Exemplo Colore Se Voce Quiser As Linhas Da Coluna Que Satisfaçam a Condição Que Voce Determinar...Basta Adicionar Uma Condição And Ao Código
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin begin if (Column.Field= Table1.FieldByName(´Nome De Um Campo´))And (Table1.FieldByName(´Nome De Um Campo´)=Condição then begin DBGrid1.Canvas.Brush.Color:= clAqua;//Escolha a Que V.c Quer Usar DBGrid1.Canvas.Font.Color:=clHighlightText; end; DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end;
GOSTEI 0