Ir para conteúdo
Fórum Script Brasil
  • 0

Mudar cor da Fonte da linha selecionada do grid....


robinhocne

Pergunta

Bom dia..

Estava tentado fazer para que quando eu clicava duas vezes na linha do grid a cor da fonte mudaria!

Tentei fazer mais ou menos parecido de quando eu mudo a cor no evento drawcell(alguma coisa assim) mas não deu muito certo, alguém poderia me ajudar???

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0
Estava tentado fazer para que quando eu clicava duas vezes na linha do grid a cor da fonte mudaria!

Tentei fazer mais ou menos parecido de quando eu mudo a cor no evento drawcell(alguma coisa assim) mas não deu muito certo, alguém poderia me ajudar???

robinhocne, o procedimento passa por este método mesmo. A questão, é como saber que a linha a ser modificada a fonte é a linha em que foi dado o duplo click.

Voce pode partir do princípio de que a linha do duplo click é a linha correntemente selecionada. Isto você pode verificar através se gdSelected está presente no parâmetro State:

if gdSelected in State then

Entretanto ainda assim, deverá utilizar algum meio (uma variável global, boolean) para saber quando foi dado o duplo click no DBGrid, sinalizando ela quando o evento OnDblClick ocorrer e daí você força um Repaint do DBGrid. Até aí deve estar fácil... O negócio aperta é como saber em que momento esta variável deverá ser sinalizada como falsa - o que deverá ocorrer quando a linha selecionada no DBGrid mudar (é o que penso). Supondo que seja mesmo esta a situação, acredito que você poderá utilizar o evento OnDataChange do componente DataSource ligado ao DBGrid.

É testar para ver no que dá.

OBS: Outra coisar, passe a utilizar o evento OnDrawColumnCell para a manipulação do visual do DBGrid. Se você olhar no help sobre OnDrawDataCell, você vai encontrar este comentário:

Do not write an OnDrawDataCell event handler. OnDrawDataCell is obsolete and included for backward compatibility. Instead, write an OnDrawColumnCell event handler.

traduzindo, caso já tenha visto e não entendido:

Não escreva um manipulador de eventos OnDrawDataCell. OnDrawDataCell é obsoleto e incluído para compatibilidade. Ao invés disto, escreva um manipulador de eventos OnDrawColumnCell

Link para o comentário
Compartilhar em outros sites

  • 0
Estava tentado fazer para que quando eu clicava duas vezes na linha do grid a cor da fonte mudaria!

Tentei fazer mais ou menos parecido de quando eu mudo a cor no evento drawcell(alguma coisa assim) mas não deu muito certo, alguém poderia me ajudar???

robinhocne, o procedimento passa por este método mesmo. A questão, é como saber que a linha a ser modificada a fonte é a linha em que foi dado o duplo click.

Voce pode partir do princípio de que a linha do duplo click é a linha correntemente selecionada. Isto você pode verificar através se gdSelected está presente no parâmetro State:

if gdSelected in State then

Entretanto ainda assim, deverá utilizar algum meio (uma variável global, boolean) para saber quando foi dado o duplo click no DBGrid, sinalizando ela quando o evento OnDblClick ocorrer e daí você força um Repaint do DBGrid. Até aí deve estar fácil... O negócio aperta é como saber em que momento esta variável deverá ser sinalizada como falsa - o que deverá ocorrer quando a linha selecionada no DBGrid mudar (é o que penso). Supondo que seja mesmo esta a situação, acredito que você poderá utilizar o evento OnDataChange do componente DataSource ligado ao DBGrid.

É testar para ver no que dá.

OBS: Outra coisar, passe a utilizar o evento OnDrawColumnCell para a manipulação do visual do DBGrid. Se você olhar no help sobre OnDrawDataCell, você vai encontrar este comentário:

Do not write an OnDrawDataCell event handler. OnDrawDataCell is obsolete and included for backward compatibility. Instead, write an OnDrawColumnCell event handler.

traduzindo, caso já tenha visto e não entendido:

Não escreva um manipulador de eventos OnDrawDataCell. OnDrawDataCell é obsoleto e incluído para compatibilidade. Ao invés disto, escreva um manipulador de eventos OnDrawColumnCell

Bom esqueci umas informações necessarias, eu acho!

Eu uso o delphi 7, com banco firebird, e a minha conexão eu faço usando

um componente chamado Interbase Acess, que é o mesmo do interbase, conecto com o banco atraves de uma IBTable, IbTransaction e IbQuery.

Para a vizulização desses dados no grid eu utilizo o IbQuery e uma DataSource, ai fiz dessa maneira:

