index out of range aumentando o tamanho da linha de um grid
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?
Discussão (2)
Carregando comentários...