Newsgroup: it.comp.lang.delphi
Titolo: Proprietà AllocBy di TListView

Qualcuno potrebbe spiegarmi a cosa serve la proprietą AllocBy del componente
TListView?
Guardando l'help e su internet non sono riuscito a capire bene a cosa serve.
TIA.
Zano.

 serve.
Beh, l'help mi pare piuttosto chiaro.
Poi, a cosa serva in pratica, non so: in passato ho provato ad usarlo (con
un 486DX e quindi se avesse avuto un qualche impatto sulle prestazioni
l'avrei notato di sicuro) e non ne avevo tratto nessun beneficio.
Più che altro, quando ho molti elementi da inserire e se la situazione me lo
permette, preferisco di gran lunga costruire la listview in modo virtuale
utilizzando la OwnerData; è un po' macchinoso ma aprire un file di 20 mega
in 10 millisecondi è molto appagante ;)
--
Jax
====
Ci sono persone che si abbandonerebbero volentieri, ma delle quali non
si tollera di essere abbandonati.


Quando si aggiunge un item in una ListView, viene allocata un'area di
memoria per aggiungere la nuova struttura dell'item.
Nel momento in cui tu sai che dovrai aggiungere un grande numero di
items in un colpo solo, puoi ottimizzare il codice utilizzando la
proprietà AllocBy che tramite il messaggio LVM_SETITEMCOUNT alloca in
una volta sola le strutture dati anzichè una per una quando fai
ListView.Items.Add
Ciao.
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"

 in 10 millisecondi è molto appagante ;)
Ti spiego il problema: io devo creare un paio di liste con 10.000 elementi.
Ho provato ma risulta lentissimo (sembra quasi che il processo si sia
impallato).
Mi potresti spiegare come utilizzare in modo virtuale una TListView.
Grazie.

 Grazie.
Innanzitutto un consiglio: se la usi nel modo tradizionale, prova a fare
ListView.BeginUpdate prima di inserire gli elementi e
ListView.EndUpdate alla fine (magari in un bel try...finally).
Se è ancora lento, ti spiego come funziona la listview virtuale.
In buona sostanza devi fare questo:
- imposta la proprietà Listview.OwnerData a True
- caricare i dati in una struttura (tipo una stringlist) e lasciarla aperta
- impostare ListView.Items.Count uguale al numero di elementi che dovrà
contenere
- nell'evento ListView.OnData ti vengono automaticamente passati n items
(dove n è il numero di items attualmente visibili), e per ogni item tu devi
impostare le sue proprietà (Caption, ImageIndex, Subitems...) proprio come
fai adesso aggiungendo un nuovo item, creando una corrispondenza tra la
posizione di quell'elemento nella listview e nella tua struttura in memoria
(o su file).
Se hai bisogno di gestire una ricerca tramite FindCaption, devi anche
implementare l'evento OnDataFind.
L'unica "difficoltà" nell'usare questo metodo è che, essendo la ListView
virtuale non contiene dati, quindi per caricare ad ogni scroll i dati per
quella schermata, l'origine dei dati da cui devi leggere deve essere sempre
aperta e possibilmente indicizzata, come una StringList o uno Stream.
--
Jax
====
Certe volte si è diversi da se stessi quanto dagli altri. (La
Rochefoucauld)

 ListView virtuale non contiene dati
Dimenticavo: se hai bisogno, ti posso passare un programma che ho fatto; è
un po' particolare, ma si capisce abbastanza bene come gestire la lista.
--
Jax
====
L'unico modo per liberarsi da una tentazione è cedervi. (Wilde)

 un po' particolare, ma si capisce abbastanza bene come gestire la lista.
Innanzitutto grazie per le risposte tempestive.
Utilizzo già i metodi BeginUpdate ed EndUpdate, ma l'operazione rimane molto
lenta.
Allora provo ad implementare la gestione virtuale della lista, e poi ti
faccio sapere.
Anzi se puoi girarmi in email questo progettino te ne sarei grato.
Ah, una domanda che non centra molto. C'è un modo per impostare la
visibilità delle scrollbars in una TListView? Io vorrei visualizzare
solamente la scrollbar verticale .