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

05/08/2008

0

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


Robinhocne

Robinhocne

Responder

Posts

05/08/2008

Du_nirvana

Olá, pensei em algo simples, talvez ajude:

Crie uma variavel global:
var
  Form1: TForm1;
  clic2: boolean;


No DrawColumnCell:
 if odd(ClientDataSet1.RecNo) then
    DBGrid1.Canvas.Brush.Color:= clmenubar
  else
    DBGrid1.Canvas.Brush.Color:= clCream;

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

  if gdSelected in State then
    with (Sender as TDBGrid).Canvas do
      begin
        Brush.Color := clmoneygreen;
        FillRect(Rect);
        Font.Style := [fsbold];
        if clic2 = TRUE then
          begin
            Font.Color := clRed;
            clic2      := FALSE;
          end;
      end;

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


Por fim no DblClick:
  clic2 := TRUE;
  DBGrid1.Repaint;


É simples, você continua com seu código de pintar as linhas normal, a diferença é que você o avisa para pintar a linha atual de uma cor diferente caso a variavel clik2 mude de valor.


Responder

06/08/2008

Robinhocne

bom fiz exatamente o que vc fez:

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
    with (Sender as DbgCarChe).canvas do
      begin
        Brush.Color := clmoneygreen;
        FillRect(Rect);
        Font.Style := [fsbold];
        if clic2 = TRUE then 
          begin 
            Font.Color := clRed;
            clic2      := FALSE;
          end;
      end; 

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


ai ele para o cursor no (Sender as DbgCarChe).

e da um erro:

Incompatible types: ´HDC´ and ´TRect´


ai adaptei mais ou menos assim!


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



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;

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


Responder

06/08/2008

Webjoel

Olá!

Este tópico já foi abordado antes e já tem solução:

[url]
http://forum.clubedelphi.net/viewtopic.php?t=94795&start=0&postdays=0&postorder=asc&highlight=dbgrid&sid=98730bfa591fa4de025ea0dad9513b60[/url]


Responder

06/08/2008

Robinhocne

peguei tudo certo, mais não aconteceu nada, ele não muda nada!


Responder

07/08/2008

Robinhocne

fiz dessa maneira no evento ondrawcolumncell

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


no datachange do meu datasource coloquei assim :

clic2 := false;


e no ondlclick do grid:

clic2 := true;


ele mostra a linha inteira em vermelho, mas ai quando eu clico na outra linha ele volta ao normal!

Será que tem alguém capacitado para me ajudar a resolver isso ?


Responder

07/08/2008

Du_nirvana

A linha volta ao normal porque o dbgrid foi atualizado e a condição que indica a troca de cor já está falsa, você precisa criar um metodo para identificar a linha clicada, e onde ocorre o teste do click você testa com essa nova indicação. Tente substituir a variavel booleana click por uma outra que indice o registro no ClientDataSet.

Obs.: Quanto ao erro que você mencionou é meio estranho, você está usando outro componente que não seja o dbGrid?

Em relação ao seu desabafo na ultima linha foi meio grosseiro da sua parte no meu ponto de vista, já que estamos apenas tentando ajuda-lo. O objetivo do forum é auxilialo nas dificuldades demonstrando novas possibilidades e não resolver o problema para você.


Responder

07/08/2008

Du_nirvana

Pensei em algo novamente com base na ideia anterior;

1- Crie um vetor onde você seta o tamanho em tempo de execução, no caso esse tamanho será o total de registros no cds.
2- Dentro do onDrawColumnCell faça uma verificação onde você mantém as linhas pintadas de vermelho caso o registro atual esteja contido no vetor é só pintar.
3- Abaixo segue o exemplo, faça as alterações que você mencionou antes caso seja necessário. Se for o caso você só precisa de mais duas coisas, redimencionar o vetor no caso de novos registros e um tratamento para voltar a cor ao normal.

Segue o código:

Nova declaração das variaveis
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(clic2, ClientDataSet1.RecordCount);
end;

var
  Form1: TForm1;
  clic2: array of integer;


Dimencione o vetor, no meu exemplo coloquei no forCreate, porque nesse ponto meu cds já foi aberto, coloque-o onde achar melgor, desde que o cds já tenha recuperado os registros
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(clic2, ClientDataSet1.RecordCount);
end;


Novo onDrawColumnCell
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  i: integer;

begin
  if odd(ClientDataSet1.RecNo) then
    DBGrid1.Canvas.Brush.Color:= clmenubar
  else
    DBGrid1.Canvas.Brush.Color:= clCream;

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

  if gdSelected in State then
    with (Sender as TDBGrid).Canvas do
      begin
        Brush.Color := clmoneygreen;
        FillRect(Rect);
        Font.Style := [fsbold];
      end;
  for i:= 1 to ClientDataSet1.RecordCount do
    begin
      if clic2[i] = ClientDataSet1.RecNo then
        begin
          (Sender as TDBGrid).Canvas.Font.Color := clRed;
        end;
    end;

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


Fiz o código meio na pressa, qualquer coisa posta ai novamente que tentamos ajudar.


Responder

08/08/2008

Robinhocne

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;



Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar