Array
(
)

Alguém já Colocou de 40000 linhas em ListView

Gm.gui
   - 20 jan 2006

Estou tentando carregar um ListView com mais de 40000 linhas de um resultado de um select

so que meu sistema tranca uso da seguinte forma

while not eof
Items.BegimUpdate;
...
...
...
...
Items.EndUpdate;
Next;
end;


alguém saberia uma solução para o ListView não consumir tanto memória e ser um pouco mais rápido para carregar....

Valeu


Massuda
   - 20 jan 2006

Imaginando que os ´...´ signifiquem ´código para incluir UM item´, o correto seria fazer...#Código

Items.BeginUpdate; 
while not eof ...
...
Next;
end;
Items.EndUpdate;
...isso deve resolver a questão do tempo gasto para preencher o listview.

Com relação à memória consumida, se você puder manter o resultado da query enquanto estiver com o listview visível, você poderia usar o listview em modo virtual; dê uma olhada na ajuda do Delphi sobre o evento OnData do TListView.


Gm.gui
   - 20 jan 2006

Olhei no Help, mas a princípio nem um pouco intuitivo, teria um exemplo para ceder se possível


valeu


Massuda
   - 20 jan 2006

Não sei se tem em todas as versões do Delphi, mas costuma ter uma pasta chamada ´Demos\Virtual Listview´ dentro da pasta onde o Delphi está instalado.


Gm.gui
   - 21 jan 2006

Achei no Meu Delphi esses exemplos, mas não entendi eles muito bem, pois tenho um procedimento de Carrega Lista que faz a montagem de um Querry para a seleção e desse resultado adiciona no ListView, deixar a querry aberta até não teria problema mas como faria a ligação do OnData, entende, o componente saberia que no momento que eu fecho a querry ele deveria limpar, e no momento que eu abro a consulta ele deveria adicionar, qual o real ganho de performance nisso


Edilcimar
   - 21 jan 2006

eu já coloquei, mas foi num listbox


Massuda
   - 21 jan 2006


Citação:
...como faria a ligação do OnData, entende, o componente saberia que no momento que eu fecho a querry ele deveria limpar, e no momento que eu abro a consulta ele deveria adicionar, qual o real ganho de performance nisso
É complicado da um exemplo de ListView em modo virtual porque isso depende muito dos seus dados.

Basicamente, no evento OnData você recebe um Item para você preencher as propriedades dele (por exemplo, o Caption); para saber quais dados por no Item, use o valor Item.Index que te dá qual a ordem do item no ListView.

O problema é que esse evento é gerado para um mesmo item sempre que esse item é exibido pois o ListView não guarda os dados. Por exemplo, vamos supor que o item 0 esteja visível; o ListView gera o evento OnData para pedir os dados do item 0, os exibe e em seguida os descarta; se o usuário rolar o listview de modo que o item 0 suma e depois apareça, novamente será gerado um OnData para o item 0. Logo, não basta abrir a query uma vez e depois fechar, ela tem que ficar aberta o tempo todo que o list view estiver visível.

Note que o listview não guarda os dados nele, ele apenas gera o evento OnData, pega os dados e os exibe e em seguida descarta esses dados. Desse modo, ele não consome memória.

Sinceramente, eu usaria o modo virtual apenas se o consumo de memória for realmente problema, pois muitos recursos automáticos do listview são desabilitados nesse modo; por exemplo, a ordenação do itens tem que ser feita por você pois o listview não tem todos os dados para gerar a ordenação. Se for o seu caso, estude bastante o exemplo e leia atentamente a Ajuda do Delphi sobre esse assunto.