4D v16.3

Gestão de List Boxes Hierárquicas

Página Inicial

 
4D v16.3
Gestão de List Boxes Hierárquicas

Gestão de List Boxes Hierárquicas  


 

 

4D permite especificar e utilizar list box hierárquicos. Um list box hierárquico é um list box no qual o conteúdo da primeira coluna aparece na forma hierárquica. Este tipo de representação adapta-se à presentação da informação, incluindo os valores repetidos e/ou hierárquicamente dependentes (país/região/cidade...).

Somente os list box do tipo array podem ser hierárquicos.

Os list boxes do tipo hierárquico são uma forma de representação particular dos dados mas não modificam a estrutura desses dados (os arrays). Os list box hierárquicos  são preenchidos e gerenciados exatamente do mesmo jeito que os list  box regulares (veja Gestão de objetos List Box).

Para especificar um list box hierárquico, há três possibilidades diferentes:

  • configurar manualmente os elementos hierárquicos utilizando a lista de propriedades do editor de formulários ou utilizando o menu emergente de gestão de list box. Estes pontos são tratados no Manual de Desenho 4D.
  • utilizar os comandos LISTBOX SET HIERARCHY e LISTBOX GET HIERARCHY.

Quando é aberto por primeira vez um formulário que contém um list box hierárquico, por padrão todas as linhas são exibidas.
Uma quebra de linha e um "nó" hierárquico são adicionados automáticamente a list box quando os valores são repetidos nos arrays. Por exemplo, imagine um list box que contém quatro arrays especificando as cidades, cada cidade é caracterizada por um país, uma região, um nome e um número de habitantes:

Se esta list box é exibida em forma hierárquica (os três primeiros arrays são inseridos na hierarquía), obtém-se:

Os arrays não são organizados antes da construção da hierarquía. Se por exemplo, um array contém os dados AAABBAACC, a hierarquía obtida vai ser:

> A
> B
> A
> C

Para expandir ou contrair um "nó" hierárquico, simplesmente clique nele. Se pressionar Alt+clique (Windows) ou Opção+clique (Mac OS) no nó, todos os seus sub-elementos serão expandidos ou contraídos. Estas operações também podem ser feitas por programação utilizando os comandos LISTBOX EXPAND e LISTBOX COLLAPSE

Um list box hierárquico mostra um número variável de linhas na tela de acordo com o estado exibido/contraído dos nós hierárquicos. Isto não significa contudo que o número de linhas dos arrays vai variar. Somente é modificada a visualização, não os dados.

É importante entender este principio porque a gestão programada de list box hierárquicos se baseia sempre nos dados dos arrays, não nos dados mostrados. Particularmente, as quebras de linhas adicionadas automaticamente não são tidas em conta nos arrays de opções de visualização (consulte a seção "Gestão de quebras de linha").

Vejamos, por exemplo, os seguintes arrays:

Se estes arrays estão representados hierárquicamente, a linhea "Quimper" não será mostrada na segunda linha, senão na quarta, por causa das duas quebras de linha adicionadas:

Independentemente de como os dados são mostrados no list box (hierárquicamente ou não), se quiser mudar a linha que contém "Quimper" a negrito, deverá utilizar a instrução Style{2} = bold. Somente será tida em conta a posição da linha nos arrays.

Este principio é aplicado para os arrays internos que podem ser utilizados para gerenciar:

  • cores
  • cores de fundo
  • estilos
  • linhas ocultas
  • seleções

Por exemplo, se você quiser selecionar a linha que contém Rennes, deverá passar:

 ->MeuListbox{3}:=True

Representação não-hierárquica:

Representação hierárquica:

Nota: se uma ou mais linhas são ocultas porque seus pais estão contraídos, não são mais selecionados. Somente as linhas que são visíveis (seja diretamente ou por deslocamento) podem ser selecionados. Em outras palavras, as linhas não podem estar ao mesmo tempo ocultas e selecionadas.

Da mesma maneira que com as seleções, o comando LISTBOX GET CELL POSITION retorna os mesmos valores para um list box hierárquico e um list box não hierárquico. Isto significa que nos dois exemplos a seguir,  LISTBOX GET CELL POSITION  retornará a mesma posição: (3;2).

Representação não-hierárquica:

Representação hierárquica:

Se o usuário selecionar uma quebra de linha, LISTBOX GET CELL POSITION retorna a primeira ocorrência da linha no array correspondente. No seguinte caso: 

... LISTBOX GET CELL POSITION retorna (2;4). Para selecionar uma quebra de linha por programação, deverá utilizar o comando LISTBOX SELECT BREAK.

As quebras de linha não são tidas em conta nos arrays internos utilizados para gerenciar a aparência gráfica dos list box (estilos e cores). Contudo é possível modificar essas características para as quebras de linha vía os comandos de gestão gráfica para objetos (tema "Propriedades dos objetos"). Somente deverá executar os comandos apropriados nos arrays que constituem a hierarquia. 

Por exemplo a seguinte list box (os nomes dos arrays associados são especificados entre parênteses): 

Representação não-hierárquica: 

Representação hierárquica:

No modo hierárquico, os níveis de quebra não são tidos em conta pelos arrays de modificação de estilo chamados tStyle e tColors. Para modificar a cor ou o estilo dos níveis de quebra, deveráe executar as seguintes instruções:

 OBJECT SET RGB COLORS(T1;0x0000FF;0xB0B0B0) 
 OBJECT SET FONT STYLE(T2;Bold)

Nota: Neste contexto, somente a sintaxe que utiliza a variável array pode funcionar com os comandos de propriedade do objeto porque os arrays não têm objeto associado.

Resultado:

Quando todas as linhas de uma sub-hierarquia estão ocultas, a quebra de linha é oculta automaticamente. No exemplo anterior, se as linhas 1 à 3 estão ocultas, a quebra de linha "Brittany" não será exibida.

Pode otimizar a visualização e a gestão dos list box hierárquicos utilizando os eventos formulário On Expand e On Collapse.

Um list box hierárquico é construido a partir dos conteúdos de seus arrays pelo qual só podem ser mostrados quando todos os arrays são carregados na memória. Isto faz difícil a geração de list box hierárquicos de grande tamanho baseados em arrays gerados a partir dos dados (vía o comando SELECTION TO ARRAY), não somente pela velocidade de visualização, mas também pelo uso da memória.

O uso dos eventos formulario On Expand e On Collapse permite superar estas limitações: por exemplo, agora pode ser mostrado somente uma parte da hierarquia e carregar/descarregar os arrays enquanto estiver rodando, em função das ações do usuário.

No contexto destes eventos, o comando LISTBOX GET CELL POSITION devolve a célula onde o usuário clicou para expandir o contrair uma linha.

Neste caso, deve preencher e esvaziar os arrays por código. Os principios a ser aplicados são:

 - Durante a visualização do list box, só o primeiro array deve ser preenchido. Contudo, você deve criar um segundo array com valores vazios para que o list box mostre os botões expandir/contrair:

 - Quando um usuário clica num botão de expandir, pode processar o evento On Expand. O comando LISTBOX GET CELL POSITION devolve a célula em questão e permite criar a hierarquia apropriada: preenche-se o primeiro array com os valores repetidos e o segundo com os valores enviados a partir do comando SELECTION TO ARRAY e inserir no list box tantas linhas quanto seja necessário utilizando o comando LISTBOX INSERT ROWS.

 - Quando um usuário clica num botão de contração, pode processar o evento On Collapse. O comando LISTBOX GET CELL POSITION retorna a célula em questão: elimina do list box tantas linhas quanto seja necessário utilizando o comando LISTBOX DELETE ROWS.



Ver também 

Gestão de objetos List Box
LISTBOX GET HIERARCHY
LISTBOX SELECT BREAK
LISTBOX SET HIERARCHY

 
PROPRIEDADES 

Produto: 4D
Tema: List Box

 
HISTÓRIA 

 
ARTICLE USAGE

Manual de linguagem 4D ( 4D v16)
Manual de linguagem 4D ( 4D v16.1)
Manual de linguagem 4D ( 4D v16.2)
Manual de linguagem 4D ( 4D v16.3)