Selecionar cor do DbGrid Por Grupo

Delphi

03/08/2005

Faco uma pesquisa onde ordeno uma consulta Pelo codigo de operação ..
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

Marco Salles

Curtidas 0

Respostas

Marco Salles

Marco Salles

03/08/2005

Faço uma pesquisa onde ordeno uma consulta Pelo codigo de operação ..
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...


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

Poxa gente , libera esse código aí.... Trava não :cry: :cry:

Eu libero tantas coisas aqui no forum :cry: :cry: :cry: :cry: :cry:


GOSTEI 0
Massuda

Massuda

03/08/2005

Ao invés de testar o RecNo, teste o valor do campo ´operacao´.

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.


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

Ao invés de testar o RecNo, teste o valor do campo ´operacao´. 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.


[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...


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

:cry: :cry: :cry: :cry:


GOSTEI 0
Massuda

Massuda

03/08/2005

[quote:dd3e8edade=´Marco Salles´]...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...[/quote:dd3e8edade]Seria preciso mais algumas informações... sua query está ordenada e agrupada pelo campo operação? O valor do campo operação é sequencial ou é saltado?

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};
Se o campo operação não for sequencial, acho que teria que usar uma query auxiliar (similar a que você está usando para preencher o dbgrid) para obter os valores distintos do campo operação e usar esse resultado para determinar qual cor utilizar.


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

Beleza massuda ...

Seria preciso mais algumas informações...


com o maior prazer...

sua query está ordenada e agrupada pelo campo operação?


ela esta ordenada em forma decrescente.. Mas não esta agrupada

O valor do campo operação é sequencial ou é saltado?


o valor da operação é saltado... Ele pode ser todo par como também pode ser todo Impar Como pode ter para ou Impar

