Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diego Garcia

index out of range aumentando o tamanho da linha de um grid

Recommended Posts

Opa rapeize, seguinte, eu estou tentando aumentar o tamanho de uma linha de um DbGrid somente quando for necessário, ou seja, se o conteudo de um determinado campo ultrapassar X caracteres. Beleza, consegui fazer, mas quando eu começo a navegar nos registro do DbGrid ele começa a bagunçar essas linhas e no ultimo registro ele da a exceção de "grid index out of rage"

 

estou postando o código para vcs darem uma olhada:

 

procedure TfrmPrincipal.dbgDetalhesDrawColumnCell(Sender: TObject; 
 const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); 
var 
 R : TRect; 
begin 
 //PROCEDIMENTOS PARA ZEBRAR A LINHA 
 if odd(dbgDetalhes.DataSource.DataSet.RecNo) then 
   dbgDetalhes.Canvas.Brush.Color := clMenuBar 
 else 
   dbgDetalhes.Canvas.Brush.Color :=  clCream; 

 TDBGrid(Sender).Canvas.Font.Color := clBlack; 

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

 //PROCEDIMENTOS PARA QUEBRAR O TEXTO E AUMENTAR O TAMANHO DA LINHA 
 r := Rect; 
 Dec(R.Bottom,0); 

 if (Column.Field.Index = 2) and (Length(Column.Field.AsString) > 35) then 
 begin 
   dbgDetalhes.Canvas.FillRect(Rect); 
   TMyDBGrid(dbgDetalhes).rowHeights[dbgDetalhes.DataSource.DataSet.RecNo - 1] := 50; 
   DrawText(dbgDetalhes.Canvas.Handle,pchar(Column.Field.AsString),Length(Column.Field.AsString),r,DT_WORDBREAK);//pra aumentar a linha 
 end 
 else 
 begin 
   if (Column.Field.Index = 2) and (Length(Column.Field.AsString) <= 35) then 
     TMyDBGrid(dbgDetalhes).rowHeights[dbgDetalhes.DataSource.DataSet.RecNo - 1] := 20; 
   TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State); 
 end; 
end;

 

 

para acessar a propriedade rowHeights do DbGrid eu tive que criar essa classe TMyDbGrid

 

Código:

type 
 TMyDBGrid = class(TDBGrid) 
end;

 

 

se o grid não der rolagem funciona beleza, o problema é quando tem rolagem mesmo... alguém tem alguma ideia de como resolver esse problema?

Compartilhar este post


Link para o post
Compartilhar em outros sites

marca um break point na primeira linha desta função e teste seu programa na tentativa de provocar o erro, quando o delphi voltar para o código fonte, continue a execução utilizando a tecla F7 e veja em qual linha ocorre o erro. Faça isto porque tô achando um pouco obscuro o motivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o erro ocorre na

 

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

 

ou na

 

DrawText(dbgDetalhes.Canvas.Handle,pchar(Column.Field.AsString),Length(Column.Field.AsString),r,DT_WORDBREAK);

 

depende do registro que estou verificando...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.