2017-06-27 66 views
5

Mam SysListView32, który powinien potencjalnie obsługiwać miliony wierszy i trzy kolumny tekstu A, B, C, każdy po < 256 znaków.1-milionowy wiersz ListView

Załóżmy, że kolumna B ma wiele powtórzeń (przykład: kolumna A to nazwa pliku, kolumna B to ścieżka, a każdy wiersz jest plikiem systemu plików) i ma tylko 100k różnych wartości (zamiast kilku milionów).

Czy można uniknąć duplikowania w pamięci RAM zawartości kolumny B elementu GUI ListView?

możemy wypełnić ListView tylko wskaźników do tablic elementów (wzięte z 100k-element tablicy różnych wartości kolumna B), zamiast danych duplikatów?

Jak to zmienić, aby działało?

LV_ITEM item; 
item.mask = LVIF_TEXT; 
item.pszText = "Hello"; 
... 
ListView_SetItem(hList, &item); 
+9

[Wirtualna Lista-View Style] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb774735.aspx #Virtual_ListView_Style) i [Jak korzystać z kontroli widoku wirtualnej listy] (https://msdn.microsoft.com/en-us/library/windows/desktop/hh270411.aspx). – IInspectable

+0

@IInspectable Wygląda naprawdę interesująco, przeczytałem go kilka razy, ale prawdopodobnie potrzebuję 10 dodatkowych odczytów, aby w pełni go uzyskać. Może myślisz, że moglibyśmy znaleźć pełny projekt zabawkowy MSVC++, który to demonstruje, z prawdziwym, konkretnym listView wypełnionym wierszami? – Basj

+1

Naprawdę niewiele. Tworzysz widok listy używając stylu 'LVS_OWNERDATA', przechowujesz wskaźnik na surowych danych w' LVITEM.lParam' i obsługujesz komunikat 'LVN_GETDISPINFO'. – IInspectable

Odpowiedz

0

To, czego potrzebujesz, jest również określane jako "Lista wirtualna". Formant listy wirtualnej to formant widoku listy, który ma styl LVS_OWNERDATA. Ten styl umożliwia kontrolowanie obsługi licznika elementów aż do wartości DWORD (domyślna liczba elementów obejmuje tylko int). Jednak największą zaletą tego stylu jest możliwość posiadania tylko podzbioru elementów danych w pamięci w tym samym czasie. Dzięki temu kontrola widoku listy wirtualnej nadaje się do użytku z dużymi bazami danych, w których istnieją już określone metody dostępu do danych. Dla danego zbioru danych (listy lub tablicy dynamicznej), należy wykonać następujące kroki:

  1. dodać styl LVS_OWNERDATA do ListView
  2. Nawiązywanie połączenia do CListCtrl :: SetItemCount przechodząc rozmiaru źródła danych, jak std :: vector :: size().
  3. Złap powiadomienie LVN_GETDISPINFO. Tutaj dane są renderowane do ListCtrl.

Proszę spojrzeć na załączone linki, które dodałem, aby uzyskać więcej informacji i przykładowy kod. Jeśli korzystasz z CListView, możesz mieć dostęp do CListCtrl z GetListCtrl.

Linki:

Virtual List Controls

Using virtual lists

+0

Dzięki @RonTLV. Czy możesz dodać jakiś kod jako przykład tego, jak to zrobić? – Basj

+0

@Basj [Korzystanie z kontrolki ListView w ramach Win32 API] (https://www.codeproject.com/Articles/2890/Using-ListView-control-under-Win-API) + źródła + projekt demonstracyjny – RonTLV

+0

@Basj [O liście- Zobacz elementy sterujące] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb774735 (v = vs.85) .aspx) i [Używanie kontrolek widoku listy] (https: // msdn. microsoft.com/en-us/library/windows/desktop/bb774736(v=vs.85).aspx) – RonTLV