4D v12 lets you specify and use hierarchical list boxes. A hierarchical list box is a list box in which the contents of the first column appears in hierarchical form. This type of representation is adapted to the presentation of information including repeated values and/or values that are hierarchically dependent (country/region/city and so on).
Only list boxes of the array type can be hierarchical.
Hierarchical list boxes are a particular way of representing data but they do not modify the structure of these data (the arrays). Hierarchical list boxes are filled and managed exactly the same way as regular list boxes (see ).
To specify a hierarchical list box, there are three different possibilities:
- manually configure hierarchical elements using the Property list of the form editor or using the list box management pop-up menu. These points are covered in the Design Reference manual of 4D.
- use the LISTBOX SET HIERARCHY and LISTBOX GET HIERARCHYcommands.
When a form containing a hierarchical list box is opened for the first time, by default all the rows are expanded.
A break row and a hierarchical "node" are automatically added in the list box when values are repeated in the arrays. For example, imagine a list box containing four arrays specifying cities, each city being characterized by a country, a region, a name and a number of inhabitants:

If this list box is displayed in hierarchical form (the first three arrays being included in the hierarchy), you will obtain:

The arrays are not sorted before the hierarchy is constructed. If, for example, an array contains the data AAABBAACC, the hierarchy obtained will be:
> A
> B
> A
> C
To expand or collapse a hierarchical "node", simply click on it. If you Alt+click (Windows) or Option+click (Mac OS) on the node, all its sub-elements will be expanded or collapsed. These operations can also be carried out by programming using the LISTBOX EXPAND and LISTBOX COLLAPSE commands.
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:
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 GET LISTBOX 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, GET LISTBOX 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, GET LISTBOX CELL POSITION retorna a primeira ocorrência da linha no array correspondente. No seguinte caso:

... GET LISTBOX 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:
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.