Se o campo operação não for sequencial, acho que teria que usar uma query auxiliar (similar a que você está usando para preencher o dbgrid) para obter os valores distintos do campo operação e usar esse resultado para determinar qual cor utilizar


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 :( :( :(


GOSTEI 0
Massuda

Massuda

03/08/2005

[quote:0f85225863=´Marco Salles´]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...[/quote:0f85225863]Não entendi qual a dificuldade... essa query auxiliar não seria visível. Por exemplo, imagine que ela retorne...

{ 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.


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

quando um item tem operacao=1 uso a cor A, operacao=2 uso a cor B, operacao=4 uso a cor A, etc,


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 :( :( :(

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 then DBGrid1.Canvas.Brush.Color:=clInfoBk else begin if (PrimeiraVez)and(NovoCodigoOperacao<>CodigoAtualOperacao) Then begin DBGrid1.Canvas.Brush.Color:=clInactiveCaptionText; CodigoAtualOperacao:=NovoCodigoOperacao; PrimeiraVez:=False; end else if (NovoCodigoOperacao<>CodigoAtualOperacao) Then begin DBGrid1.Canvas.Brush.Color:=clInfoBk; PrimeiraVez:=True; CodigoAtualOperacao:=NovoCodigoOperacao; end; end; DBGrid1.Canvas.FillRect(Rect); DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top,Column.Field.AsString); end;


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]


GOSTEI 0
Massuda

Massuda

03/08/2005

[quote:2fc7b50edf=´Marco Salles´]Mas com eu vou comparar algo que eu não sei em termos de projeto?[/quote:2fc7b50edf]No exemplo que dei, as cores foram atribuídas com base na posição do valor da operacao dentro da query auxiliar; essa query auxiliar lista os valores distintos do campo operacao respeitando os mesmos critérios da query que você está usando para popular o dbgrid. Por exemplo, se o grid está sendo populado com esta query...
SELECT * FROM suaTabela WHERE Data >= :DataInicial AND Data <= :DataFinal
...a query auxiliar seria...
SELECT DISTINCT operacao FROM suaTabela WHERE Data >= :DataInicial AND Data <= :DataFinal
(Sei que não é legal usar DISTINCT, mas tem jeitos mais complicados de escrever esta query sem usar DISTINCT, mas não manjo o suficiente de SQL para fazer isso).

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.


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

Muito obrigadissimo massuda pela sua disposição e coloboração , sempre atento e conhecedor do assunto.. Mas antes de ler o seu Ultimo post eu acho que consegui fazer o que pretendia , apenas com lógiga... Ficou assim

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


GOSTEI 0
Massuda

Massuda

03/08/2005

[quote:2ca6582698=´Marco Salles´]...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...[/quote:2ca6582698]O evento é gerado sempre que o DBGrid precisa ser desenhado.

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).


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

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).


É 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 :?: :?: :?: :?:


GOSTEI 0
Massuda

Massuda

03/08/2005

[quote:b04ff25ef5=´Marco Salles´]... 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...[/quote:b04ff25ef5]Veja meu post [url=http://forum.clubedelphi.net/viewtopic.php?t=65685]neste tópico[/url].


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

Realmente massuda , voce te razão ... As própias biogravias dos livors do delphi recomenda o uso do método DefaultDrawDataCell.. e alem disso recomenda-se configurar a propriedade defaultDrawing em false.. [b:96b6be94cf]Diz que se deixar a Propriedade defaultDrawing em true , a grade apresentará a saida padrão antes que o método seje chamado[/b:96b6be94cf]

[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 ,
DBGrid1.Canvas.FillRect(Rect); DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top,Column.Field.AsString);

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..


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

o efeito manchado ainda continua....


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...


GOSTEI 0
Massuda

Massuda

03/08/2005

[quote:0fb4905bc3=´Marco Salles´]...eu nunca observei diferenças entre deixar esta propriedade defaultDrawing em false ou deixa-la em True...[/quote:0fb4905bc3]Quando TDBGrid.DefaultDrawing é False, nada é desenhado no interior da célula, apenas as bordas da célula. Para ver isso, deixe o TDBGrid.OnDrawColumnCell sem código e faça TDBGrid.DefaultDrawing ser False.

[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).


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

Quando TDBGrid.DefaultDrawing é False, nada é desenhado no interior da célula, apenas as bordas da célula. Para ver isso, deixe o TDBGrid.OnDrawColumnCell sem código e faça TDBGrid.DefaultDrawing ser False.

Ate mesmo em nivel de projeto , quando se tem TDBGrid.DefaultDrawing é False so fica mesmo as bordas da celula...

os livros citam isto :

´Para personalisar completamente o desenho de um controle DbGrid voce precisa configurar sua propriedade DefaultDrawin em False e manipular o seu evento OnDrawCollumCell .. Na realidade , se voce deixar o valor defaultDrawin configurado em True , a grade apresentrá a siáda padrão antes que o método seje Chamado.. Desese modo , tudo que voce pode fazer é inserir algo na saída padrão da Grade , a não ser que decida desenhar sobre ela , o que exirgira tempo extra e causará cintilação´


[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...
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).


é 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]


GOSTEI 0
Massuda

Massuda

03/08/2005

[quote:80fc6f71a5=´Marco Salles´]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[/quote:80fc6f71a5]Deixar o TDBGrid.DefaultDrawing em False evita que a tela ´pisque´ (flicker) quando você usa uma cor de fundo muito diferente da cor de fundo default do componente.

[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).


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

Marco Salles escreveu: ...Não existe nenhum evento que anteceda este evento ou o preceda? 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).


Bem , então eu estou com este inconveniente :cry: :cry: :cry: :cry: :cry:

[b:b17f99f03f]Vamos voltar a Query aux[/b:b17f99f03f]

Se o campo operação não for sequencial, acho que teria que usar uma query auxiliar (similar a que você está usando para preencher o dbgrid) para obter os valores distintos do campo operação e usar esse resultado para determinar qual cor utilizar.


[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:?:  :?:  :?: 


No exemplo que dei, as cores foram atribuídas com base na posição do valor da operacao dentro da query auxiliar; essa query auxiliar lista os valores distintos do campo operacao respeitando os mesmos critérios da query que você está usando para popular o dbgrid. Por exemplo, se o grid está sendo populado com esta query...Código: SELECT * FROM suaTabela WHERE Data >= :DataInicial AND Data <= :DataFinal ...a query auxiliar seria...Código: SELECT DISTINCT operacao FROM suaTabela WHERE Data >= :DataInicial AND Data <= :DataFinal



Além disso , como é que vou varrer esta Query Aux se o DbGrid em questão esta Linkado a Query Da Consulta Principal



GOSTEI 0
Massuda

Massuda

03/08/2005

Alguns posts atrás você escreveu...[quote:5570931009=´Marco Salles´]
sua query está ordenada e agrupada pelo campo operação?
ela esta ordenada em forma decrescente.. Mas não esta agrupada[/quote:5570931009]Posso então assumir que os valores que são mostrados no DBGrid estão ordenados (em ordem decrescente) pelo campo Operacao (que, pelo que vi, não aparece no DBGrid)?


GOSTEI 0
Massuda

Massuda

03/08/2005

Outra pergunta... de onde vem o valor desse campo Operacao? É gerado pelo sistema ou atribuído pelo usuário?


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

Posso então assumir que os valores que são mostrados no DBGrid estão ordenados (em ordem decrescente) pelo campo Operacao


[b:ffa2baab1a]Sim[/b:ffa2baab1a]

que, pelo que vi, não aparece no DBGrid)?


[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:

Outra pergunta... de onde vem o valor desse campo Operacao? É gerado pelo sistema ou atribuído pelo usuário?


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....


GOSTEI 0
Massuda

Massuda

03/08/2005

Não sei se isso resolve seu problema, mas acho que seja uma solução possível para o problema.

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.


GOSTEI 0
Kotho

Kotho

03/08/2005

Marco, por acaso vc utiliza ClientDataSet??? Se vc utilizar, eu tenho um exemplo aqui que faz o que vc quer...


GOSTEI 0
Edilcimar

Edilcimar

03/08/2005

marcos eu tive um problema parecido, veja o topico que eu coloquei, lá a diferença é que procuro colocar a cor de acordo com o estoque existente, eu troco a cor apenas de um campo, mas você pode adaptar para funcionar para a linha inteira baseando-se no princípio que utilizei
http://forum.clubedelphi.net/viewtopic.php?t=52587&highlight=cor+dbgrid


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

[b:8059347fe6]Obrigado pela participação de todos voces[/b:8059347fe6]

mas vamos concatenar as idéia

[b:8059347fe6]1) massuda[/b:8059347fe6]

Quando for desenhar uma linha no DBGrid, busque na query auxiliar o valor do campo OPERACAO


determine qual o RecNo do valor dentro da query auxiliar e


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]

Marco, por acaso vc utiliza ClientDataSet??? Se vc utilizar, eu tenho um exemplo aqui que faz o que vc quer...


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 você pode adaptar para funcionar para a linha inteira baseando-se no princípio que utilizei


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...


GOSTEI 0
Edilcimar

Edilcimar

03/08/2005

já tentou tirar o ´borrado´ no onpaint? talvez se colocar o processo nele, ao tirar algo de cima do dbgrid o borrado desapareça!


GOSTEI 0
Massuda

Massuda

03/08/2005

[quote:a476f95ceb=´Marco Salles´]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...[/quote:a476f95ceb]A idéia é saber quantos e quais são os valores de OPERACAO que vão ser mostrados no DBGrid. Como você disse que no DBGrid as coisas estão ordenadas pelo valor de OPERACAO, vamos assumir que essa query auxiliar retorne...

{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.


GOSTEI 0
Kotho

Kotho

03/08/2005

acho que não vai servir, pois o exemplo que eu tenho utiliza uma característica do ClientDataSet que é a criação de índices agrupadores...

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.



GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

novamanete devo concatenar as idéias

[b:b74ea8c378]Citacao de Koko:[/b:b74ea8c378]

acho que não vai servir, pois o exemplo que eu tenho utiliza uma característica do ClientDataSet que é a criação de índices agrupadores...


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]

já tentou tirar o ´borrado´ no onpaint? talvez se colocar o processo nele, ao tirar algo de cima do dbgrid o borrado desapareça!


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]

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.


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  
:cry: :cry: :cry: :cry:

[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:


GOSTEI 0
Massuda

Massuda

03/08/2005

[quote:5b5e109660=´Marco Salles´]...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[/quote:5b5e109660]O OnDrawCell só é gerado para o que está visível... não faz sentido tentar desenhar algo que está invisível. Fora isso, mesmo para o que estiver visível, ele pode ser gerado apenas para uma determinada linha do DBGrid... vai depender do que o usuário estiver fazendo na máquina.

[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.


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

[b:cee5ac6da3]citação de massuda[/b:cee5ac6da3]
O OnDrawCell só é gerado para o que está visível...


[b:cee5ac6da3]citação de marco salles[/b:cee5ac6da3]
mas que estão ocultos no DbGrid so irão dispara o evento á medida que a Barra de rolagem seje acionada.... Isto é o que eu acho


[b:cee5ac6da3]é o que e eu imaginei...[/b:cee5ac6da3] :P :P :P :P :P

[b:cee5ac6da3]Massuda escreveu[/b:cee5ac6da3]
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.


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]
Pergunto : Eu não consigo , pelo memos da erro , fazer com que o resultado desta consulta esteja ordenado
...

massuda escreveu
Realmente eu não tenho idéia de como fazer isso.


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]

Marco Salles escreveu: Voce usou a velha propriedade RecNo.. So que me recordo que essa propriedade não esta disponivel em todos os Bancos....


Massuda escreveu
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.


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:


GOSTEI 0
Marcos Fernando

Marcos Fernando

03/08/2005

caro amigo Marco Salles estou com o mesmo problema vc conseguiu uma solução??

olha meu post:

[url]http://forum.clubedelphi.net/viewtopic.php?t=78521&highlight=[/url]

thanks


GOSTEI 0
Marco Salles

Marco Salles

03/08/2005

Amigo , cada caso é um caso . Apesar de parecidos , nossos tópicos tem algumas diferenças

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...


GOSTEI 0
Edilcimar

Edilcimar

03/08/2005

Crie uma matriz variante, veja quantos registros com valores diferentes tem, depois dê tamanho à matriz, de acordo com o tamanho da matriz gere cores e por último dê cor ao dbgrid


GOSTEI 0
Micheus

Micheus

03/08/2005

sugiro que troque as linhas:
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top,Column.Field.AsString);

por:
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);


GOSTEI 0
POSTAR