GARANTIR DESCONTO

Fórum Ajustar largura da coluna do DbGrid com o tamanho do campo #396505

01/03/2011

0

Olá pessoal, desenvolvi um processo que ajusta o tamanho da coluna do dbrgid de acordo com o tamanho do campo... Só que estou com um problema, a dbgrid está dando umas travadinhas ... tipo ...ele faz tudo bonitinho, mas quando aparece na tela ... ela dá uma travadinha...dai eu tenho que ir pra baixo e voltar no registr pra ela voltar a funcionar direitinho....isso é meio incomodo para o usuario...e é batata que não vaõ gostar.... entao eu preciso da ajuda de vcs para implementar esse código...   // --> Coloque esse codigo no evento DrwanColumnCell de sua DbGrid...   procedure TForm10.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  // --> Atualiza a tela
  LockWindowUpdate(0);
  // --> Se o tamanho da coluna for maior do que o valor da tag que teoricamente é o tamanho maximo
  if Column.Width >= Column.Field.Tag then
  begin
    // --> Se o tamanho do titulo da coluna for menor do que o tamanho(largura) do Field
    if Canvas.TextWidth(Column.Title.Caption) < Canvas.TextWidth(Column.Field.AsString) then
    begin
      // --> Se a coluna for menor do que o tamanho(largura) do Field
      if Column.Width < Canvas.TextWidth(Column.Field.AsString) then
      begin
        // --> Acrescenta o tamanho(largura) do field para o tamanho(largura) da coluna
        Column.Width := Canvas.TextWidth(Column.Field.AsString) + 15;
        // --> Acrescenta na tag do field o tamanho atribuido para coluna, até que seja o maior tamanho
        Column.Field.Tag := Canvas.TextWidth(Column.Field.AsString) + 15;
      end
    end;
  end;
  // --> Atualiza a tela
  LockWindowUpdate(0);
end;  
Leandro Costa

Leandro Costa

Responder

Posts

01/03/2011

Marco Salles

Ha muitos métodos espalhado por ai na net que propoem fazer estes ajuste Mas os que eu ja vi não utilizamo evento OnDrawColummCell e sim o evento OnResize do Container   Tente fazer a suka logica chamando-o pelo evento OnResize do Container   Exexmplo   procedure TSeuForm.FormResize(Sender: TObject);
begin
//FixDbGridColumnsWidth(dbgGridExemplo);
DimensionarGrid(DbGrid1,self);
end;   Utlizar o OnDrawColummCell vc estara sempre redimensionando conforme a grade for pintada , o que muitsd das vezes causa cintilação , Ja no OnResize vc executara o método qnd realmente for necessário.
Responder

Gostei + 0

27/06/2012

Frederico Brigatte***

Copiei o código de seu site e está dando erro.
Responder

Gostei + 0

27/06/2012

Frederico Brigatte***

Coloquei isso no type:

procedure DimensionarGrid(dbg: TDbGrid; var formulario);

Logo abaixo da diretiva {$R *.dfm} colei a procedure TForm1.DimensionarGrid(dbg: TDbGrid; var formulario);


Access violation ao executar o programa e para nessa linha:

Asize[idx]:= dbg.Columns[idx].Field.Size;
Responder

Gostei + 0

27/06/2012

Marco Salles

Coloquei isso no type:

procedure DimensionarGrid(dbg: TDbGrid; var formulario);

Logo abaixo da diretiva {$R *.dfm} colei a procedure TForm1.DimensionarGrid(dbg: TDbGrid; var formulario);


Access violation ao executar o programa e para nessa linha:

Asize[idx]:= dbg.Columns[idx].Field.Size;


Desculpe , mas não entendi direito o que vc fez

Vc tem um método DimensionarGrid(dbg: TDbGrid; var formulario); que deve ser Definido na secção Private ou publica do seu form que contem o dbgrid

type
TForm1 = class (TFOmr)
...
Private
procedure DimensionarGrid(dbg: TDbGrid; var formulario)
....

end;

Esta procedure deve ser definida na secção Implementatio deste Formulário

implementation

