Ajustar largura da coluna do DbGrid com o tamanho do campo
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;
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
Curtidas 0
Respostas
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.
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***
01/03/2011
Copiei o código de seu site e está dando erro.
GOSTEI 0
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;
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
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;
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***
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;
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***
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
Ta logo abaixo da implementation
procedure TForm1.DimensionarGrid(dbg: TDbGrid; var formulario);
Erros:
Undeclared identifier: DimensionarGrid
GOSTEI 0
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
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***
01/03/2011
Como faço isso? Vc recebeu o email?
GOSTEI 0
Marco Salles
01/03/2011
Sim recebi
Vou ve-lo com mais calma a noite
[]sds
Vou ve-lo com mais calma a noite
[]sds
GOSTEI 0
Frederico Brigatte***
01/03/2011
Como faço para arrumar? Tem que executar a query antes para ajustar o grid?
GOSTEI 0
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***
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:
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...
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
01/03/2011
Boa tarde,
Chegou a verificar o link abaixo:
https://www.devmedia.com.br/redimensionar-colunas-dbgrid-delphi/18076
Chegou a verificar o link abaixo:
https://www.devmedia.com.br/redimensionar-colunas-dbgrid-delphi/18076
GOSTEI 0
Frederico Brigatte***
01/03/2011
Já vi esse link também. Não deu certo.
GOSTEI 0
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 ???
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***
01/03/2011
Como fazer para funcionar?
GOSTEI 0
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***
01/03/2011
Poderia mandar o projeto que enviei pra vc com a forma correta para fazer funcionar?
GOSTEI 0
Marco Salles
01/03/2011
Mandei um exemplo para vc , verifique se recebeu
GOSTEI 0
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.
É só uma dica, veja se te ajuda.
GOSTEI 0
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
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***
01/03/2011
Poderia indicar algum artigo ou site se tiver?
GOSTEI 0
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***
01/03/2011
MARCO ANTONIO SALLES
Teria o exemplo de como dimensionar o dbgrid? Não estou achando aqui. Obrigado.
Teria o exemplo de como dimensionar o dbgrid? Não estou achando aqui. Obrigado.
GOSTEI 0