Este artigo é uma tradução do artigo: http://blog.marcocantu.com/blog/2019-march-classictips-multicolumn-listbox.html
Ao usar uma caixa de listagem clássica do Windows (usando o VCL TListBox), como você pode ter várias colunas de dados? O sistema operacional oferece duas maneiras alternativas, e isso pode ser confuso.
O controle de caixa de lista do Windows (um dos controles user.dll primitivos e clássicos) geralmente exibe uma única lista de seqüências de caracteres. Eles podem ter dados associados, mas esse é um tópico separado. Desde as primeiras versões do Windows, o sistema operacional oferece algumas configurações especiais para permitir caixas de listagem de várias colunas. Eles são disponibilizados usando estilos específicos ao criar o controle e mensagens específicas do Windows (como LB_SETCOLUMNWIDTH e LB_SETTABSTOP) para passar dados. A boa notícia é que o controle TListBox da VCL envolve esses recursos, tornando-os fáceis de usar. A má notícia é que a documentação não é tão precisa e demorada que os desenvolvedores do Delphi podem não saber como conseguir isso.
A primeira opção é criar uma caixa de listagem com conteúdo fluindo em várias colunas. A caixa de listagem ainda tem uma lista de strings, uma vez no final do espaço disponível, em vez de rolar verticalmente, os dados são adicionados a uma nova coluna e possivelmente rolados horizontalmente se não couberem. Para isso, você usa a propriedade Columns e a VCL fará com que a largura de cada coluna seja igual à largura do controle dividida pelo número de colunas. Este é um trecho de código de amostra:
ListBox1.Columns := 3; for var I := 0 to 30 do ListBox1.Items.Add('hi');
Se você pressionar o botão uma vez (com o tamanho do controle na primeira imagem abaixo), ele preencherá as duas primeiras colunas e parte da terceira. Ao pressionar o botão novamente, você obtém mais conteúdo com uma barra de rolagem horizontal (segunda imagem).
Outra abordagem completamente diferente, é definir a propriedade TabWidth para obter uma caixa de listagem na qual linhas individuais podem ser exibidas em colunas, contanto que elas usem guias em seu texto. Isso é exibido na terceira imagem acima e pode ser obtido com um código como o seguinte (o aviso nº 9 é o caractere de tabulação):
ListBox1.TabWidth := 50; ListBox1.Items.Add('hi' + #9 + 'lo'); ListBox1.Items.Add('foo' + #9 + 'bar'); ListBox1.Items.Add('ki' + #9 + 'mo');
Agora você pode se perguntar por que isso não é mais usado, e a razão é que, se o texto não couber na guia, a formatação se torna totalmente inconsistente – ao contrário de um ListView com configuração de relatório ou uma grade. Ainda assim, tendo um conjunto de strings você pode calcular a largura de exibição de cada um deles com a fonte especificada e definir a largura da tabulação de acordo …
Assim como essa e outras técnicas você pode encontrar em um dos meus treinamentos, o de Técnicas avançadas de Delphi, neste treinamento reúne algumas das minhas melhores aulas onde apresento técinicas avançadas no Delphi que poucas pessoas usam ou exporam, você receberá um mix de conhecimentos dobre padrões de projeto, MVC, POO, Arquitetura de software, refatoração e muito mais.
CLIQUE AQUI PARA SABER MAIS SOBRE O TREINAMENTO TÉCNICAS AVANÇADAS DE DELPHI