ListView i LVM_DELETEITEM

dział ogólny

ListView i LVM_DELETEITEM

Nowy postprzez beherit » poniedziałek, 14 grudnia 2009, 12:36

Próbuję usunąć dany element z ListView za pomocą WinAPI (komponent znajduje się w innej aplikacji). Dla przykładu w ListView mam 4 elementy i próbuję usunąć 2 element:
Kod: Zaznacz cały
SendMessage(hwnd,LVM_DELETEITEM,1,0);

W efekcie jest usuwany ten 2 element jak i jego następnik :/ Obojętnie, który bym nie usunął to zawsze zostanie usunięty też kolejny element. Google za dużo mi nie powiedział o na ten temat - wie ktoś jak to rozwiązać? :)
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez Cyfrowy Baron » poniedziałek, 14 grudnia 2009, 14:43

Co rozumiesz przez następny element, czy ten następny element to wiersz. Jeżeli to wiersz to czy wiersz poniżej usuwanego czy powyżej? A może następny element to kolumna?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez beherit » poniedziałek, 14 grudnia 2009, 17:42

Gdyby chodziło o kolumnę to bym nie używał LVM_DELETEITEM tylko LVM_DELETECOLUMN - nie wiedziałem, że aż tak ciężko skojarzyć :shock: To chyba logiczne, że kolejny to chodzi o ten niżej... :shock: Co jak co ale w ListView kolejny Item to zawsze ten niżej no nie? ;]
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez beherit » środa, 16 grudnia 2009, 22:57

Rozumiem, że administrator forum poszpanował na początku wiedzą ale konkretnej odpowiedzi na pytanie i tak nie uzyskam? Dzięki...
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez Cyfrowy Baron » czwartek, 17 grudnia 2009, 11:43

nie wiedziałem, że aż tak ciężko skojarzyć :shock: To chyba logiczne, że kolejny to chodzi o ten niżej... :shock: Co jak co ale w ListView kolejny Item to zawsze ten niżej no nie? ;]


Gdybyś nie był taki obcesowy, to pewnie poświęcił bym trochę czasu, by to sprawdzić, a tak to mi się nie chce. Może ktoś inny.

Poza tym podałeś za mało informacji.

(komponent znajduje się w innej aplikacji)


W jakiej aplikacji.

Przytoczyłeś fragment kodu zamiast całego mechanizmu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez beherit » sobota, 2 stycznia 2010, 23:06

Cyfrowy Baron napisał(a):
(komponent znajduje się w innej aplikacji)

W jakiej aplikacji.

Przytoczyłeś fragment kodu zamiast całego mechanizmu.

Gdyby to było ważne to bym podał. Błąd występuje w dowolnej aplikacji.
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez Cyfrowy Baron » niedziela, 3 stycznia 2010, 10:02

Gdyby to było ważne to bym podał. Błąd występuje w dowolnej aplikacji.


Po pierwsze przeprowadzając testy należałoby robić to na tych samych aplikacjach, by wyniki testów było do siebie zbliżone. Po drugie mogę sobie napisać własny kod od podstaw, który będzie działał prawidłowo, ale to nie w żaden sposób nie będzie wskazywało na błędy w Twoim kodzie.
Skoro jesteś przekonany, że cały Twój kod jest poprawny, a problem dotyczy wszystkich programów zawierających obiekt typu TListView, to można by dojść do wniosku, że inaczej być nie może.

Gdybyś zakładając post od razu podał wszystkie niezbędne informacje, to pewnie już dawno uzyskałbyś odpowiedź, ale jedyne co podałeś to:

Kod: Zaznacz cały
SendMessage(hwnd,LVM_DELETEITEM,1,0);


Z tego kodu raczej trudno wywnioskować jak pobrałeś uchwyt, ale skoro coś się dzieje z obiektem, to może prawidłowo. Zawsze jednak pozostaje to może....
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez beherit » niedziela, 3 stycznia 2010, 11:56

@Up Sory ale może byś tak przestał biadolić i napisał byś coś od rzeczy he? Testy robiłem - tak bym nie napisał na forum.
Cyfrowy Baron napisał(a):Po drugie mogę sobie napisać własny kod od podstaw, który będzie działał prawidłowo, ale to nie w żaden sposób nie będzie wskazywało na błędy w Twoim kodzie.

To go napisz i wstaw tutaj a nie cfaniakujesz ciągle wielkiego guru...

Cyfrowy Baron napisał(a):to można by dojść do wniosku, że inaczej być nie może.

