Problema com o DBGrid
Tenho um DbGrid, onde preciso mudar a altura da linha conforme o tamanho do texto e fazer a quebra da linha.
Até aí blz, fiz certinho.
Só que quando rolo a barra de rolagem vertical pra baixo sá o erro:
---------------------------
Debugger Exception Notification
---------------------------
Project raiox.exe raised exception class EInvalidGridOperation with message 'Grid index out of range'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Mas se vou descendo linha por linha com o teclado, não dá o erro só que algumas linhas não aparecem, a barra de rolagem chega ao final e não terminou ainda de aparecer todos os campos. Acredito que o Dbgrid ainda está recionhecendo a sua altura como as linhas tivessem a altura padrão, como altera a altura de algumas linhas dá esse erro. Alguém pode dar uma força?
Debugger Exception Notification
---------------------------
Project raiox.exe raised exception class EInvalidGridOperation with message 'Grid index out of range'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Mas se vou descendo linha por linha com o teclado, não dá o erro só que algumas linhas não aparecem, a barra de rolagem chega ao final e não terminou ainda de aparecer todos os campos. Acredito que o Dbgrid ainda está recionhecendo a sua altura como as linhas tivessem a altura padrão, como altera a altura de algumas linhas dá esse erro. Alguém pode dar uma força?
Lucas Souza
Curtidas 0
Respostas
Marco Salles
11/08/2010
vc deveria colocar o codigo que vc esta usando para podermos simular o erro
GOSTEI 0
Lucas Souza
11/08/2010
type
TMyDBGrid = class(TDBGrid)
published
property DefaultRowHeight;
end; procedure TfrmFicha.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
R : TRect;
altura,carect,resultado,posicao : integer;
begin posicao := dmGeral.cdsFicha.RecNo -1; // A variavel posicao identifica a linha no DbGrid
carect := (Length(trim(dmGeral.cdsFichaDESCRICAO.Value))); // conta a quantidade d ecaracteres no campo if carect > 75 then
begin
altura := 75;
resultado := carect div altura * 18;
end
else
resultado := 18;
TMyDBGrid(DBGrid1).RowHeights[posicao] := resultado;
//Quebra de linha
R := Rect;
Dec(R.Bottom,0);
If Column.Field = dmGeral.cdsFichaDESCRICAO Then
Begin
DBGrid1.Canvas.FillRect(Rect);
DrawText(DBGrid1.Canvas.Handle,PChar(dmGeral.cdsFichaDESCRICAO.AsString),
Length(dmGeral.cdsFichaDESCRICAO.AsString),R,DT_WORDBREAK);
end;
end; Só quando rola pra baixo o DBgrid dá o erro, principalmente com o botão de rolagem do mouse.
TMyDBGrid = class(TDBGrid)
published
property DefaultRowHeight;
end; procedure TfrmFicha.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
R : TRect;
altura,carect,resultado,posicao : integer;
begin posicao := dmGeral.cdsFicha.RecNo -1; // A variavel posicao identifica a linha no DbGrid
carect := (Length(trim(dmGeral.cdsFichaDESCRICAO.Value))); // conta a quantidade d ecaracteres no campo if carect > 75 then
begin
altura := 75;
resultado := carect div altura * 18;
end
else
resultado := 18;
TMyDBGrid(DBGrid1).RowHeights[posicao] := resultado;
//Quebra de linha
R := Rect;
Dec(R.Bottom,0);
If Column.Field = dmGeral.cdsFichaDESCRICAO Then
Begin
DBGrid1.Canvas.FillRect(Rect);
DrawText(DBGrid1.Canvas.Handle,PChar(dmGeral.cdsFichaDESCRICAO.AsString),
Length(dmGeral.cdsFichaDESCRICAO.AsString),R,DT_WORDBREAK);
end;
end; Só quando rola pra baixo o DBgrid dá o erro, principalmente com o botão de rolagem do mouse.
GOSTEI 0
Eriley Barbosa
11/08/2010
Não seria mais fácil utilizar o DBCtrlGris ou o StringGrid?
Atenciosamente
Eriley
GOSTEI 0
Marco Salles
11/08/2010
Tenta testar a Variavel Posicao
posicao := cdsFicha.RecNo -1; // A variavel posicao identifica a linha no DbGrid if posicao >= 0 Then .... ...
GOSTEI 0