Builder ListView Filtrowanie pozycji za pomocą Edit1

0

Wie ktoś jak zrobić aby ListView wyświetlało tylko pozycje zawierające tekst z Edit1?

0

trzeba sprawdzić każdy item i usunąć te, które nie spełniają założeń

0

Zrobiłem to następująco. ListView1 mamy wypełnione danymi, które chcemy filtrować na podstawie wartości wpisanych do pola Edit.

W tym celu stworzyłem nowy obiekt tymczasowy TMPListView do którego przekopiowałem wszystkie pozycje z ListView1. TMPListView jest niewidoczny gdyż potrzebujemy jedynie obiekt, który przechowa nasze dane z ListView1, które następnie będziemy porównywać z polem Edit "filtrować" i pasujące elementy będziemy dodawać do ListView1. Przy każdym wpisywaniu znaku do Edit uruchamiany jest event Edit2Change(TObject *Sender) który weryfikuje, które elementy z TMPListView zawierają wyszukiwany tekst z Edit. Jeśli są elementy zawierające wyszukiwany tekst to są dodawane do ListView1.
Z punktu widzenia użycia pamięci może nie jest to optymalne rozwiązanie ale jedyne jakie udało mi się wymyślić :)
Mam nadzieje, że się przyda. Jeśli pomógł Ci ten post - jak w swoim życiu trafisz na jakiś problem również podziel się rozwiązaniem z innymi :)

TListView * TMPListView = new TListView (SDIAppForm);
TMPListView->Visible=FALSE;
TMPListView->Parent=SDIAppForm;

for (int i = 0; i < ListView1->Items->Count; i++)
{
TMPListView->Items->Add();
TMPListView->Items->Item[i]=ListView1->Items->Item[i];
}

void __fastcall TSDIAppForm::Edit2Change(TObject *Sender)
{
int intus;
SDIAppForm->ListView1->Clear();

for (int i = 0; i < TMPListView->Items->Count; i++)
{


intus= TMPListView->Items->Item[i]->Caption.Pos(SDIAppForm->Edit2->Text);
if (intus!=0 )
		{
			SDIAppForm->ListView1->Items->Add();
			SDIAppForm->ListView1->Items->Item [SDIAppForm->ListView1->Items->Count-1] = TMPListView->Items->Item[i]   ;
		}
}

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1