Como pintar a linha posicionada do DBGrid.

20/08/2004

0

Olá pessoal

Há algum tempo eu havia perguntado como eu poderia fazer para pintar a linha posicionada do DBGrid.

Para resover este problema eu criei uma variável chamada iRecNo e no evento afterscroll da tabela que está no DBGrid eu atribuo o RecNo da tabela para esta variável

iRecNo := Tabela.RecNo;
dbgrid.refresh;

Depois, no evento OnDrawColumnCell eu digitei

if iRecNo = tabela.RecNo then
dbgrid.Canvas.Font.Style := [fsBold];

bem simples, não?

abraço
Daniel


Dpbraz

Dpbraz

Responder

Posts

18/03/2005

Joao_schroeder

Olá!
Tudo bem?

Gostei muito da tua dica de como pintar a linha do DBGrid e agradeço
por ter colocado a disposição de todos.

Então eu peguei o teu exemplo e funcionou direito se a tabela estiver
dentro do programa. Quando a tabela está dentro do DataModule dá o
seguinte erro.

Acess violation at address 005122A0 in module ´RECEBIMENTOS.EXE´. Read of address FFFFFFFF´.

Acontece o seguinte.
Se eu entrar primeiro em um programa que acesse esta tabela. não dá erro.
Se eu entrar na consulta que usa este grid e depois entrar em outro
programa que usa esta tabela dá o erro acima.

Tentei colocar um teste para só fazer o refresh quando o form estiver
ativo, mas aí dá erro na linha do if.

Se conseguiste acertar este problema, será que poderias me dar uma dica
de como consertá-lo.

Ou caso outro colega saiba solucionar e puder ajudar.

Desde já agradeço a ajuda que me derem.

Segue abaixo o código que estou usando.

 

  public
      iRecNo : integer;

procedure TDM1.IBQuery_clienteAfterScroll(DataSet: TDataSet);
begin
      iRecNo := DM1.IBQuery_cliente.RecNo;
  if  F_con_cliente_001.Active then
  begin
      F_con_cliente_001.DBGrid1.Refresh;
      F_con_cliente_001.DBGrid2.Refresh;
      F_con_cliente_001.DBGrid3.Refresh;
  end;
end;



procedure TF_con_cliente_001.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
  if  dm1.iRecNo = DM1.IBQuery_cliente.RecNo then
  begin
  with (Sender as TDBGrid).Canvas do
  begin
      Font.Color  := clBlack;
      Brush.Color := $00B4FFB4;
  end;
  end;

 



Responder

18/03/2005

Dpbraz

Olá!

Cara, não tem porque dar esse problema que você passou. Será que quando você fecha o formulário onde está o grid você não está liberando ele de memória (dando um free)? Você têm certeza que o formulário onde está o grid está criado?


Responder

21/03/2005

Joao_schroeder

Olá!

Tudo bem?

Será que quando você fecha o formulário onde está o grid você não está liberando ele de memória (dando um free)?



Pelo que eu entendi na tua resposta eu deveria colocar isso no evento close.
DBGrid1.free;
Mas não deu certo.

Você têm certeza que o formulário onde está o grid está criado?


Só se existe outro de jeito de fechá-lo que eu não sei. O problema dá quando eu abro um outro programa que usa esta tabela depois de abrir o programa de consulta onde está o grid.
E dá na primeira linha que tenha F_con_representante, tenha o .Active ou não.


procedure TDM1.IBQuery_representanteAfterScroll(DataSet: TDataSet); 
begin 
      iRecNo := DM1.IBQuery_representante.RecNo; 
  if  F_con_representante_001.Active then 
  begin 
      F_con_representante_001.DBGrid1.Refresh; 
      F_con_representante_001.DBGrid2.Refresh; 
      F_con_representante_001.DBGrid3.Refresh; 
  end; 
end; 




Estou enviando o código que eu uso para abrir os programas e fechá-los.
Se conseguires identificar alguma coisa que eu possa estar fazendo de
errado ou não estar fazendo eu ficaria agradecido.


Um abraço e desde já agradeço.


procedure TF_menu_recebimento.Representantes1Click(Sender: TObject);
begin
      F_con_representante_001 := TF_cad_representante_001.create ( application );
  try
      F_con_representante_001.showmodal;
  finally
      F_con_representante_001.Release;
      F_con_representante_001 := nil;
  end;
end;


procedure TF_con_representante_001.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
      DM1.IBDatab_representante.Connected:=False;
      DM1.IBTrans_representante.Active:=False;
      DM1.IBQuery_representante.Active:=False;
      DBGrid1.Free;
      DBGrid2.Free;
      DBGrid3.Free;
end;

procedure TF_con_representante_001.SpeedButton2Click(Sender: TObject);
begin
      F_con_representante_001.Close;
end;



Relembrando. Depois vai dar erro quando executar o programa de cadastro


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar