Como pintar a linha posicionada do DBGrid.
20/08/2004
0
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
Posts
18/03/2005
Joao_schroeder
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;
18/03/2005
Dpbraz
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?
21/03/2005
Joao_schroeder
Tudo bem?
Pelo que eu entendi na tua resposta eu deveria colocar isso no evento close.
DBGrid1.free;
Mas não deu certo.
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
Clique aqui para fazer login e interagir na Comunidade :)