Alguém já Colocou de 40000 linhas em ListView

20/01/2006

0

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


Gm.gui

Gm.gui

Responder

Posts

20/01/2006

Massuda

Imaginando que os ´...´ signifiquem ´código para incluir UM item´, o correto seria fazer...
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.


Responder

20/01/2006

Gm.gui

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


valeu


Responder

20/01/2006

Massuda

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.


Responder

21/01/2006

Gm.gui

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


Responder

21/01/2006

Edilcimar

eu já coloquei, mas foi num listbox


Responder

21/01/2006

Massuda

...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.


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar