20/08/2004

Como pintar a linha posicionada do DBGrid.

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

Respostas

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 Citar

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 Citar

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 Citar