if odd(DtsCarChe.DataSet.RecNo) then
    DbgCarChe.Canvas.Brush.Color:= clmenubar
  else
    DbgCarChe.Canvas.Brush.Color:= clCream;

  TDbGrid(Sender).Canvas.font.Color:= clBlack;

  if gdSelected in State then
      begin
        DbgCarChe.Canvas.Brush.Color := clSkyBlue;
        DbgCarChe.Canvas.Font.Style  := DbgCarChe.Canvas.Font.Style + [fsBold];
        if clic2 = TRUE then 
          begin
            DbgCarChe.Canvas.Brush.Color := clRed;
            clic2      := FALSE;
          end;
      end;

  TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State);

Por fim no DblClick:

clic2 := TRUE;

DbgCarChe.Repaint;

Ai aparece em vermelho a linha selececionada mas só a primeira coluna e quando clico eu clico fora ele volta ao normal,

pois é assim que eu quero, eu seleciono varios cheques da minha carteira de cheque e quando eu clico na linha do cheque

para repassar ou depositar eu quero que essa linha fica com outra cor para que o cliente sabe qual cheques está sendo

repassado.

essa é uma imagem do que eu falei;

http://www.4shared.com/file/57974691/64b85f7d/imagem.html

Link para o comentário
Compartilhar em outros sites

  • 0
Bom esqueci umas informações necessarias, eu acho!

eu detesto quando isto acontece... :angry:

Mas não é o seu caso. Parece mesmo é que você não entendeu direito o que eu tentei explicar. Preste atenção ao que você postou do seu código:

if odd(DtsCarChe.DataSet.RecNo) then
    DbgCarChe.Canvas.Brush.Color:= clmenubar
  else
    DbgCarChe.Canvas.Brush.Color:= clCream;

  TDbGrid(Sender).Canvas.font.Color:= clBlack;

  if gdSelected in State then
      begin
        DbgCarChe.Canvas.Brush.Color := clSkyBlue;
        DbgCarChe.Canvas.Font.Style  := DbgCarChe.Canvas.Font.Style + [fsBold];
        if clic2 = TRUE then 
          begin
            DbgCarChe.Canvas.Brush.Color := clRed;
            clic2      := FALSE;
          end;
      end;

  TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State);
Quantas vezes você acha que este evento deverá ocorrer? Inúmeras!!! Uma vez para cada coluna e linha que esteja visível no DBGrid - lembre-se que nos parâmetros estão inclusos ARow (linha) e ACol (coluna). ;) Então, quando vai ser desenhada a linha selecionada (e a atualização evidentemente começará pela 1ª coluna) você está mudando as informações conforme desejado - até aí tudo bem. Mas, veja o que você está fazendo com a variável de controle do duplo click (clic2) nesta condição... Será que ao ser executado o evento para a pintura da 2ª coluna, ele vai conseguir passar pelo if que muda o fundo para clRed?! Será que captou porque foi que eu disse "o negócio aperta é como saber em que momento esta variável deverá ser sinalizada como falsa"? Justamente porque não poderia estar onde você colocou!!!! Leia novamente meu post e veja onde você poderá fazer isto e caso seu DataSource esteja em um DataModule, não se preocupe - simplesmente adicione um novinho em folha no form onde está o DBGrid apenas para usar este recurso. É..., você terá dois DataSources ligados ao mesmo dataset - isto não é problema. Outra coisa: observei todas as linha estão destacadas em negrito? Ao menos é como parece na imagem. Você deve lembrar de retirar o negrito quando não for a condição que você está usando para por o negrito:
...
  if gdSelected in State then
  begin
    ...
  end else
    DbgCarChe.Canvas.Font.Style  := DbgCarChe.Canvas.Font.Style - [fsBold];

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Bom esqueci umas informações necessarias, eu acho!

eu detesto quando isto acontece... :angry:

Mas não é o seu caso. Parece mesmo é que você não entendeu direito o que eu tentei explicar. Preste atenção ao que você postou do seu código:

if odd(DtsCarChe.DataSet.RecNo) then
    DbgCarChe.Canvas.Brush.Color:= clmenubar
  else
    DbgCarChe.Canvas.Brush.Color:= clCream;

  TDbGrid(Sender).Canvas.font.Color:= clBlack;

  if gdSelected in State then
      begin
        DbgCarChe.Canvas.Brush.Color := clSkyBlue;
        DbgCarChe.Canvas.Font.Style  := DbgCarChe.Canvas.Font.Style + [fsBold];
        if clic2 = TRUE then 
          begin
            DbgCarChe.Canvas.Brush.Color := clRed;
            clic2      := FALSE;
          end;
      end;

  TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State);
