Fórum DBGrid Zebrado #259924

25/11/2004

0

Bom dia!!!

Estou tentando fazer um DBGrid zebrado... até aí não tive problemas.

Só que todos os exemplos que eu ví são com Table e o programa em que estou querendo colocar usa uma Query.

O exemplo que estou utilizando funciona normalmente com Table mas não com Query

[b:3504537717]{ se a posição física (recno) do registro for par }
if (Table1.recno mod 2) = 0
then begin
{ pinta somente as células que não estão selecionadas }
if not (gdSelected in State)
then begin
{ define cor de fundo }
dbgrid1.Canvas.Brush.Color := $00FFEFDF;
{ pinta a célula }
dbgrid1.Canvas.FillRect(rect);
{ pinta o texto padrão }
dbgrid1.DefaultDrawDataCell(rect,column.Field,state);
end;
end;[/b:3504537717]
Alguem utiliza com Query?

Sds
Heitor R. Censi


Hrcensi

Hrcensi

Responder

Posts

25/11/2004

Gurc

Faça o seguinte,
Coloque um break point na linha onde retorna o RecNo e veja se algo está realmente sendo retornado. Essa propriedade vem da classe TDataSet e não necessariamente precisa ser implementada, talvez o erro esteja aí. Você, provavelmente está usando BDE, pois com DBX você não ligaria a query direto no DBGrid, certo? Se você estiver ligando o DBGrid a um ClientDataSet você deve usar o RecNo do ClientDataSet.
Já usei muitas vezes esse recurso de pintar a linha. Mas eu ligo a um ClientDataSet, não a um TQuery. Você pode fazer isso também.
Até mais,
Gustavo Royer Chaurais


Responder

Gostei + 0

25/11/2004

Hrcensi

Estou usando um TQuery mesmo.

Fiz mais uns testes e notei que ele funciona normalmente com Table e Query qdo utilizo tabelas paradox, mas o programa principal utiliza Oracle e com ele o DBGrid Zebrado não funciona.

Recno no Oracle retorna sempre 1 e por isso ele não deixa zebrado.

Sds
Heitor R. Censi
hrcensi@hotmail.com


Responder

Gostei + 0

25/11/2004

Gurc

Uma das soluções seria tu usar um ClientDataSet para fazer isso. A classe TBDEDataSet tem um atributo privado chamado FRecNoStatus: TRecNoStatus. Provavelmente esta propriedade deve estar retornando rnNotSupported, por isso ele retorna sempre 1.
Eu usaria o ClientDataSet. Para usá-lo, ligue-o a um provider e então ao seu DataSet, não esquecendo de colocar a propriedade UniDirectional do seu DataSet para false, o ClientDataSet agora proverá o cache dos dados.
Você já pensou em usar dbExpress ao invés de BDE? Realmente seria um grande avanço.
Abraços,
Gustavo Royer Chaurais


Responder

Gostei + 0

25/11/2004

Gandalf.nho

RecNo não costuma funcionar com bancos cliente-servidor, só com bases locais tipo Paradox ou DBase.


Responder

Gostei + 0

25/11/2004

Gurc

Exatamente, o atributo FRecNoStatus pode receber rnDBase, rnParadox e rnUnknown...


Responder

Gostei + 0

25/11/2004

Hrcensi

já faz algum tempo que estou querendo migrar para dbexpress mas o meu problema é com a acentuação.
Toda palavra acentuada aparece com caracteres diferentes.

Estou fazendo um teste com o clientdataset e ele não reconhece a linha clientdataset1.Canvas.Brush.Color := $00FFEFDF


Responder

Gostei + 0

25/11/2004

Gurc

Você está tentando acessar um canvas no ClientDataSet? Como assim?
Se você quer pintar a linha tem que fazer isso no DBGrid.
Até mais,
Gustavo Royer Chaurais


Responder

Gostei + 0

25/11/2004

Hrcensi

Putz!!!!!

Burrada das feias...
Já estou viajando na maionese.


Responder

Gostei + 0

26/11/2004

Silviogs

O exemplo abaixo mostra como deixar cada linha do componente DBGrid de uma cor diferente, dando assim um efeito zebrado. O controle é feito no evento OnDrawColumnCell.

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Db, DBTables, Grids, DBGrids, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
DBGrid1: TDBGrid;
Table1: TTable;
DataSource1: TDataSource;
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;

implementation
{$R *.DFM}

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
If odd(Table1.RecNo) then
begin
DBGrid1.Canvas.Font.Color:= clWhite;
DBGrid1.Canvas.Brush.Color:= clGreen;
end
else
begin
DBGrid1.Canvas.Font.Color:= clBlack;
DBGrid1.Canvas.Brush.Color:= clWhite;
end;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top,Column.Field.AsString);
end;


Atenciosamente,

Silvio Guedes


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar