Nie będą trzymał Ciebie dłużej w niepewności tym bardziej, że odpowiedzi na pytanie dlaczego tak się dzieje nie znajdziesz. Flaga LVM_DELETEITEM odnosi się co prawda do obiektu typu TListView i można za jej pomocą usuwać pojedyncze elementy tej listy, ale tylko wtedy gdy ListView posiada styl vsIcon lub vsSmallIcon.
Łatwo to sprawdzić. Umieść na formularzu obiekt ListView1 i ustaw mu ViewStyle na vsIcon. Dodaj kilka elementów w jego właściwości Items, a potem za pomocą tego prostego kodu usuń wybrany element:
- Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TAppForm::Button1Click(TObject *Sender)
{
SendMessage(this->ListView1->Handle, LVM_DELETEITEM, 1, 0);
}
//---------------------------------------------------------------------------
Jak widzisz usunięty został tylko wybrany element.
Jeżeli zmienisz teraz właściwość ViewStyle vsReport lub vsList to zmieni się styl pracy obiektu i wysłanie mu komunikatu LVM_DELETEITEM spowoduje, że obiekt najpierw ustawi się na wybrany element i wykona polecenie usunięcia go, to polecenie ma niestety pewien mankament, otóż z nieznanych bliżej przyczyn powoduje wywołanie wewnętrznej funkcji Delete tego obiektu i dlatego zaraz po wykonaniu polecenia LVM_DELETEITEM obiekt ListView wywołuje własną funkcję ListView->Items-Delete(x); co skutkuje ponownym usunięciem elementu.
Rozwiązaniem problemu mogło by być pobieranie za pomocą komunikatów całej zawartości obiektu, usunięcie całości i odtworzenie tabeli bez wybranego elementu. Trzeba by się posłużyć komunikatami GETITEM, SETITEM, strukturami LVITEM i VTILEINFO.
O tak karkołomnym tworzeniu obiektu ListView można przeczytać tutaj:
http://69.10.233.10/KB/combobox/listview.aspxInne mniej karkołomne rozwiązanie, na które sam mogłeś wpaść, gdybyś pomyślał, to wstawienie do listy w wybranej do usunięcia pozycji pustego wiersza za pomocą komunikatu
LVM_INSERTITEM, ale to też wymaga trochę pracy, gdyż trzeba się przy tym posłużyć strukturą
LVITEM. Po wstawieniu pustego elementu wysyłasz komunikat
LVM_DELETEITEM i usuwane są oczywiście dwa elementy, ale jeden z nich jest pusty, nadmiarowy, a wiec zbędny.