Ajuste automático das colunas do DBGrid

17/01/2009

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

Alexandre Neto

Curtidas 0

Respostas

Wesley Yamazack

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
GOSTEI 0
Alexandre Neto

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

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

GOSTEI 0
Alexandre Neto

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

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

GOSTEI 0
Alexandre Neto

Alexandre Neto

17/01/2009

Tranqüilo...   []s Alexandre Amaral.
GOSTEI 0
Wesley Yamazack

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
GOSTEI 0
Alexandre Neto

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

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

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
GOSTEI 0
Wesley Yamazack

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
GOSTEI 0
Alexandre Neto

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

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
GOSTEI 0
POSTAR