Selecionar cor do DbGrid Por Grupo
esse codigo é un numeto inteiro e podemos ter vários registros com um mesmo codigo
Exemplo de resultado apos a consulta
descricao operacao
blablabla 10
blablabla 10
blablabla 9
blablabla 8
blablabla 8
blablabla 8
blablabla 8
blablabla 7
blablabla 7
blablabla 6
etc....
O que eu gostaria de fazer é agrupar este resultado em cores no dbgrid...
Assim o dbgrid ficara com aspecto Zebrado ...so que em enves do teste
order(RebNo) Tradicional gostaria de fazer um teste levando em consideração o Valor da operacao
Alguma idéia .. Obrigado...
Marco Salles
Respostas
Marco Salles
03/08/2005
esse codigo é un numero inteiro e podemos ter vários registros com um mesmo codigo
Exemplo de resultado apos a consulta ::::
descrição operação
blablabla 10
blablabla 10
blablabla 9
blablabla 8
blablabla 8
blablabla 8
blablabla 8
blablabla 7
blablabla 7
blablabla 6
etc....
O que eu gostaria de fazer , é agrupar este resultado em cores no dbgrid...
[b:86934de4d3]Assim o dbgrid ficara com aspecto Zebrado ...so que em envês do teste
order(RebNo) Tradicional gostaria de fazer um teste levando em consideração o Valor da operacao ..
Assim por exemplo , todos os registros de opreação 10 Ficassem com a mesma cor , depois vem os registros com Operação 9 que ficaria de cor diferente , depois os registros de operação 8 que ficaria com a mesma cor dos registros de operação 10, e assim sucessivamente...[/b:86934de4d3]
Alguma idéia .. Obrigado...
Marco Salles
03/08/2005
Eu libero tantas coisas aqui no forum :cry: :cry: :cry: :cry: :cry:
Massuda
03/08/2005
No momento do teste, dentro do OnDrawColumnCell do DBGrid, a tabela/query estará posicionada no registro que está sendo desenhado, por isso basta testar diretamente o valor do campo que contem o seu critério de qual cor usar.
Marco Salles
03/08/2005
[b:3b0b00ca57]ai que esta o problema massuda .. eu não tenho este valor [/b:3b0b00ca57].. ele pode ser qualquer coisa 1,2,3,4,5,6,7,8,9,1000,1005 etc
podem existir uma quantidade de rgistro com a operação igual ao valor 1 , outras quantidades de registros com a operação igual a 2 , e assim segue....
O que eu quero e que toda vez que mudar o valor da operação , o dbgrid mude de cor..
[b:3b0b00ca57]Atenção , não é um dbgrid com várias cores , e sim um dbGrid com duas cores que ficam se alternando entre os diversos valores de
que o campo Operação adquire[/b:3b0b00ca57]
Obrigado...
Marco Salles
03/08/2005
Massuda
03/08/2005
Imaginando que o valor de campo é sequencial e que a query está agrupada (via GROUP BY operacao) e ordenada, poderia fazer algo bem simples...
if Odd(seuDataSet.FieldByName(´operacao´).AsInteger) then
{usa uma cor}
else
{usa outra cor};Marco Salles
03/08/2005
com o maior prazer...
ela esta ordenada em forma decrescente.. Mas não esta agrupada
o valor da operação é saltado... Ele pode ser todo par como também pode ser todo Impar Como pode ter para ou Impar
Mas acho que a dificuldade de atingir este objetivo com uma query auxiliar é a mesma dificuldade de atingir este objetivo com a própria query , visto que esta query é editável :( :( :(
Massuda
03/08/2005
{ 1, 2, 4, 123, 12023, 230490 }
...quando um item tem operacao=1 uso a cor A, operacao=2 uso a cor B, operacao=4 uso a cor A, etc, onde a cor é escolhida com base na posição da operacao dentro da query auxiliar.
[quote:0f85225863=´Marco Salles´]...visto que esta query é editável[/quote:0f85225863]Nesse caso, cada vez que o valor de operacao for alterado será preciso recalcular as cores usadas no dbgrid, já que o usuário poderia usar um valor de operacao que não estava em uso anteriormente ou deixar de usar um valor que estava em uso.
Marco Salles
03/08/2005
Mas com eu vou comparar algo que eu não sei em termos de projeto :?: :?:
Em termos de projeto eu não sei se vai existir um campo operação com o valor igual a 1 Por exemplo
Na realidade eiu esto seguindo uma linha de raciocíneo assim
Para Registros com mesmo valor de operação , a cor é uma , quando se muda o valor da operação , se alterna a cor
eu to conseguindo algo parecido com o codigo abaixo , mas da dando uma imperfeição na hora de desenhar a Grid :cry: :cry: :cry:
Não esta colorindo ela de maneira Perfeita :( :( :(
Ta aparecendo assim
[URL=http://imageshack.us][img:80fd5b774f]http://img138.imageshack.us/img138/2930/imagemmassuda15dq.jpg[/img:80fd5b774f][/URL]
quando o correto seria assim :::
[URL=http://imageshack.us][img:80fd5b774f]http://img138.imageshack.us/img138/9079/imagemmassuda21jc.jpg[/img:80fd5b774f][/URL]
Massuda
03/08/2005
SELECT * FROM suaTabela WHERE Data >= :DataInicial AND Data <= :DataFinal
SELECT DISTINCT operacao FROM suaTabela WHERE Data >= :DataInicial AND Data <= :DataFinal
Note que não estou assumindo que um determinado valor de operacao existe... estou assumindo que todos os valores de operacao que interessam estão na query auxiliar.
Infelizmente, cada vez que os valores forem alterados pelo usuário, você tem que executar novamente a query auxiliar e refazer o desenho do grid.
Marco Salles
03/08/2005
procedure TFormMovimentoCheques.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var NovoCodigooperacao:String; begin NovoCodigoOperacao:=Query1.FieldByName(´Operacao´).AsString; if (NovoCodigoOperacao=CodigoAtualOperacao)and(PrimeiraVez) then begin DBGrid1.Canvas.Brush.Color:=clInfoBk; PrimeiraVez:=True; end else begin if PrimeiraVez Then begin DBGrid1.Canvas.Brush.Color:=clInactiveCaptionText; CodigoAtualOperacao:=NovoCodigoOperacao; PrimeiraVez:=False; end else if (NovoCodigoOperacao<>CodigoAtualOperacao) Then begin DBGrid1.Canvas.Brush.Color:=clInfoBk; CodigoAtualOperacao:=NovoCodigoOperacao; PrimeiraVez:=True; end else begin DBGrid1.Canvas.Brush.Color:=clInactiveCaptionText; CodigoAtualOperacao:=NovoCodigoOperacao; PrimeiraVez:=False; end; end; DBGrid1.Canvas.FillRect(Rect); DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top,Column.Field.AsString); end;
[b:62348e9003]eu ainda não testei o codigo exaustivamente , mas talvez venha a ter problema com a inicialização das Variáveis CodigoAtualOperacao e PrimeiraVez[/b:62348e9003]
Estou fazendo assim : Antes da consulta eu atribuo os valores de
CodigoAtualOperacao:=´0´; PrimeiraVez:=True;
[b:62348e9003]Mas no final do processo estas variáveis podem ser quisquer valores e alem do mais , quando o desenho da grade começar novamente , posso ter alguma cintilação...[/b:62348e9003]
Eu não sei se voce esta me entendendo , mas suponha que no final do processo a variável primeiraVez seje diferente do valor Inicial , e o processo OnDrawColumnCell é reiniciado , Logo o Grid pode assumir Cores alternadas.. Quero dizer , ora algums registros possuem a cor A , ora esses mesmo registros irão possuir a cor B.. Entende :?: :?:
Então eu queria saber o seguinte , apos a grid ser toda desenhada , no final eu nomamente atribuir estes valores para essas variáveis.
Tipo isso:
Fim do desenho
CodigoAtualOperacao:=´0´; PrimeiraVez:=True;
Existe evento para isto No Delphi massuda ??? Ou alguma idéia de quando este evento OnDrawColumnCell Termine
Obrigado....
P:S este evento OnDrawColumnCell eu ate hoje não consegue depura-lo.. então fica dificil saber como as coisa estão se comportando.. Parece que ele depos de começado não termina nunca :cry: :cry: :cry:
Obrigadão :P :P :P :P
Massuda
03/08/2005
Se você por um breakpoint no seu código de desenho no OnDrawColumnCell, quando chega no breakpoint, você vai para a IDE do Delphi; quando você dá F9 na IDE para voltar a executar, seu programa precisa ser exibido novamente, gerando novamente o evento OnDrawColumnCell. Por isso ele parece ´não ter fim´.
Não parei para olhar atentamente seu código, mas tem um detalhe que você precisa prestar atenção: o evento OnDrawCell é gerado de modo que não é possível assumir em qual ordem o evento será gerado. Por exemplo, se você cobrir parcialmente o DBGrid com (por exemplo) a Calculadora do Windows e mover a Calculadora de baixo para cima sobre o DBGrid, o evento poderá ser gerado do final para o início do seu dataset (ou pode ser gerado apenas uma vez, do início para o fim do dataset... depende das configurações do Windows).
Marco Salles
03/08/2005
É de fato ele fica ´manchado´ apos mover a calculadora sobre a Grid..
Como se pode notar pela figura abaixo
[URL=http://imageshack.us][img:1302b6db12]http://img326.imageshack.us/img326/159/imagemmassuda32yg.jpg[/img:1302b6db12][/URL]
Mas acho que este problema , como voce descreveu não é um Problema so Meu..A crdito que muitas pessoas que desenvolvem código usando este evento irá ocorrer este problema
Para resolver este inconveniente Pensei tive esta idéia :
Quando a aplicação recebe o foco novamente eu dou o seguinte comando
DbGrid1.Visible:=FALSE; DbGrid1.Visible:=True
[b:1302b6db12]Fiz isto num botão e deu certo , mas acho que o local ideal seria , toda a vez que a aplicação recebe-se o foco... [/b:1302b6db12]
Mas qual o evento que eu poderia colocar este código amigo massuda :?: :?: :?: Tentei usar um componente TApplication mas não soube detectar o evento adequado :cry: :cry: :cry:
Uma outra coisa que talvez voce pude-sse me ajudar é o seguinte.. O Campo valor e Currency e sem usar o evento DBGrid1DrawColumnCell ele é desenhado na grid com a unidade monetaria e Formatado.. Mas com ose pode notar , no desenho acima ele aparece sem o valor da unidade monetária e totalemte desformata-do...
[color=darkblue:1302b6db12][b:1302b6db12](59,85 ; 80,8 ; 246,6 ; 227,48 ; 42 ; 39 )[/b:1302b6db12][/color:1302b6db12]
Como corrigir isto massuda :?: :?: :?: :?:
Massuda
03/08/2005
Marco Salles
03/08/2005
[b:96b6be94cf]Porém na prática eu nunca observei diferenças entre deixar esta propriedade defaultDrawing em false ou deixa-la em True [/b:96b6be94cf]:cry:
[color=darkblue:96b6be94cf][b:96b6be94cf]Voce sabe alguma coisa a respeito disso[/b:96b6be94cf][/color:96b6be94cf] :?: :?: :?:
Alem disso , com aqui no forum todos usam o código ,
e eu não tinha ná prática observado nada que contraria-se o seu uso , eu ja tinha descartado a chamada a este método
Nos primeiros tópicos no inicio de minha participação aqui no forum eu sugeri o uso dessa chamada.. como se pode verificar no tópico abaixo
datado de Sex Fev 27, 2004
http://forum.devmedia.com.br/viewtopic.php?t=37160&highlight=defaultdrawdatacell&sid=42047c6d85c9e8992abdb2e638013433
[b:96b6be94cf]Mas como eu disse , por falta de algum efeito prático eu descartei a utilização dessa chamada.. [/b:96b6be94cf]
Mas voltando a atenção para o outro problema:::::
Massuda por acaso voce não tem nenhuma idéia para eu ficar livre desse efeito manchado que se obtem quando se movimenta a calculadora em cima da Grid por exemplo... Nen minha idéia inicial de esconder e apresentar a Grid quando a applicação vier para frente voce acha viável
Obrigado pela força..
Marco Salles
03/08/2005
Alguem tem uma idéia que possa contornar este problema
Algo que sinta o ´movimento´ de por exemplo da calculadora sobre a Grid antes que o evento OnDrawColumm seje disparado....
Pode ser qualquer idéia , porque é atraves de pequenas coisas que grandes coisas são feitas...
Massuda
03/08/2005
[quote:0fb4905bc3=´Marco Salles´]...idéia para eu ficar livre desse efeito manchado que se obtem quando se movimenta a calculadora em cima da Grid por exemplo...[/quote:0fb4905bc3]Acho que isso acontece porque seu código de desenho assume que as células/linhas são desenhadas em uma determinada ordem (do primeiro para o último registro).
Marco Salles
03/08/2005
Ate mesmo em nivel de projeto , quando se tem TDBGrid.DefaultDrawing é False so fica mesmo as bordas da celula...
os livros citam isto :
[b:6bff7e0b85]Sinceramente , nunca entendi este paragrafo[/b:6bff7e0b85] :cry: :cry: :cry: :cry: Não vejo na prática o ganho que se tem em deixar a Propriedade DefaultDrawing em False ou deixa-la em true e depois chamar o método OnDrawColumCell :?: :?: :?:
Quando a segunda parte do problema...
é mais ou menos por ai , porque na verdade as minhas variáveis CodigoInicial e primeiraVez teriam que ser Inicializadas , ja que elas sofrem alteração , quando no decorrer do evento OnDrawColumCell
eu acho que é isso que eu preciso, algo que me indicasse quando o evento ondrawColum ira ser disparado ou algo que me indicasse quando este evento foi terminado
Porque ai eu posso Incializar as minha variáveis valor[b:6bff7e0b85]
...Não existe nenhum evento que anteceda este evento ou o preceda :?: :?: :?: [/b:6bff7e0b85]
Massuda
03/08/2005
[quote:80fc6f71a5=´Marco Salles´]...Não existe nenhum evento que anteceda este evento ou o preceda?[/quote:80fc6f71a5]Não. O evento de desenho pode ocorrer a qualquer momento para qualquer parte do DBGrid. O Windows, para minimizar o desenho na tela, pode gerar o evento de desenho para uma célula em particular do DBGrid e deixar o restante do DBGrid sem redesenhar (porque não há necessidade).
Marco Salles
03/08/2005
Bem , então eu estou com este inconveniente :cry: :cry: :cry: :cry: :cry:
[b:b17f99f03f]Vamos voltar a Query aux[/b:b17f99f03f]
[b:b17f99f03f]A consulta numa Query Auxiliar me trará todos os valores da operação , usando o Distict[/b:b17f99f03f] , Mas eu não sei quantos Registros a consulta ira me retornar.. Então mais uma vez eu bato na tecla :arrow:
Como vou poder fazer a nivel de projeto um código para ser colocado dentro Do evento OnDrawCollum que compara algo que eu não sei o que é e quanto vale:?: :?: :?:
Além disso , como é que vou varrer esta Query Aux se o DbGrid em questão esta Linkado a Query Da Consulta Principal
Massuda
03/08/2005
Massuda
03/08/2005
Marco Salles
03/08/2005
[b:ffa2baab1a]Sim[/b:ffa2baab1a]
[b:ffa2baab1a]aparece , mas o meu Grid tem font (Size=14) e não dá para mostrar todos os campos de uma só vez.. [/b:ffa2baab1a]
:idea: :idea: :idea: :idea: :idea:
Vou tentar passar a idéia...
[b:ffa2baab1a]Tenho cadastrado varios cheques Predatados[/b:ffa2baab1a]
O Usuário , Na grid no campo Movimentação ( [b:ffa2baab1a]O Unico Campo editável Da Grid[/b:ffa2baab1a]) seleciona atraves de Um PickList o que sera feito com este Cheque
Posso com um cheque efetuar cinco Movimentos
a)Depositos em C:C B)Depositos em C:P C)Retirada (mediante Saque) D)Descontos em Banco E)Pagamentos de Contas
Mas numa mesma Transação o usuário pode escolher o destino de [color=darkblue:ffa2baab1a][b:ffa2baab1a]vários[/b:ffa2baab1a][/color:ffa2baab1a] Cheques....
[color=darkblue:ffa2baab1a][b:ffa2baab1a]E para cada transação o valor da operação é unico.[/b:ffa2baab1a][/color:ffa2baab1a]
:idea: :idea: :idea: :idea:
Então eu sei atraves de um pesquisa quais os cheques que foram depositados por exemplo na C:C e posso ainda determinar atraves da Operação o conjunto de cheques para cada depositos
:cry: :cry: :cry: :cry:
Eu não posso fazer isto atraves de uma [b:ffa2baab1a]pura Propriedade data [/b:ffa2baab1a], porque num mesmo dia pode-se[color=darkblue:ffa2baab1a][b:ffa2baab1a] ter dois ou mais depositos distintos [/b:ffa2baab1a][/color:ffa2baab1a]Na mesma C:C e a data seria a mesma
:cry: :cry: :cry:
Antes de salvar o valor da operação , eu pesquiso na Base de Dados o [b:ffa2baab1a]Valor Mazimo do Campo Operação [/b:ffa2baab1a]e Atribuo a ele O [b:ffa2baab1a]Valor maximo da Operação + 1 [/b:ffa2baab1a]
[color=darkred:ffa2baab1a]ATENÇÃO : este campo não é simplesmente Incremental , porque eu permito que se faça alteraçoes na base de dados[/color:ffa2baab1a]
EXEMPLO : Numa transação eu depositei na C:C um Determinado Cheque Vamos supor ainda que numa Transição so houve movimento desse Cheque e que o valor da operação seje 100 Depois desta Transação , outros transaçoes ocorreram e portanto o Valor da Maximo da Operação e diferente de 100 É permitido ao usuário devidamente cadastrado , efetuar alteraçoes na Base De Dados.. Por exemplo , para aquele Cheque da Transação da Operação de Numero 100 quero resgatar este Cheque.. Simplesmente eu apago o Movimento e o Numero da Operação Volta a ser Zero
:arrow: :arrow: [b:ffa2baab1a]Logo a operação 100 Não existe mais na minha Base De Dados...[/b:ffa2baab1a]
Defino os Cheques de Operação = ZERO , sendo Cheques que devem estar Fisicamente em Poder Da Empresa
[b:ffa2baab1a][size=18:ffa2baab1a]Como se ve o Valor da Operação não é sequencial , mas sempre sera Crescente[/size:ffa2baab1a][/b:ffa2baab1a]
:wink: :wink:
Então a logica e mais ou menos isso , com alguma alterações que por ventura virão
CampoMovimento.String = ´´ -->> Operação =ZERO CampoMovimento.String <> ´´ -->> Operação:=Max(Operação) +1 Numa mesma Transação
:idea: :idea: :idea:
[b:ffa2baab1a]A Idéia de agrupar por cor Numa Grid os valores de operação Iguais é para facilitar a vida do usuário a identificar grupos de Cheques que fazem parte de uma mesma operação...[/b:ffa2baab1a]
deu para entender....
Massuda
03/08/2005
Use a query auxiliar para obter os valores (distintos) de OPERACAO que sua query está mostrando no DBGrid. Essa query precisa ser ´refrescada´ cada vez que o usuário alterar os dados no DBGrid (mais precisamente, cada vez que o campo OPERACAO de alguma linha for alterado).
Quando for desenhar uma linha no DBGrid, busque na query auxiliar o valor do campo OPERACAO e assim (por exemplo) determine qual o RecNo do valor dentro da query auxiliar e (por exemplo) se for par use uma cor de fundo, se for ímpar use outra cor.
Kotho
03/08/2005
Edilcimar
03/08/2005
http://forum.clubedelphi.net/viewtopic.php?t=52587&highlight=cor+dbgrid
Marco Salles
03/08/2005
mas vamos concatenar as idéia
[b:8059347fe6]1) massuda[/b:8059347fe6]
mas como fazer com que este [b:8059347fe6]RecNo da query auxiliar mude [/b:8059347fe6], pois o evento OnDrawCollum esta relacionado a QueryPrincipal :?: :?:
Na query principal podemos ter muitos campos com um mesmo valor de operacao e ja na query auxiliar devido a instrução distincts teremos valores distintos desse campo Operação , isto é , valores Únicos...
Como fazer esta comparação na hora de Pintar a Grid :?: :?:
Como mudar o valor do Campo na queryAux :?: :?:
Poderia ser maios ou menos isto
procedure TFormMovimentoCheques.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var NovoCodigooperacao:String; CodigoQueryAuxiliar:String; Color:TColor; begin if Odd(queryAux.RecNo) Then color:=clInfoBk; else Color:=clInactiveCaptionText; NovoCodigoOperacao:=Query1.FieldByName(´Operacao´).AsString; CodigoQueryAuxiliar:=QueryAux.FieldByName(´Operacao´).AsString; if (NovoCodigoOperacao=CodigoQueryAuxiliar)and(Primeira Vez) then begin DbGrid1.Canvas.Font.Color:=clWindowText; DBGrid1.Canvas.Brush.Color:=Color; PrimeiraVez:=True; end else begin if PrimeiraVez Then begin DbGrid1.Canvas.Font.Color:=clWindowText; DBGrid1.Canvas.Brush.Color:=color; QueryAux.Next; PrimeiraVez:=False; end else if (NovoCodigoOperacao<>CodigoQueryAuxiliar) Then begin DbGrid1.canvas.Font.Color:=clWindowText; DBGrid1.Canvas.Brush.Color:=color; QueryAux.Next; PrimeiraVez:=True; end else begin DbGrid1.canvas.Font.Color:=clWindowText; DBGrid1.Canvas.Brush.Color:=Color; QueryAux.Next; PrimeiraVez:=False; end; end; DbGrid1.DefaultDrawDataCell(rect,Column.Field,State); end;
Mas o trabalho que eu tenho nese código é o mesmo que eu tenho no codigo anterior , se não for maior :cry: :cry: :cry: :cry: :cry:
E outra , acho que p Problema da ´mancha´ Na Grid , vai continuar
:cry: :cry: :cry:
Conclusão
[b:8059347fe6]Definitivamente eu não to entendendo sua idéia [/b:8059347fe6] :cry: :cry: :cry:
[b:8059347fe6]Kotho[/b:8059347fe6]
Não .. eu uso query e datasource
Mas acho que a lógica deve ser a mesma
Então , teria sim interresse em ver este código.. :lol: :lol: :lol:
3)[b:8059347fe6]Edicilmar[/b:8059347fe6]
Mas acho que são critérios diferentes
O Meu problema é fazer um agrupamento por cor , quando estiver pintando a Grid
A query que esta Ligada a Grid , se pudermos dizer assim , esta ordenada pelo valor do campo da Operação
Esta ordenação é Decrescente
[b:8059347fe6]Assim por exemplo na query tem :[/b:8059347fe6]
Outros dados...Operacao blablablabla..........A blablablabla..........A blablablabla..........A blablablabla..........A blablablabla..........B blablablabla..........C blablablabla..........C blablablabla..........C blablablabla..........D blablablabla..........D blablablabla..........E blablablabla..........F blablablabla..........F blablablabla..........F blablablabla..........G
[b:8059347fe6]To usando letras que estão representandos Numeros Inteiros...[/b:8059347fe6]
[b:8059347fe6]Gostaria que a grid ficasse com duas cores [/b:8059347fe6]
Todo o registro de Operação = A Ficasse Azul (total de 4 registros) Todo o registro de Operação = B Ficasse Amarelo (total de 1 registros) Todo o registro de Operação = C Ficasse Azul (total de 3 registros) Todo o registro de Operação = D Ficasse Amarelo (total de 2 registros) Todo o registro de Operação = E Ficasse Azul (total de 1 registros) Todo o registro de Operação = F Ficasse amarelo (total de 2 registros) Todo o registro de Operação = G Ficasse amarelo (total de 1 registros)
[b:8059347fe6]Conseguir iste feito eu ate consegui [/b:8059347fe6], :arrow: uzando variáveis e codificação extra.. Mas to esbarrando nun problema que é quando o usuário move alguma coisa sobre a grid --->> Logo apos ele retorna o efeito de Borrado :cry: :cry: :cry: :cry:
[b:8059347fe6]Isto se da devido a explicação que o massuda passou em tópicos anteriores..[/b:8059347fe6]
No aguardo...
Edilcimar
03/08/2005
Massuda
03/08/2005
{123, 345, 346, 456, 890, 999}
Quando for desenhar no DBGrid uma linha cuja OPERACAO seja 456, dê um Locate na query auxiliar para localizar o valor OPERACAO, o que, no exemplo, resulta num item (da query auxiliar) com RecNo = 3; como 3 é impar, use uma determinada cor.
Quando for desenhar no DBGrid uma linha cuja OPERACAO seja 890, dê um Locate na query auxiliar para localizar o valor OPERACAO, o que, no exemplo, resulta num item (da query auxiliar) com RecNo = 4; como 4 é par, use outra determinada cor.
[quote:a476f95ceb=´Marco Salles´]mas como fazer com que este RecNo da query auxiliar mude...[/quote:a476f95ceb]Vai mudar por causa do Locate.
Kotho
03/08/2005
O Código é do Guinter...
Vou colocar o DPR, o DFM e o PAS ok?
GroupingLevel.dpr
(*****************************************************************************
Palestra : ClientDataSet
Palestrante : Guinther de Bitencourt Pauli
guinther@clubedelphi.com.br
(*****************************************************************************)
program GroupingLevel;
uses
Forms,
uFrmMain in ´uFrmMain.pas´ ;
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TFrmMain, FrmMain);
Application.Run;
end.
uFrmMain.dfm
object FrmMain: TFrmMain
Left = 453
Top = 139
Width = 528
Height = 624
Caption = ´ClientDataSet - GroupingLevel´
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = ´MS Sans Serif´
Font.Style = []
OldCreateOrder = True
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object DBGrid1: TDBGrid
Left = 8
Top = 96
Width = 481
Height = 417
DataSource = DataSource1
Options = [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgTabs, dgConfirmDelete, dgCancelOnExit]
ReadOnly = True
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = ´MS Sans Serif´
TitleFont.Style = []
OnDrawColumnCell = DBGrid1DrawColumnCell
Columns = <
item
Expanded = False
FieldName = ´Country´
Width = 127
Visible = True
end
item
Expanded = False
FieldName = ´Company´
Visible = True
end
item
Expanded = False
FieldName = ´Contact´
Visible = True
end>
end
object ClientDataSet1: TClientDataSet
Active = True
Aggregates = <
item
Active = True
GroupingLevel = 1
IndexName = ´COUNTRY´
Visible = False
end>
AggregatesActive = True
FieldDefs = <
item
Name = ´CustNo´
Attributes = [faUnNamed]
DataType = ftFloat
end
item
Name = ´Company´
Attributes = [faUnNamed]
DataType = ftString
Size = 30
end
item
Name = ´Addr1´
Attributes = [faUnNamed]
DataType = ftString
Size = 30
end
item
Name = ´Addr2´
Attributes = [faUnNamed]
DataType = ftString
Size = 30
end
item
Name = ´City´
Attributes = [faUnNamed]
DataType = ftString
Size = 15
end
item
Name = ´State´
Attributes = [faUnNamed]
DataType = ftString
Size = 20
end
item
Name = ´Zip´
Attributes = [faUnNamed]
DataType = ftString
Size = 10
end
item
Name = ´Country´
Attributes = [faUnNamed]
DataType = ftString
Size = 20
end
item
Name = ´Phone´
Attributes = [faUnNamed]
DataType = ftString
Size = 15
end
item
Name = ´FAX´
Attributes = [faUnNamed]
DataType = ftString
Size = 15
end
item
Name = ´TaxRate´
Attributes = [faUnNamed]
DataType = ftFloat
end
item
Name = ´Contact´
Attributes = [faUnNamed]
DataType = ftString
Size = 20
end
item
Name = ´LastInvoiceDate´
Attributes = [faUnNamed]
DataType = ftDateTime
end>
IndexDefs = <
item
Name = ´COUNTRY´
Fields = ´COUNTRY´
GroupingLevel = 1
end>
IndexName = ´COUNTRY´
Params = <>
StoreDefs = True
Left = 216
Top = 176
Data = {
471D00009619E0BD01000000180000000D003700000003000000930106437573
744E6F080004001000000007436F6D70616E7901004900100001000557494454
48020002001E000541646472310100490010000100055749445448020002001E
000541646472320100490010000100055749445448020002001E000443697479
0100490010000100055749445448020002000F00055374617465010049001000
0100055749445448020002001400035A69700100490010000100055749445448
020002000A0007436F756E747279010049001000010005574944544802000200
14000550686F6E650100490010000100055749445448020002000F0003464158
0100490010000100055749445448020002000F00075461785261746508000400
1000000007436F6E746163740100490010000100055749445448020002001400
0F4C617374496E766F69636544617465080008001000000003000D4445464155
4C545F4F524445520400820001000000010000000B5052494D4152595F4B4559
040082000100000001000000044C434944020001000904000000000000000000
00149340114B6175616920446976652053686F70706513342D39373620537567
61726C6F616620487779095375697465203130330B4B61706161204B61756169
0248490A39343736362D313233340255530C3830382D3535352D303236390C38
30382D3535352D3032373800000000000021400C4572696361204E6F726D616E
000CDBC6B59DCC42004014000000000000003C934006556E6973636F0C504F20
426F78205A2D3534370846726565706F727407426168616D61730C3830392D35
35352D333931350C3830392D3535352D3439353800000000000000000F47656F
72676520576561746865727300D497E9F09CCC42004014000000000000001C95
400B53696768742044697665720E31204E657074756E65204C616E650B4B6174
6F20506170686F73064379707275730C3335372D362D3837363730380C333537
2D362D38373039343300000000000000000F5068796C6C69732053706F6F6E65
7200181638A49CCC42004014000000000000002895401D4361796D616E204469
7665727320576F726C6420556E6C696D697465640A504F20426F78203534310C
4772616E64204361796D616E1342726974697368205765737420496E64696573
0C3031312D352D3639373034340C3031312D352D363937303634000000000000
00000A4A6F65204261696C657900E0F509A892CC420040000000000000000030
954018546F6D2053617779657220446976696E672043656E747265153633322D
312054686972642046727964656E686F6A0D43687269737469616E7374656409
53742E2043726F69780530303832301155532056697267696E2049736C616E64
730C3530342D3739382D333032320C3530342D3739382D373737320000000000
0000000C43687269732054686F6D617300F01A992993CC420000000000000000
000090954015426C7565204A61636B20417175612043656E7465721632332D37
33382050616464696E67746F6E204C616E650953756974652033313007576169
706168750248490539393737360255530C3430312D3630392D373632330C3430
312D3630392D3934303300000000000000000E45726E65737420426172726174
74008078B9DA9CCC4200400000000000000000A095400F564950204469766572
7320436C75620B3332204D61696E2053742E0D43687269737469616E73746564
0953742E2043726F69780530323830301155532056697267696E2049736C616E
64730C3830392D3435332D353937360C3830392D3435332D3539333200000000
000000001352757373656C6C204368726973746F7068657200DC0E19B59DCC42
004000000000000000009897400E4F6365616E2050617261646973650B504F20
426F7820383734350B4B61696C75612D4B6F6E61024849053934373536025553
0C3830382D3535352D383233310C3830382D3535352D38343530000000000000
00000C5061756C20476172646E6572005882F0DA9CCC42004014000000000000
00A497401446616E7461737469717565204171756174696361145A3332203939
3920233132412D373720412E412E06426F676F746108436F6C756D6269610C30
35372D312D3737333433340C3035372D312D3737333432310000000000000000
0A537573616E20576F6E670064071BB79BCC42004000000000000000003C9840
124D61726D6F742044697665727320436C75620D38373220517565656E205374
2E094B69746368656E6572074F6E746172696F0747334E203245310643616E61
64610C3431362D3639382D303339390C3432362D3639382D3033393900000000
000000000B4A6F796365204D617273680008486FE78CCC420040000000000000
0000609840105468652044657074682043686172676515313532343320556E64
65727761746572204677792E084D61726174686F6E02464C0533353030330255
530C3830302D3535352D333739380C3830302D3535352D303335330000000000
0000000F53616D2057697468657273706F6F6E0030E2A4B49ACC420040000000
00000000006C98400B426C75652053706F727473153230332031327468204176
652E20426F7820373436094769726962616C6469024F52053931313837025553
0C3631302D3737322D363730340C3631302D3737322D36383938000000000000
00000D54686572657361204B756E656300F80031FC8FCC420040000000000000
0000609940104D616B616920534355424120436C75620B504F20426F78203835
33340B4B61696C75612D4B6F6E610248490539343735360255530C3331372D36
34392D393039380C3331372D3634392D3637383700000000000000000B446F6E
6E612053696175730028DE34749DCC4200400000000000000000B499400B4163
74696F6E20436C75620D504F20426F7820353435312D460853617261736F7461
02464C0533323237340255530C3831332D3837302D303233390C3831332D3837
302D303238320000000000000000104D69636861656C20537075726C696E6700
9812D5F798CC4200401000000000000000CC9940144A616D6169636120534355
42412043656E74726509504F20426F78203638064E656772696C074A616D6169
63610B5765737420496E646965730C3031312D332D3639373034330C3031312D
332D36393730343300000000000000000E426172626172612048617276657900
380E71BF94CC4200400000000000000000409A400E49736C616E642046696E64
657273153631333320312F332053746F6E65204176656E75650E53742053696D
6F6E732049736C650247410533323532310255530C3731332D3432332D353637
350C3731332D3432332D3536373600000000000000000E4465736D6F6E64204F
727465676100901CDD669DCC4200401400000000000000009F4012416476656E
7475726520556E6465727365610A504F20426F78203734340B42656C697A6520
436974790642656C697A650C3031312D33342D30393035340C3031312D33342D
303930363400000000000000000F476C6F72696120476F6E7A616C657300980F
D9D49CCC42004000000000000000008CA04010426C75652053706F7274732043
6C7562163633333635204E657A20506572636520537472656574054C6172676F
02464C0533343638340255530C3631322D3839372D303334320C3631322D3839
372D3033343800000000000000000E48617272792042617468626F6E65006864
839D8CCC4200400000000000000000AEA040154672616E6B2773204469766572
7320537570706C791331343535204E6F72746820343474682053742E06457567
656E65024F520539303432370255530C3530332D3535352D323737380C353033
2D3535352D3237363900000000000000000D4C6C6F79642046656C6C6F777300
C82EC61A89CC4200400000000000000000D8A0401244617679204A6F6E657327
204C6F636B65721432343620536F757468203136746820506C6163650956616E
636F75766572024243074B3856203950310643616E6164610C3830332D353039
2D303131320C3830332D3530392D3035353300000000000000000C54616E7961
205761676E65720058886ACA91CC4200401400000000000000E6A0400C534355
42412048656176656E0D504F20426F7820512D38383734064E61737361750742
6168616D61730C3031312D33322D30393438350C3031312D33322D3039343835
000000000000000010526F62657274204D696368656C696E6400B0DAC69E8ECC
4200401400000000000000EAA040185368616E6772692D4C612053706F727473
2043656E7465720D504F20426F7820442D353439350846726565706F72740742
6168616D61730C3031312D33322D30383537340C3031312D33322D3434393338
00000000000000000E4672616E6B2050616E69616775610074867D3289CC4200
40100000000000000016A24015446976657273206F6620436F7266752C20496E
632E114D61726D6F73657420506C6163652035340F4179696F73204D61747468
61696F7305436F726675064772656563650C33302D3636312D38383336340C33
302D3636312D303539343300000000000000000D436861726C6573204C6F7065
7A004028065C9BCC420040000000000000000064A240104B69726B20456E7465
727072697365730C34322041717561204C616E6507486F7573746F6E02545805
37373037390255530C3731332D3535362D363433370C3731332D3535362D3130
373300000000000000000D5275646F6C706820436C61757300545FD51A9ACC42
004000000000000000003EA7401147656F726765204265616E202620436F2E13
233733204B696E672053616C6D6F6E20576179064C75676F6666024E43053239
3037380255530C3830332D3433382D323737310C3830332D3433382D33303033
00000000000000000A42696C6C20577965727300386112AC9ACC420040000000
000000000050A7401950726F66657373696F6E616C204469766572732C204C74
642E1034373334204D656C696E64612053742E06486F6F76657202414C053332
3134350255530C3230352D3535352D383333330C3230352D3535352D34303534
00000000000000000F536869726C6579204D617468657273001C4490F89ACC42
00400000000000000000C2A74014446976657273206F6620426C75652D677265
656E1036333420436F6D706C6578204176652E0650656C68616D02414C053332
3134350255530C3230352D3535352D373138340C3230352D3535352D36303539
00000000000000000A4E616E6379204265616E00988CDA4E9ACC420040000000
0000000000C4A74011476F6C6420436F61737420537570706C79133232332D42
20486F7573746F6E20506C616365064D6F62696C6502414C0533303639360255
530C3230352D3535352D323634300C3230352D3535352D343039340000000000
0000000C456C61696E652046616C6C7300A0F704A69BCC420040000000000000
0000D6A7401553616E205061626C6F20446976652043656E7465721131373031
2D44204E2042726F61647761790B53616E7461204D6172696102434105393534
34330255530C3832332D3034342D323931300C3832332D3034342D3239393000
00000000000000105061747269636961204F27427269656E0044EFE7BD9BCC42
00400000000000000000D8A74015556E64657277617465722053706F72747320
436F2E123335312D412053617261736F74612053742E0853616E204A6F736502
43410539323139350255530C3430382D3836372D303539340C3430382D383637
2D3030393400000000000000000C446176652057616C6C696E6700F0E9F7659C
CC4200400000000000000000DAA74015416D65726963616E2053435542412053
7570706C7914313733392041746C616E746963204176656E7565064C6F6D6974
610243410539313737300255530C3231332D3635342D303039320C3231332D36
35342D303039350000000000000000104C796E6E2043696E6369726970696E69
002CAD736C9DCC4200400000000000000000DCA74013436174616D6172616E20
4469766520436C756216426F782032363420506C65617375726520506F696E74
0F436174616C696E612049736C616E640243410539303734300255530C323133
2D3232332D303934310C3231332D3232332D3233323400000000000000000D4E
69636F6C65204475706F6E7400B06C4BA79CCC4200400000000000000000DEA7
400E446976657227732047726F74746F14323436303120556E6976657273616C
204C616E6506446F776E65790243410539343232300255530C3231332D343332
2D303039330C3231332D3433322D3438323100000000000000000A5065746572
204F77656E00148C75089DCC42004014000000000000009EA8400F4669736865
726D616E2773204579650B504F20426F7820373534320C4772616E6420436179
6D616E1342726974697368205765737420496E646965730C3830392D3535352D
343638300C3830392D3535352D3436383900000000000000000C42657468616E
204C657769730030BCCCD99BCC4200400400000000000000ACA8401341637469
6F6E20446976657220537570706C7910426C7565205370617220426F78202333
0A53742E2054686F6D61730530303832301155532056697267696E2049736C61
6E64730C32322D34342D3530303231310C32322D34342D353030353936000000
00000000000E4D617269616E6E65204D696C6573004C85DB7598CC4200401400
0000000000003EAC40134D6172696E612053435542412043656E74657216504F
20426F78203832343338205A756C75203738333107436172616361730956656E
657A75656C610B35382D33332D36363232320B35382D33332D36363034390000
0000000000000E5374657068656E20427279616E7400180C805C97CC42004000
0000000000000020AF4014426C756520476C6173732048617070696E65737312
3633343520572E2053686F7265204C616E650C53616E7461204D6F6E69636102
43410539303431300255530C3231332D3535352D313938340C3231332D353535
2D31393935000000000000000010436872697374696E65205461796C6F7200AC
FD03169DCC4200400000000000000000D8B04010446976657273206F66205665
6E6963650E32323020456C6D205374726565740656656E69636502464C053339
3232340255530C3831332D3434332D323335360C3831332D3434332D39383432
00000000000000000C53696D6F6E6520477265656E00B823820A99CC42004000
00000000000000B3B1400F4F6E2D54617267657420534355424115372D373337
3633204E616E616B61776120526F61640857696E6E69706567084D616E69746F
6261074A3252203554330643616E6164610C3431362D3434352D303938380C34
31362D3434352D3032323300000000000000000D4272616D205068696C6C6970
7300C00E81CC99CC42004010000000000000002CB240114A616D616963612053
756E2C20496E632E0A504F20426F78203634330B52756E617761792042617907
4A616D616963610B5765737420496E646965730C3830392D3535352D32373436
0C3830392D3535352D3039323900000000000000000D4A6F6E617468616E2057
6573740054C4A73A9DCC42004010000000000000004CB24012556E6465727761
7465722046616E746173790A504F20426F7820383432094F63686F2052696F73
074A616D616963610B5765737420496E646965730C3830392D3535352D323231
340C3830392D3535352D3232333400000000000000000F4772616E742041696E
73776F72746800E8BD1E199CCC42004014000000000000000CB440155072696E
636573732049736C616E6420534355424111504F20426F782033322057616979
65766F0754617665756E690446696A690A3637392D3331313932330A3637392D
33313132303300000000000000000D416E6E65204D617269616368690034564F
018BCC42004004000000000000001FB4401B43656E7472616C20556E64657277
6174657220537570706C6965730A504F20426F78203733370C4A6F68616E6E65
736275726704323034321352657075626C696320536F2E204166726963610D32
372D31312D343433323435380D32372D31312D34343333323539000000000000
00000E4D61726961204576656E746F736800AC7945E59CCC4200401400000000
0000002BB4401453616661726920556E64657220746865205365610B504F2042
6F7820373435360C4772616E64204361796D616E134272697469736820576573
7420496E646965730C3830392D3430392D343233330C3830392D3430392D3330
3032000000000000000009416E6E61205261636B00A8F851A398CC4200400000
0000000000002DB440154C61727279277320446976696E67205363686F6F6C14
33353632204E5720427275636520537472656574094D696C7761756B6965024F
520539363237370255530C3530332D3430332D373737370C3530332D3430332D
3030353900000000000000000E49736162656C6C65204E656563650074F66022
9BCC420040140000000000000008B5400E546F726120546F726120546F72610D
504F20426F7820482D34353733064E617373617507426168616D61730C383039
2D3839382D303034330C3830392D3839382D3938363400000000000000000B4B
6576696E20526964657200989BFEBD9DCC420040000000000000000024B5400F
566173686F6E2056656E747572657311373433204B6579686F6C6520436F7572
7408486F6E6F6C756C750248490539323835360255530C3533322D3039392D30
3432330C3533322D3039392D3636353400000000000000000B537573616E2053
6D69746800583E61E399CC420040140000000000000038B5400F446976657273
2D666F722D486972650D472E4F2E205020426F7820393104537576610446696A
690A3637392D3830343537360A3637392D30353933343500000000000000000A
4A6F652048617474657200203117FF99CC42004000000000000000008BB54010
4F6365616E20416476656E747572657310504F20426F7820343636204B696865
69044D6175690248490539353733360255530C3737362D3836382D393333340C
3737362D3836382D3935353300000000000000000A5061756C205374696C6C00
B05D11779DCC420040040000000000000047B84018556E646572776174657220
534355424120436F6D70616E790C504F20426F7820536E20393108536F6D6572
736574045358424E074265726D7564610C3830392D3535352D313232350C3830
392D3535352D323434350000000000000000104D69636861656C2047726F7373
6D616E0068BC22B19ACC4200400000000000000000A8B8400D41717561746963
204472616D61123932312045766572676C61646573205761790554616D706102
464C0533303634330255530C3631332D3434322D373635340C3631332D343432
2D3736373800000000000000000C47696C6C69616E204F77656E007008D62F88
CC420040040000000000000074B9401254686520446976696E6720436F6D7061
6E790B504F20426F7820383533350A53742E2054686F6D617305303038323011
55532056697267696E2049736C616E64730B32322D34342D35303039380B3232
2D34342D303938373800000000000000000B427269616E204D696C657300288A
D3DC99CC4200400400000000000000B6B940184E6F7277657374276572205343
554241204C696D697465640B504F20426F782036383334055061676574045053
425A074265726D7564610C3737382D3132332D303734350C3737382D3132332D
3937303500000000000000000C416E67656C61204A6F6E657300E8CBF6B89DCC
42004000000000000000009CBA4017576174657273706F757420534355424120
43656E7465721237383635204E45204261726265722043742E08506F72746C61
6E64024F520539393237310255530C3530332D3635342D323433340C3530332D
3635342D3939383600000000000000000E5269636861726420486F7573657200
048A36919CCC420040100000000000008038C340184E657074756E6527732054
726964656E7420537570706C790A504F20426F7820313239064E656772696C07
4A616D616963610B5765737420496E646965730C3737382D3839372D33353436
0C3737382D3839372D3636343300000000000000000D4C6F7569736520467261
6E6B7300446FBD72A0CC42}
object ClientDataSet1CustNo: TFloatField
FieldName = ´CustNo´
end
object ClientDataSet1Company: TStringField
FieldName = ´Company´
Size = 30
end
object ClientDataSet1Addr1: TStringField
FieldName = ´Addr1´
Size = 30
end
object ClientDataSet1Addr2: TStringField
FieldName = ´Addr2´
Size = 30
end
object ClientDataSet1City: TStringField
FieldName = ´City´
Size = 15
end
object ClientDataSet1State: TStringField
FieldName = ´State´
end
object ClientDataSet1Zip: TStringField
FieldName = ´Zip´
Size = 10
end
object ClientDataSet1Country: TStringField
FieldName = ´Country´
OnGetText = ClientDataSet1CountryGetText
end
object ClientDataSet1Phone: TStringField
FieldName = ´Phone´
Size = 15
end
object ClientDataSet1FAX: TStringField
FieldName = ´FAX´
Size = 15
end
object ClientDataSet1TaxRate: TFloatField
FieldName = ´TaxRate´
end
object ClientDataSet1Contact: TStringField
FieldName = ´Contact´
end
object ClientDataSet1LastInvoiceDate: TDateTimeField
FieldName = ´LastInvoiceDate´
end
end
object DataSource1: TDataSource
DataSet = ClientDataSet1
Left = 328
Top = 176
end
end
uFrmMain.pas
(*****************************************************************************
Palestra : ClientDataSet
Palestrante : Guinther de Bitencourt Pauli
guinther@clubedelphi.com.br
(*****************************************************************************)
unit uFrmMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls, ComCtrls, DB, DBClient,
Grids, DBGrids, Buttons;
type
TFrmMain = class(TForm)
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ClientDataSet1CustNo: TFloatField;
ClientDataSet1Company: TStringField;
ClientDataSet1Addr1: TStringField;
ClientDataSet1Addr2: TStringField;
ClientDataSet1City: TStringField;
ClientDataSet1State: TStringField;
ClientDataSet1Zip: TStringField;
ClientDataSet1Country: TStringField;
ClientDataSet1Phone: TStringField;
ClientDataSet1FAX: TStringField;
ClientDataSet1TaxRate: TFloatField;
ClientDataSet1Contact: TStringField;
ClientDataSet1LastInvoiceDate: TDateTimeField;
procedure FormCreate(Sender: TObject);
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure ClientDataSet1CountryGetText(Sender: TField;
var Text: String; DisplayText: Boolean);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
sl : TStringList;
end;
var
FrmMain: TFrmMain;
implementation
{$R *.dfm}
const
Cores : array [1..7] of integer =
($00FFF7E6,$008080FF,$00EAEAEA,$00FFB56A,$00FFECEC,$00E4E4C9,$0080FFFF);
procedure TFrmMain.FormCreate(Sender: TObject);
begin
inherited;
sl := TStringList.Create;
ClientDataSet1.AggregatesActive := True;
end;
procedure TFrmMain.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
i : integer;
begin
if gdSelected in State then exit;
i := (sl.IndexOf(ClientDataSet1Country.AsString) mod 7) + 1;
DBGrid1.Canvas.Brush.Color := Cores[i];
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.DefaultDrawDataCell(Rect,Column.Field,State);
end;
procedure TFrmMain.ClientDataSet1CountryGetText(Sender: TField;
var Text: String; DisplayText: Boolean);
begin
if gbFirst in ClientDataSet1.GetGroupState(1) then
begin
Text := ClientDataSet1Country.AsString;
if sl.IndexOf(Text) < 0 then
sl.Add(Text);
end
else
Text := ´´;
end;
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
inherited;
sl.Free;
end;
end.
Marco Salles
03/08/2005
[b:b74ea8c378]Citacao de Koko:[/b:b74ea8c378]
Pode não servir Hoje , porque pelo menos eu desconheço esta caracteristicas na querys.. Mas fica registrado o seu código , e muito obrigado pela sua cooperação
Valeu mesmo..
[b:b74ea8c378]Citação de edicilmar[/b:b74ea8c378]
Ainda não ataquei esta linha , porque achei mais fácil seguir a dica posterior
Também lhe agradeço pelo seu tempo e muito oBrigado edicilmar
[b:b74ea8c378]citação de massuda[/b:b74ea8c378]
beleza , fiz assim
procedure TFormMovimentoCheques.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var NovoCodigooperacao:integer; begin Novocodigooperacao:=Query1.FieldByName(´Operacao´).Asinteger; queryAux.Locate(´Operacao´,NovoCodigooperacao,[]); if Odd(QueryAux.RecNo) Then begin DbGrid1.Canvas.Font.Color:=clWindowText; DBGrid1.Canvas.Brush.Color:=clInfoBk; end else begin DbGrid1.Canvas.Font.Color:=clWindowText; DBGrid1.Canvas.Brush.Color:=clInactiveCaptionText; end; DbGrid1.DefaultDrawDataCell(rect,Column.Field,State); end;
[b:b74ea8c378]Esta funcionando muito bem[/b:b74ea8c378] :P :P :P :P :P :P :P :P
Mas minhas dúvidas aõa as seguintes :
[b:b74ea8c378]1)[/b:b74ea8c378]
como o prosesso esta no inicio , quase não tenho informaçoes na Base de Dados
A Médida que a Base de Dados aumenta , será que o Tempo necessário para processar esta informação não pode ser motivo de bug :?: :?:
A Minha dúvida é , suponha que o a consulta tenha uma quantidade de Mil Registros...Visivelmente no dbGrid aparece somente 10 ...Este método OnDrawColumm ele so é ativado somente para esses 10 Regsitros Iniciais Ou ele é processado para todos os 1000 Registros , Mesmo que esses não aparecem de uma so vez na Grid :?: :?:
Quero dizer o seguinte.. Deu para perceber que este evento OnDrawCollum é disparado em algumas situações.. Os registos que foram Localizados na minha pesquisa , mas que estão ocultos no DbGrid so irão dispara o evento á medida que a Barra de rolagem seje acionada
:?: :?: :?: :?: :?: :?:
Bem , isto é o que eu acho , porque nesta situção , como o evento OnDrawColum so tem que processar poucos registros , acredito que ele suporta a codificação
[b:b74ea8c378]A Outra duvida é o seguinte[/b:b74ea8c378]
[b:b74ea8c378]2)[/b:b74ea8c378]
Voce usou a velha propriedade RecNo.. So que me recordo que essa propriedade não esta disponivel em todos os Bancos..... Devo trabalhar com o Firibird .. Voce saberia dizer uma propriedade similar no Firibird , ou acha que este agrupamento por cor feito com esta lógica , esta fadada a bancos que possuem esta propriedade
[b:b74ea8c378]3)[/b:b74ea8c378]
Na Hora de usar o distinct Gostaria que o retorno voce , os campos diversos de valor da operação , mas em ordem decrescente
Fis assim
Select distinct (operacao) from TabCheques where Minhas condicoe Order By (Operacao) Des
Pergunto : Eu não consigo , pelo memos da erro , fazer com que o resultado desta consulta esteja ordenado...
Pergunto:
Tem erro neste Código :?: :?: , ou voce acha que isto não é possível usando O Distinct :idea: :idea: .... Ou o Proprio Distinct ja Tras Ordenado :?: :?: , Ou Voce acha que devo abrir un Novo tópico sobre esta questão ( Como eu ja ouvi voce dizer que : ´ Não manjo muito de Sql....´)
Mais uma vez meu muitissimo obrigado [b:b74ea8c378]massuda[/b:b74ea8c378] :P :P :P :P
No aguardo.... :lol:
Massuda
03/08/2005
[quote:5b5e109660=´Marco Salles´]...acredito que ele suporta a codificação[/quote:5b5e109660]A query auxiliar usando DISTINCT tem o inconveniente de exigir, por parte do servidor SQL, o mesmo esforço gasto para processar uma SQL sem o DISTINCT.
[quote:5b5e109660=´Marco Salles´]Voce usou a velha propriedade RecNo.. So que me recordo que essa propriedade não esta disponivel em todos os Bancos....[/quote:5b5e109660]Você está correto. Originalmente eu tinha pensado nisso mas não mencionei para não complicar. Minha idéia original era copiar os valores retornados pela query auxiliar para um array dinâmico e assim ter uma lista onde seria possível ter uma idéia de ordem dos valores.
[quote:5b5e109660=´Marco Salles´]Pergunto : Eu não consigo , pelo memos da erro , fazer com que o resultado desta consulta esteja ordenado...[/quote:5b5e109660]Realmente eu não tenho idéia de como fazer isso.
Marco Salles
03/08/2005
[b:cee5ac6da3]citação de marco salles[/b:cee5ac6da3]
[b:cee5ac6da3]é o que e eu imaginei...[/b:cee5ac6da3] :P :P :P :P :P
[b:cee5ac6da3]Massuda escreveu[/b:cee5ac6da3]
mas tem um detalhe [b:cee5ac6da3]fundamental [/b:cee5ac6da3]nisso tudo... Eu [size=18:cee5ac6da3][color=darkred:cee5ac6da3][b:cee5ac6da3]Não[/b:cee5ac6da3][/color:cee5ac6da3][/size:cee5ac6da3] vou precisar da query aux Quando estiver no modo de pesquisa... [b:cee5ac6da3]Meu sistema so permite a edição em casos especiais..[/b:cee5ac6da3] :arrow: E para esses casos ele[size=18:cee5ac6da3] [color=darkred:cee5ac6da3][b:cee5ac6da3]não[/b:cee5ac6da3][/color:cee5ac6da3] [/size:cee5ac6da3]necessita da queryAux...
:wink: :wink:
Lembra que voce estava comentando eu ter que dar Um [b:cee5ac6da3]Refresh[/b:cee5ac6da3] e coisa e tal.. [b:cee5ac6da3]Para o meu sistema isto não sera necessário[/b:cee5ac6da3] :wink:
[b:cee5ac6da3]marco salles escreveu[/b:cee5ac6da3]
massuda escreveu
Então vou depois abrir um tópico com esta dúvida .. Espero que nenhum moderadoer bloqueia o novo tópico , alegando duplicidade.. O que não é verdade , Pois agrupar por cor não tem nada a ver com Ordenar usando Distinct
Agora se neste meio temp o, alguem responder aqui , se é possível ordenar campos que são retornados usando o distinct me evitaria de abrir um novo tópico.. :lol: :lol: :lol:
[b:cee5ac6da3]Vou aguardar um pouquinho[/b:cee5ac6da3]
[b:cee5ac6da3]No mais estamos quase chegando ao fim , com a unica dúvida sobre o tamanho desse array Dinamico .. [/b:cee5ac6da3]
Massuda escreveu
usar o array dinamico , eu alem de ter que gravar todos os valores disponivel na minha queryAux , eu também vou ter que efetuar uma pesquisa (Como se faz com o Locate).. Pode ser que este processamento não seje hábil o suficiente , pois tudo vai depender da quantidade de registros disponivel na queryAux :cry: :cry: :cry: :cry: :cry:
Marcos Fernando
03/08/2005
olha meu post:
[url]http://forum.clubedelphi.net/viewtopic.php?t=78521&highlight=[/url]
thanks
Marco Salles
03/08/2005
mas sugiro que voce comece por fazer o seguinte
1)use uma query auxiliar com a seguinte instrução
Select
distinct (Data) from
Nome do seu banco
2)tente usar o seguinte código fazendo adaptação as seus tfirls componentes de acesso etc...
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if not(gdSelected in State) then begin Data:=Table1.FieldByName(´Data´).AsDatetime; query1.Locate(´Data´,Data,[]); if Odd(Query1.RecNo) Then Cor := clWhite else Cor := $00E8E8E8; with (Sender as TDBGrid) do begin Canvas.Brush.Color := Cor; DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end; end;
3)boa sorte...bos testes preliminares que fiz aqui funcionou blz...
Edilcimar
03/08/2005
Micheus
03/08/2005
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top,Column.Field.AsString);
por:
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);