Quantas vezes você acha que este evento deverá ocorrer? Inúmeras!!! Uma vez para cada coluna e linha que esteja visível no DBGrid - lembre-se que nos parâmetros estão inclusos ARow (linha) e ACol (coluna). ;) Então, quando vai ser desenhada a linha selecionada (e a atualização evidentemente começará pela 1ª coluna) você está mudando as informações conforme desejado - até aí tudo bem. Mas, veja o que você está fazendo com a variável de controle do duplo click (clic2) nesta condição... Será que ao ser executado o evento para a pintura da 2ª coluna, ele vai conseguir passar pelo if que muda o fundo para clRed?! Será que captou porque foi que eu disse "o negócio aperta é como saber em que momento esta variável deverá ser sinalizada como falsa"? Justamente porque não poderia estar onde você colocou!!!! Leia novamente meu post e veja onde você poderá fazer isto e caso seu DataSource esteja em um DataModule, não se preocupe - simplesmente adicione um novinho em folha no form onde está o DBGrid apenas para usar este recurso. É..., você terá dois DataSources ligados ao mesmo dataset - isto não é problema. Outra coisa: observei todas as linha estão destacadas em negrito? Ao menos é como parece na imagem. Você deve lembrar de retirar o negrito quando não for a condição que você está usando para por o negrito:
...
  if gdSelected in State then
  begin
    ...
  end else
    DbgCarChe.Canvas.Font.Style  := DbgCarChe.Canvas.Font.Style - [fsBold];

Abraços

Micheus, não estou conseguindo você poderia me ajudar mais ainda?

Link para o comentário
Compartilhar em outros sites

  • 0

robinhocne, no seu código OnDrawCell você ajusta ele como abaixo:

...
  if odd(DtsCarChe.DataSet.RecNo) then
    DbgCarChe.Canvas.Brush.Color:= clmenubar
  else
    DbgCarChe.Canvas.Brush.Color:= clCream;

  TDbGrid(Sender).Canvas.font.Color:= clBlack;

  if gdSelected in State then
      begin
        DbgCarChe.Canvas.Brush.Color := clSkyBlue;
        DbgCarChe.Canvas.Font.Style  := DbgCarChe.Canvas.Font.Style + [fsBold];
        if clic2 = TRUE then
            DbgCarChe.Canvas.Brush.Color := clRed;
      end
  else
      DbgCarChe.Canvas.Font.Style  := DbgCarChe.Canvas.Font.Style - [fsBold];

  TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State);
end;
repare que removemos o "clic2 := FALSE;" e acrescentamos o else conforme eu sugeri. Coloque um componente TDataSource neste seu form (caso você esteja usando um datamodule - você não informou), defina a propriedade DataSet para apontar para o mesmo dataset que você já ligou ao DBGrid e no eveno OnDataChange coloque a linha que removemos acima:
procedure TForm1.DataSourceDataChange(Sender :Tobject....
begin
  clic2 := FALSE;
end;

Teste e veja se funciona a contento.

braços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus, fiz tudo os passos que você me passou, e meu DataSouce está no form mesmo não está no DataModule,

Mas ai quando do um duplo click até que ele seleciona a linha, mas quando eu clico no cheque de baixo para ele selecionar volta ao normal!

no OnDblClick do DbGrid eu coloquei que o :

clic2 := true;

e o datachange eu coloquei como false!

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus, fiz tudo os passos que você me passou, e meu DataSouce está no form mesmo não está no DataModule,

Mas ai quando do um duplo click até que ele seleciona a linha, mas quando eu clico no cheque de baixo para ele selecionar volta ao normal!

no OnDblClick do DbGrid eu coloquei que o :

clic2 := true;

e o datachange eu coloquei como false!

Consegui resolver com ajuda de uns amigos

ficou assim>

no type do form

type
  THakGrid = class(TCustomGrid);
no private:
private
        FSelecionados : array of integer;
        function GetIndex(Value : Integer) : Integer;
        procedure SelecionaCheque;
function TFrmCarteiraDeCheque.GetIndex(Value: Integer): Integer;
var
  I : Integer;
begin
  for I := 0 to High(FSelecionados) do
  begin
    if FSelecionados[I] = Value then
    //poderia fazer uma busca indexada pra agilizar
    //mas vai ficar pra proxima.
    begin
      Result := I;
      Exit;
    end;
  end;
  Result := -1;

end;
procedure TFrmCarteiraDeCheque.DbgCarCheDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);

begin
  if GetIndex(QryCarChe.RecNo) > -1 then
    DbgCarChe.Canvas.Brush.Color := clRed;

  DbgCarChe.DefaultDrawDataCell(Rect, Column.Field, State);
END;
procedure TFrmCarteiraDeCheque.SelecionaCheque;
var
  I, I2 : Integer;
begin
  I := GetIndex(QryCarChe.RecNo);
  if I < 0 then
  begin
    I := High(FSelecionados) + 1;
    SetLength(FSelecionados, I + 1);
    FSelecionados[I] := QryCarChe.RecNo;
  end else
  begin
    I2 := High(FSelecionados);
    if I2 > I then
      Move(FSelecionados[I+1], FSelecionados[I], I2-I);

    SetLength(FSelecionados, I2);
  end;
  THakGrid(DbgCarChe).InvalidateRow(THakGrid(DbgCarChe).Row);
end;

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...