Ajustar largura da coluna do DbGrid com o tamanho do campo

Delphi

01/03/2011

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

Curtidas 0

Respostas

Marco Salles

Marco Salles

01/03/2011

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.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

Copiei o código de seu site e está dando erro.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

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;
GOSTEI 0
Marco Salles

Marco Salles

01/03/2011

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
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

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;
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

Quando fui executar, deu erro nessa linha:

Ta logo abaixo da implementation

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

Erros:
Undeclared identifier: DimensionarGrid
GOSTEI 0
Marco Salles

Marco Salles

01/03/2011

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
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

Como faço isso? Vc recebeu o email?
GOSTEI 0
Marco Salles

Marco Salles

01/03/2011

Sim recebi

Vou ve-lo com mais calma a noite

[]sds
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

Como faço para arrumar? Tem que executar a query antes para ajustar o grid?
GOSTEI 0
Marco Salles

Marco Salles

01/03/2011

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


Sim
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

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...
GOSTEI 0
Deivison Melo

Deivison Melo

01/03/2011

Boa tarde,

Chegou a verificar o link abaixo:

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

GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

Já vi esse link também. Não deu certo.
GOSTEI 0
Marco Salles

Marco Salles

01/03/2011

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 ???
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

Como fazer para funcionar?
GOSTEI 0
Marco Salles

Marco Salles

01/03/2011

Como fazer para funcionar?


Depois da execução da sua query chame o método dimensionarGrid
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

Poderia mandar o projeto que enviei pra vc com a forma correta para fazer funcionar?
GOSTEI 0
Marco Salles

Marco Salles

01/03/2011

Mandei um exemplo para vc , verifique se recebeu
GOSTEI 0
Hacson Alexandre

Hacson Alexandre

01/03/2011

Caro colega Leandro, no seu 1º post, você diz que atualiza a tela. Utilizando o código do seu 1º post e acrescente no final o comando application.processmessages.

É só uma dica, veja se te ajuda.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

Recebi sim, obrigado. Não é assunto desse post, mas vc tem algo sobre dimensionar o form para diversas resoluções?
GOSTEI 0
Marco Salles

Marco Salles

01/03/2011

Recebi sim, obrigado. Não é assunto desse post, mas vc tem algo sobre dimensionar o form para diversas resoluções?


Ok..

sobreo redimensionamento não tenho nada especifico.

[]sds
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

Poderia indicar algum artigo ou site se tiver?
GOSTEI 0
Marco Salles

Marco Salles

01/03/2011

Poderia indicar algum artigo ou site se tiver?


O que eu Li sobre isto foi o Livro de MarcuCantu especificamente Bliblia7 o Artigo6

Forularios , Janelas e aplicativos mais especificamente o item Mudando a escala de formulários

se não me engano tem este livro para download no site da activeDelphi

http://www.activedelphi.com.br/modules.php?op=modload&name=Downloads&file=index&req=viewdownloaddetails&lid=289&ttitle=B%EDblia%20do%20Delphi%207

mas acho que tem que fazer cadastro
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

01/03/2011

MARCO ANTONIO SALLES

Teria o exemplo de como dimensionar o dbgrid? Não estou achando aqui. Obrigado.
GOSTEI 0
POSTAR