sábado, 27 de abril de 2013

Grids Elásticos

O mundo é caótico! Seu funcionamento é definido por uma série de eventos que se interligam gerando ações e reações, na grande maioria das vezes de forma totalmente imprevisível, ou seja, apesar da previsibilidade existente na ordem natural do Universo, o que manda mesmo é a imprevisibilidade. Quem disse isso? o filósofo Douglas Oliveira, rs...

Brincadeira a parte, acredito mesmo nisso, e de certa forma temos a prova quando programamos,  pois em muitas ocasiões lidamos com situações de total imprevisibilidade. Por exemplo, como saber de antemão quantos produtos certo cliente comprará em uma loja virtual, quantos alunos teremos matriculados em uma disciplina, ou quantas provas certo professor aplicará em sua turma, entre outras maluquices, pode ser um desafio enorme. Acredito que você também tem muitos exemplos de situações imprevisíveis.

O conteúdo da nossa caixa de ferramentas é que determinará se teremos sucesso ou não na solução dessas situações. Já dominamos algumas ferramentas essenciais como as tabelas, coleções de dados, variáveis do tipo vetor, matriz, que dão conta na grande maioria das situações, ou seja, existem elementos que combinados permitem que consigamos sair de certos enroscos ditos ‘imprevistos’. 

Então vou tratar de uma nova estratégia que é a construção de Grids Elásticos, ou seja, certo grid que tenha a capacidade de se ajustar conforme a necessidade de armazenamento.  Já falei um pouco sobre esse assunto por aqui e na ocasião recorremos aos controles gxui para resolvermos a situação, (Grids Dinamicos),  o caso agora é um pouquinho diferente.  Buscamos criar um grid que possa ser reconstruído (em runtime) mediante a determinação do número de colunas e linhas, e claro seu conteúdo.

FreeStyleGrid

Naturalmente o FreeStyleGrid já é elástico, pois temos a possibilidade de determinar seu número de colunas, pelas  sua propriedade Columns, que, interessante, pode ser modificadas em runtime.

Para montar o Grid que utilizamos como exemplo você deve primeiro criar algo como:



E nos eventos programar

Event Refresh
 Grid1.Columns = &col
EndEvent


Event Load
 &t = &row * &col
 for &i = 1 to &t
  &conteudo = &i.tostring()
  load
 endfor
EndEvent


O resultado é a apresentação de um Grid nas dimensões determinadas, como os tipox 2x4 e 3x3, apresentados a seguir, e que se ajustam conforme se varia os valores dos campos &row e &row, e em seguida o pressionamento de Confirm.




Títulos

Digamos que minha parte terminou, agora começa a sua, que é determinar o conteúdo do grid. Quanto ao quesito titulo ainda vou dar um pequeno empurrão.



Para produzir a linha de títulos apresentada na imagem anterior, precisaríamos de uma simples inclusão de código, como o apresentado a seguir.

Event Load
 &t = &row * &col
 for &i = 1 to &t

  if &i <= &row
   &conteudo = 'Titulo' + &i.tostring()
   &conteudo.Enabled = 0
  else
   &conteudo = &i.tostring()
   &conteudo.Enabled = 1
  endif


  load
 endfor
EndEvent


Titulo em Colunas


Na primeira linha do Grid foi fácil, o problema é como colocar títulos em colunas.  Quem é da época das matrizes lineares conseguiria sair dessa sem muitas dificuldades, não que eu seja dessa época, apenas estudei o assunto.  Como a informação era representada de forma contínua na memória (e ainda é), as posições de certa matriz eram relativas, ou seja, calculadas em função do número de colunas e linhas, para isso havia uma fórmula para determinar a primeira posição na próxima linha, bastante simples, cuja forma é apresentado a seguir.

&col1 = &r * &col + 1

Onde, &r representava a linha corrente, e &col o número de colunas, então com esse conceito, programamos um modelo mais complexo, mas que produz uma bela coluna de titulos.

Event Load
 &i    = 1
 &col1 = &r * &col + 1

 for &r = 1 to &row
  for &c = 1 to &col

   &flag=0
   &conteudo = ''
   &conteudo.Enabled = 1

   // titulo primeira linha
   if &r = 1
    &conteudo = 'Titulo' + &i.tostring()
    &conteudo.Enabled = 0
    &flag=1
   endif

   // titulo coluna
   if &i = &col1
    &conteudo = 'Col' + &i.tostring()
    &conteudo.Enabled = 0
    msg('aqui')
    &flag=1
   endif

   // primeira posicao no grid
   if &r = 1 and &c = 1
    &conteudo = ''
    &conteudo.Enabled = 0
    &flag=1
   endif

   // conteudo
   if &flag=0
    &conteudo = &i.tostring()
   endif

   &i += 1
   load
  endfor
  &col1 = &r * &col + 1
 endfor
EndEvent


Com esse pequeno algoritmozinho, podemos gerar enfim nossa Grid Elástica que pode ser expansível conforme sua necessidade e com todas as características de um grid tradicional, incluindo titulos, conteúdos, e por ai vai.

 
Enfim, fica aqui a estrutura do Grid, quanto a parte de conteúdos reais vou deixar para você pensar na estratégia de ligar com tabelas, Data Providers, e outras fontes.
 

Conclusões

Acredito que esse post será muito útil para todos, assim como foi pra mim também, mas observe que utilizamos uma variável do tipo Character para determinar o conteúdo, isso porque esta permite que tenhamos não apenas textos mas também numerous, representados como strings.  Mas se você tiver que apresentar imagens, campos binarios, a coisa complica bem.

E para finalizar, gostaria de me desculpar com nossas amigas do Genexando, pelo exemplo, digamos, 'de menino', acho que ficaria meio esquisito se eu usasse a figura de uma caixinha de maquiagem, ou mesmo do conteúdo de uma bolsa feminina, para exemplificar essa situação.  Mesmo que essas duas situações nos pareçam mais caóticas que a nossa amada e inseparável caixa de ferramentas (me desculpe novamente).