Ajuste automático das colunas do DBGrid
Olá Consultores,
Gostaria da ajuda de vocês para implementar um nova funcionalidade ao DBGrid. Gostaria que ao ajustar o tamanho do formulário no qual o DBGrid estiver alocado seja maximizando, restaurando ou até mesmo arastando as bordas do formulário, as colunas do DBGrid também fossem reajustadas, porém, mantendo a proporção inicial.
Ex.:
DBGrid.Width = 100 (área útil, desconsiderando o espaço ocupado pela barra de rolagem e pelo indicator)
Coluna1.Width = 20 <---> 20% da área útil do DBGrid
Coluna2.Width = 50 <---> 50% da área útil do DBGrid
Coluna3.Width = 20 <---> 20% da área útil do DBGrid
Coluna4.Width = 10 <---> 10% da área útil do DBGrid
DBGrid.Width = 200 (área útil, desconsiderando o espaço ocupado pela barra de rolagem e pelo indicator)
Coluna1.Width = 40 <---> 20% da área útil do DBGrid
Coluna2.Width = 100 <---> 50% da área útil do DBGrid
Coluna3.Width = 40 <---> 20% da área útil do DBGrid
Coluna4.Width = 20 <---> 10% da área útil do DBGrid
* Considerando o DBGrid devidamente alinhado ao formulário.
[]s
Alexandre Amaral.
Alexandre Neto
Curtidas 0
Respostas
Wesley Yamazack
17/01/2009
Olá meu caro Alexandre.
Segue abaixo o link do exemplo pronto espero que seja isso! Feito em Delphi 2009.
http://www.4shared.com/file/81158087/b4ddf9e5/Exemplo_DBGrid.html
Att,
Wesley Yamazack
Segue abaixo o link do exemplo pronto espero que seja isso! Feito em Delphi 2009.
http://www.4shared.com/file/81158087/b4ddf9e5/Exemplo_DBGrid.html
Att,
Wesley Yamazack
GOSTEI 0
Alexandre Neto
17/01/2009
Olá Wesley,
Ainda não é isso que eu preciso. Eu gostaria que ao redimencionar o form as colunas mantivessesm a proporção que tinham em relação ao tamanho inicial do DBGrid e não distribuir o novo espaço disponível igualmente entre as colunas.
no create do form eu armazenaria essas variáveis contendo o percentual de cada coluna em relação ao tamanho inicial do DBGrid em um TStrings (ou algo parecido), dentro do próprio DBGrid.
PercentualColuna1 := ((Column1.Width * 100) / Grid.Width);
PercentualColuna2 := ((Column2.Width * 100) / Grid.Width);
PercentualColuna3 := ((Column3.Width * 100) / Grid.Width);
PercentualColuna4 := ((Column4.Width * 100) / Grid.Width);
PercentualColuna5 := ((Column5.Width * 100) / Grid.Width);
após o redimensionamento do form, eu ajustaria as coluna com base no percentual armazenado.
Column1.Width := ((PercentualColuna1 / 100) * Grid.Width);
Column2.Width := ((PercentualColuna2 / 100) * Grid.Width);
Column3.Width := ((PercentualColuna3 / 100) * Grid.Width);
Column4.Width := ((PercentualColuna4 / 100) * Grid.Width);
Column5.Width := ((PercentualColuna5 / 100) * Grid.Width);
a minha dúvida na realidade é como interceptar o redimentcionamento do form de dentro componente DBGrid, pois não gostaria de ficar trabalhando com o evento onResize do Formulário. Gostaria que ao redimensionar o form, um método do DBGrid interceptasse a mensagem e chamasse a procedure para reajustar as colunas.
[]s
Alexandre Amaral.
GOSTEI 0
Wesley Yamazack
17/01/2009
Olá Alexandre.
Uma saída seria, criar um componente herdando de TDBGrid, interceptando a mensagem de redimensionamento do Form. O que acha ?
Att,
Wesley Yamazack
Uma saída seria, criar um componente herdando de TDBGrid, interceptando a mensagem de redimensionamento do Form. O que acha ?
Att,
Wesley Yamazack
GOSTEI 0
Alexandre Neto
17/01/2009
Olá Wesley,
é exatamente isso que eu imaginei, só não estou conseguindo fazer a implementação.
[]s
Alexandre Amaral.
GOSTEI 0
Wesley Yamazack
17/01/2009
Alexandre, iremos desenvolver esta rotina. Porém peço que aguarde um pouco, pois devido a complexidade será requerido um certo tempo.
Att,
Wesley Yamazack
Att,
Wesley Yamazack
GOSTEI 0
Alexandre Neto
17/01/2009
Tranqüilo...
[]s
Alexandre Amaral.
GOSTEI 0
Wesley Yamazack
17/01/2009
Alexandre,
Verificando a class TDBGrid constatei que ela não se trata de um controle Windows,ou seja, não há mensagens suficientes para que possamos manipular seu comportamento. O DBGrid é composto de várias classes, como as Colunas por exemplo. Que são Collections do Delphi. Por este motivo não é possivel interceptar a mensagem de Resize que é enviada para um form por exemplo, quando o mesmo é redimencionado.
A solução seria lançar mão do evento OnResize do form, porém você ja se manifestou contra. Há possibilidade de se interceptar a mensagem mas temos que lembrar que nem sempre o DBgrid estarar em um Form, ele pode estar contido em um panel que não foi redimencionado com o form. Desta maneira, o mais seguro e correto, é lançar mão do OnRiseze do Form. Qual motivo para não usá-lo ? Há algum outro método sendo usado no mesmo ?
Fico no aguardo
Att,
Wesley Y
Verificando a class TDBGrid constatei que ela não se trata de um controle Windows,ou seja, não há mensagens suficientes para que possamos manipular seu comportamento. O DBGrid é composto de várias classes, como as Colunas por exemplo. Que são Collections do Delphi. Por este motivo não é possivel interceptar a mensagem de Resize que é enviada para um form por exemplo, quando o mesmo é redimencionado.
A solução seria lançar mão do evento OnResize do form, porém você ja se manifestou contra. Há possibilidade de se interceptar a mensagem mas temos que lembrar que nem sempre o DBgrid estarar em um Form, ele pode estar contido em um panel que não foi redimencionado com o form. Desta maneira, o mais seguro e correto, é lançar mão do OnRiseze do Form. Qual motivo para não usá-lo ? Há algum outro método sendo usado no mesmo ?
Fico no aguardo
Att,
Wesley Y
GOSTEI 0
Alexandre Neto
17/01/2009
Olá Wesley,
a questão de não usar o OnResize do form é exclusivamente para não ter que ficar escrevendo o código em todos os forms em que eu colocar um Grid.
De qualquer forma, agradeço a atenção dispensada a este questionamento.
Obrigado.
[]s
Alexandre Amaral.
GOSTEI 0
Alexandre Neto
17/01/2009
Olá Wesley,
se bem que eu posso criar uma classe FormBase da qual serão herdados todos os outros forms e que no evento OnResize, caso haja DBGrid, faça o reajuste das colunas, acabando assim com a necessidade de implementar este método em todos os forms do sistema.
Wesley, você poderia rever aquela procedure do reajuste que sugeri (com os percentuais), pois sempre que reajusto a tela, ele sempre dá uma diferença, não mantém a proporção original.
[]s
Alexandre Amaral.
GOSTEI 0
Wesley Yamazack
17/01/2009
Olá Alexandre, estamos cancelando o chamado.
Foi uma pena não poder te ajudar desta vez.
Um Abraço.
Att,
Wesley Y
Foi uma pena não poder te ajudar desta vez.
Um Abraço.
Att,
Wesley Y
GOSTEI 0
Wesley Yamazack
17/01/2009
Alexandre,
Queria saber como é esta diferença, estou redimencionando meu form aqui, mas ele esta certo. A unica diferença é que a coluna[0] esta fixa, e quando você diminui muito o form, aparece uma barra de rolagem na parte inferior. Mas uma coisa que eu sempre faço, é travar o meu form, pois não gosto muito dos usários ficarem redimensionando o form. O problema é que o tamanho da Coluna "Width", é inteiro não aceitando assim divisão por "/", somente com o div.
Aguardo seu retorno.
Att,
Wesley Y
Queria saber como é esta diferença, estou redimencionando meu form aqui, mas ele esta certo. A unica diferença é que a coluna[0] esta fixa, e quando você diminui muito o form, aparece uma barra de rolagem na parte inferior. Mas uma coisa que eu sempre faço, é travar o meu form, pois não gosto muito dos usários ficarem redimensionando o form. O problema é que o tamanho da Coluna "Width", é inteiro não aceitando assim divisão por "/", somente com o div.
Aguardo seu retorno.
Att,
Wesley Y
GOSTEI 0
Alexandre Neto
17/01/2009
Olá Wesley,
que bom que ainda foi possível continuarmos esse chamado.
Blz amigo, encontrei a diferença. Eu não estava contabilizando a largura das linhas, do indicator e do scrollbar.
Feito os ajustes, ficou beleza.
Obrigadão.
[]s
Alexandre Amaral.
GOSTEI 0
Wesley Yamazack
17/01/2009
Olá Alexandre, se precisar estaremos sempre a disposição meu amigo!
Estamos aqui para o que precisar.
Ps.: Botei o chamado como concluído.
Abraços.
Att,
Wesley Y
Estamos aqui para o que precisar.
Ps.: Botei o chamado como concluído.
Abraços.
Att,
Wesley Y
GOSTEI 0