//deefin aqui a procedure


Vc deve ir no evento OnRize (Objeto Inspector) do Formulário dar um click para que o Delphi o defina e na sua implemtação

escrever

procedure TForm1.FormResize(Sender: TObject);
begin
DimensionarGrid(SeuDbGrid,self);
end;

[]sds
Responder

Gostei + 0

27/06/2012

Frederico Brigatte***

Foi isso mesmo que fiz. É só copiar e colar? Enviei para vc um email com o projeto, ok?

Logo abaixo da implementation e {$R *.dfm} colei a procedure

implementation

{$R *.dfm}
**aqui**
procedure TForm1.DimensionarGrid(dbg: TDbGrid; var formulario);
type
TArray = Array of integer;
procedure AjustarColumns(Swidth,TSize:integer;Asize:TArray);
var
idx:integer;
begin


No onResize colei:

procedure TForm1.FormResize(Sender: TObject);
begin
DimensionarGrid(DBGrid1,self);
end;
Responder

Gostei + 0

27/06/2012

Frederico Brigatte***

Quando fui executar, deu erro nessa linha:

Ta logo abaixo da implementation

procedure TForm1.DimensionarGrid(dbg: TDbGrid; var formulario);

Erros:
Undeclared identifier: DimensionarGrid
Responder

Gostei + 0

27/06/2012

Marco Salles

Quando fui executar, deu erro nessa linha:

Ta logo abaixo da implementation

procedure TForm1.DimensionarGrid(dbg: TDbGrid; var formulario);

Erros:
Undeclared identifier: DimensionarGrid


Vc deve defini-la como um método da classe do Form

No meu caso a classe do Form é TForm1 , mas pode ser diferente na sua
Responder

Gostei + 0

27/06/2012

Frederico Brigatte***

Como faço isso? Vc recebeu o email?
Responder

Gostei + 0

27/06/2012

Marco Salles

Sim recebi

Vou ve-lo com mais calma a noite

[]sds
Responder

Gostei + 0

27/06/2012

Frederico Brigatte***

Como faço para arrumar? Tem que executar a query antes para ajustar o grid?
Responder

Gostei + 0

27/06/2012

Marco Salles

Como faço para arrumar? Tem que executar a query antes para ajustar o grid?


Sim
Responder

Gostei + 0

27/06/2012

Frederico Brigatte***

Não estou sabendo utilizar esse exemplo. Tenho um form com um adoquery, um datasource um adoconnection e um dbgrid, ok? No botão está o código abaixo:

procedure TForm1.Button1Click(Sender: TObject);
var
  s : string;
begin
  s := Select CodigoCliente As Código, Nome As Cliente from Clientes;
//  s := Select Produto As Produto, Tipo As Tipo from Produtos;
  qry.close;
  qry.sql.clear;
  qry.SQL.add(s);
  qry.Prepared := true;
  qry.open;
end;


O que preciso fazer para funcionar? Quando clico no botão, executa a sql e os campos estão grandes. Quando coloco a procedure, dá erro. Me ajude...
Responder

Gostei + 0

27/06/2012

Deivison Melo

Boa tarde,

Chegou a verificar o link abaixo:

https://www.devmedia.com.br/redimensionar-colunas-dbgrid-delphi/18076

Responder

Gostei + 0

27/06/2012

Frederico Brigatte***

Já vi esse link também. Não deu certo.
Responder

Gostei + 0

27/06/2012

Marco Salles

calma amigo , o procedimento funciona

Abri o seu dpr , mas não tem nada

vc so colocou a query mas não definiu a procedure e nem com e onde esta usando-a

Pelo menos para mim so veio um evento em um único Button

procedure TForm1.Button1Click(Sender: TObject);
var
s : string;
begin
// s := Select CodigoCliente As Codigo, Nome As Cliente from Clientes;
s := Select Produto As Produto, Tipo As Tipo from Produtos;
qry.close;
qry.sql.clear;
qry.SQL.add(s);
qry.Prepared := true;
qry.open;
end;


Mas como o dbgrid será ajustado ???
Responder

Gostei + 0

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

Aceitar