sexta-feira, 1 de junho de 2007

Ajustando as colunas do Listview

Um duplo clique nos divisores de cada título das colunas de um listview faz com que a coluna em questão seja automaticamente redimensionada, para comportar o texto de maior tamanho dentre os ítens incluídos no listview. Mas isso pode ser feito de maneira automática por dentro do fonte cobol, enviando a mensagem LVM-SETCOLUMNWIDTH para o listview e especificando o parâmetro LVSCW-AUTOSIZE. Para isso, vamos utilizar a API "SendMessageA". Veja o exemplo a seguir:

Inclua em seu programa, na cláusula SPECIAL-NAMES:

call-convention 66 is wapi.

Defina as seguintes variáveis e constantes, na WORKING-STORAGE SECTION:

77 wsHandle pic 9(09) comp-5 value zeros.
77 wsColuna pic 9(09) comp-5 value zeros.
77 wsBool pic s9(09) comp-5 value zeros.

78 LVM-SETCOLUMNWIDTH value 4126.
78 LVSCW-AUTOSIZE value -1.

Você pode encontrar a definição dessas constantes no arquivo WINDOWS.CPY.

Depois que seu listview estiver criado e com todas as informações incluídas, crie uma section para redimensionar automaticamente uma determinada coluna do seu listview:

Redimensionar section.
...invoke umListview "getSystemHandle" returning wsHandle
...move zero to wsColuna
...call wapi "SendMessageA" using by value wsHandle
..................................by value LVM-SETCOLUMNWIDTH
..................................by value wsColuna
..................................by value LVSCW-AUTOSIZE
........................returning wsBool
...end-call

- A primeira linha de comando pega o handle do componente;

- Depois, especificamos a coluna que desejamos redimensionar. Esse parâmetro considera as colunas a partir do zero, portanto movimentamos "zero" para especificarmos a coluna 1, movimentamos 1 para a especificarmos a coluna 2 e assim por diante.
- Em seguinda, chamamos a API "SendMessageA" para executar o redimensionamento;

Note que se a coluna que for utilizada não contiver nenhum ítem com informação, ela será redimensionada com um tamanho mínimo, podendo em alguns casos ficar quase que escondida no listview. Só utilize esse redimensionamento quando tiver certeza que na coluna especificada existam informações dos ítens.

Um comentário:

Unknown disse...

Só para complementar:

Quando utilizamos o valor -1 (LVSCW-AUTOSIZE)no autoajuste o mesmo não considera o "cabeçalho" da coluna, se ao contrário utilizarmos o valor -2 (LVSCW-AUTOSIZE-USEHEADER) também os nomes das colunas são consideradas, resolvendo assim o problema de colunas vazias.

78 LVSCW-AUTOSIZE-USEHEADER value -2.