Set OwnerData to true to specify that the list view is virtual. A virtual list view can contain a huge number of items (specifically, up to a DWORD). However, you must manage the items of a virtual list view using the OnData, OnDataFind, OnDataHint, and OnDataStateChange event handlers. For example, you must explicitly provide a value to a list item’s StateIndex property if it is to display a check box.
When creating a virtual list view, you must set the Count property for the Items to the number of items in the virtual list.
The only information contained in a virtual list view control is the selection and focus information.
To improve the performance of a virtual list view control, cache items for quick retrieval. The OnDataHint event can help optimize retrieval from the cache.
Note: Virtual list views need not be owner-drawn. The OnData, OnDataFind, OnDataHint, and OnDataStateChange events enable the list view’s default drawing, if desired.
Og måske vi her skulle opfordre bleze til at læse spørgsmålet før han svarer ?
bleze: Ville rigtignok gerne undgå OwnerDraw, sådan som jeg eksplicit angav, men det kan jo være den eneste løsning, så jeg lader dit svar blive stående lidt endnu.
doc404: Den skal jeg kigge på - snarligt (det at den er bygget fra bunden udenom MS's COM'er tiltaler mig). Nu skal jeg bare have brug for et TTreeView - men den kan måske bruges som TListView?
borrisholt: Hvis jeg kører non-virtual og sætter checked=true så dur det fint. I virtual mode viser den caption og subitems fint, men ikke antydningen af en checkbox. Mht. artiklen - med lille omskrivning: "It's all Polish to me"! Interessant, givetvis, ulæseligt, ja, men det lykkes. Der er desværre ikke noget nyt udover jeg måske endelig ser et fungerende (om end lidt primitivt) eksempel hvordan man bruger OnDataFind. Det måtte godt have været objekter i stedet for records. I mit testprogram har jeg en parallel TObjectList kørende og så ser mit testprograms kode sådan ud:
procedure TfrmMain.lvNamesData(Sender: TObject; Item: TListItem); var Person : TPerson; begin Person := fPersonList[Item.Index]; if assigned(Person) then Person.FillListItem(Item); end;
og TPerson.FillListItem ser sådan her ud:
procedure TPerson.FillListItem(aListItem: TListItem); begin with aListItem do begin SubItems.Clear; // Not really needed as we always add to a new item case fSex of stUndefined : SubItems.Add('?'); stMale : SubItems.Add('Male'); stFemale : SubItems.Add('Female'); stBoth : SubItems.Add('Male/Female'); end; // case Checked := fVisible; // May have to draw from bottom! Data := self; // Prepare Data-property Caption := fName; // Fires an OnChange event so if Data's used, have it prepared! end; // with end;
Tror jeg lukker spørgsmålet. Beklager bleze, men dit svar løste ikke problemet.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.