Dlatego też szukam rozwiązania tego problemu ale jak widać na tym forum go nie znajdę...

Cyfrowy Baron napisał(a):Z tego kodu raczej trudno wywnioskować jak pobrałeś uchwyt, ale skoro coś się dzieje z obiektem, to może prawidłowo. Zawsze jednak pozostaje to może....

Tak bo Ty jesteś pan i władca i każdy kto napisze na pewno wszystko źle robi... Sory ale uchwyt do elementów to ja pobrać umiem ;]
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez Cyfrowy Baron » niedziela, 3 stycznia 2010, 12:02

Tak z ciekawości, sprawdziłem to i znam rozwiązanie. Ponieważ jednak jesteś taki agresywny, to zachowam je dla siebie, ale inni na pewno chętnie pomogą.

Dlatego też szukam rozwiązania tego problemu ale jak widać na tym forum go nie znajdę...


Przecież nikt ciebie tutaj na siłę nie trzyma...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez beherit » niedziela, 3 stycznia 2010, 12:06

Dziękuję za warna :lol: Wprost nie mogę wytrzymać ze śmiechu :lol:

Cyfrowy Baron napisał(a):Tak z ciekawości, sprawdziłem to i znam rozwiązanie. Ponieważ jednak jesteś taki agresywny, to zachowam je dla siebie, ale inni na pewno chętnie pomogą.

Jasne, w końcu administrator musi zachować dobrą twarz i wciskać kit, że mu się to udało obejść lecz kodu i tak nie poda. Nie ma co, gratulacje za "wspaniałe" prowadzenie forum.
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez Cyfrowy Baron » niedziela, 3 stycznia 2010, 15:53

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.aspx

Inne 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.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
beherit
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez Witold » wtorek, 5 stycznia 2010, 21:30

Cyfrowy Baron napisał(a): 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
...
Jak widzisz usunięty został tylko wybrany element.


U mnie (BCB6) są kasowane dwa, tak wskazuje testowanie ilości elementów. Jeden z kasowanych jest co prawda widoczny, ale nie da się go wybrać, po ListView1->Repaint() - znika.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez Cyfrowy Baron » wtorek, 5 stycznia 2010, 21:50

To prawda problemem jest to, że komunikat kasuje dwa wiersze zamiast jednego, o czym napisałem niżej. Podałem również rozwiązanie problemu.
U mnie (BCB6) są kasowane dwa, tak wskazuje testowanie ilości elementów. Jeden z kasowanych jest co prawda widoczny, ale nie da się go wybrać, po ListView1->Repaint() - znika.


Masz jakieś problemy z odświeżaniem. Może to coś z kartą graficzną.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez Witold » środa, 6 stycznia 2010, 00:05

Cyfrowy Baron napisał(a):To prawda problemem jest to, że komunikat kasuje dwa wiersze zamiast jednego, o czym napisałem niżej. Podałem również rozwiązanie problemu.


Cyfrowy Baron napisał(a):usuwać pojedyncze elementy tej listy, ale tylko wtedy gdy ListView posiada styl vsIcon lub vsSmallIcon.


Pisałem o ListView w stylu vsIcon lub vsSmallIcon, wtedy też usuwa dwa elementy (u mnie, BCB6).

Co do rozwiązania, u mnie w testach działa dobrze. Myślę że istniała możliwość że skoro LVM_DELETEITEM usuwa dla TListView z VCL dwa elementy, to LVM_INSERTITEM mogło dodać dwa, ale na szczęście tak da się to obejść.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: ListView i LVM_DELETEITEM

Nowy postprzez Cyfrowy Baron » środa, 6 stycznia 2010, 12:46

Pisałem o ListView w stylu vsIcon lub vsSmallIcon, wtedy też usuwa dwa elementy (u mnie, BCB6).


U mnie usuwa jeden C++Builder 2007.



Co do komunikatu LVM_DELETEITEM to z informacji jakie uzyskałem w sieci wynika, że ten komunikat również usuwa jeden element, tak jest też to opisane w pomocy do BCB, ale podobno występuje błąd, który sprawia, że ten komunikat wywołuje wewnętrzna funkcję ListView->Items->Delete(x) co powoduje ponowne usunięcie wiersza. O tym, że obsługa komunikatów w odniesieniu do tego obiektu kuleje może świadczyć fakt, że u ciebie odświeżanie nie działa prawidłowo i że u mnie przy stylu vsIcon lub vsSmallIcon usuwa jeden element a u ciebie 2.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości