logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ListView, WinAPI - Gubi się "selected" na elementach

Dżyszla 20 Kwi 2015 15:12 1149 18
REKLAMA
  • #1 14632664
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Hej,

    Mam dziwny i skomplikowany problem. Na Windows 2012 Server jest sobie program z całą masą kontrolek ListView rozmieszczonych na zakładkach (w PageControls). Uruchamiam program przez pulpit zdalny. Zaznaczam sobie jakiś element listy i przechodzę na inną zakładkę. Tam oczywiście potrafię odwołać się do właściwości wybranego elementu (ListView.Selected). I teraz myk: rozłączam się (nie wylogowuję) i łączę ponownie do pulpitu zdalnego i... próba odwołania do wybranego elementu kończy się zwróceniem wartości 0 (nil), czyli jakby żaden element nie był wybrany. Na liście jednak dalej jest narysowany jak wybrany.
    I teraz ciekawostka: Wysłanie komunikatu sprawdzającego ilość zaznaczonych elementów, zwraca 1 i... nagle odwoływanie się do wybranego elementu jest poprawne (już jest zwracany).
    Może mi ktoś powiedzieć o co (piii) chodzi?

    Nie uzależniam tematu od języka programowania, bo obsługa praktycznie jest na komunikatach Windowsa.
  • REKLAMA
  • #2 14632948
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    A jak nie przechodzisz na inną zakładkę to wszystko gra?
  • REKLAMA
  • #3 14633231
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    W 95 na 100 przypadków gra. W pozostałych przechodzę, robię kilka operacji, wyświetlam dane w innej liście i... tamta sygnalizuje, że właśnie element traci swoją właściwość.

    Jeszcze jedna uwaga, może pomoże: lista jest w trybie raportu, z dwoma kolumnami, rysowana samodzielnie, z multiselectem.
  • #4 14633272
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    Czy próbowałeś HideSelection dać na false?
  • #6 14633552
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    Napisałem programik testowy, nie mam efektów o których piszesz, więc jednak coś nie tak robisz.
    Dodałem również EXE na wypadek gdyby nie miałeś odpowiedniego kompilatora, hasło: 1234
    Załączniki:
    • UnfocusListBox.rar (155.3 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 14633642
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Sprawdzę jutro, jak będę miał dostęp do zdalnego pulpitu tam, gdzie ten problem mi się powtarza przy rozłączaniu sesji RDP.
    Bo podczas normalnej pracy jest to nie do uchwycenia lub nakładają się jakieś nieznane mi (od kilku lat właściwie) okoliczności.
  • #8 14633678
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    Sprawdź <Alt-Tab> na program pełnoekranowy np jakaś starsza gra.
  • REKLAMA
  • #9 14634586
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Zrobiłem tylko 3 modyfikacje w komponencie: +Multiselect, +ReadOnly, +RowSelect.
    Zaznaczyłem po elemencie z każdej listy (labele ustawione), rozłączyłem od RDP i połączyłem i taki efekt (natychmiast po połączeniu, bez klikania)
    ListView, WinAPI - Gubi się "selected" na elementach ListView, WinAPI - Gubi się "selected" na elementach

    PS. Zmiana elementu na widocznej liście nie zmienia niczego w widoczności zaznaczonego elementu z drugiej listy.
    Ustawienia wymienione wczesniej jednak nie mają znaczenia.
    Wywołanie SelCount z każdej listy przed odczytem ten problem naprawia, choć nie jest to dla mnie rozwiązaniem ;) (są jeszcze inne przypadki, które nie są powtarzalne, gdzie Selected znika).
    Styl listy nie ma znaczenia.

    Dodano po 1 [godziny] 20 [minuty]:

    Jeszcze jedna ciekawa obserwacja - do aplikacji dodałem procedurę obsługi zdarzenia OnMessage z kodem:
    Kod: text
    Zaloguj się, aby zobaczyć kod
    i to też rozwiązuje niby problem, ale jest idiotyczne ;)
  • #10 14634918
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    Powtórzyłem zmiany o których mówisz i nie mam żadnych problemów.
    Więc podaj wersje kompilatora oraz czy (oraz jakie) patch'e wgrałeś.
  • #11 14634929
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Rozumiem, że także testujesz na RDP z 2012 R2 rozłączając się łącząc ponownie?
    Używam XE2 ze sporą dawką komponentów trzecich (choć w aplikacji nie użyte)
    hm, wgrałem Twojego execa i faktycznie nie zauważyłem problemu.
  • #12 14634939
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    Więc pytam czy wgrałeś wszystkie 4 (nie jestem pewien czy nie było 5-go) patch'e do Delphi XE2?
  • #13 14634981
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Wszystkie.

    Zrobiłem jeszcze testy na dwóch serwerach 2008 R2 - na jednym występuje, na drugim nie (moja kompilacja). Jeden z 2003 - nie występuje.
  • REKLAMA
  • #14 14635158
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    A moja kompilacja daje błąd gdziekolwiek?
    Załączniki:
    • UnfocusListBox.rar (151.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #15 14635228
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Nie.

    Jednak chyba muszę całkiem zmienić podejście i przestać bazować na listach, bo za chwilę stracę robotę :(
  • #17 14635465
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Używamy VirtualStringTree głównie, ale niby zawsze najpewniej korzystać z natywnych...
    Takich list i wyborów mam ponad 20 w całej aplikacji, więc zmiany to byłyby pracochłonne. Ale dzięki wielkie za pomoc i przygotowanie testu. Gdzie się gryzie kompilator z systemem operacyjnym (w ogóle XP i 2003 jedynymi słusznymi systemami! :P)

    Temat niemniej zostawię otwarty, jakby ktoś się chciał włęczyć w dyskusję.
  • #18 14635490
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    1. Właśnie dla tego powstał VirtualStringTree że jest lepszy od natywnego pod każdym względem.
    2. Z mojego doświadczenia, przeróbka z ListView do VirtualStringTree zajmuję max 2 godziny (przeważnie 45 min o ile nie ma jakichś dziwacznych funkcjonalności) więc średnio potrzebujesz jakieś 20 do 30 godzin - w sumie mniej niż tydzień, zaś aplikacja zyska.
    3. Może spróbuj przejść najpierw na to: http://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvListView jest spora szansa że zadziała, zaś zmiana - max 1 minuta.
  • #19 14635839
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    JVListView nie pomagał - też już sprawdzałem.
    Cóż, jak będzie czas, to może w przyszłości pomyślę. Jest sporo niestety funkcji (1/4 zdarzeń wykorzystana na każdej z list), rysowanie, gesty i takie tam... A jako, że program idzie na żywo do klienta, który się piekli, to nie mogę sobie obecnie pozwolić na eksperymenty z nowym obiektem :( Ale dzięki za podpowiedź - w wolnej chwili się przyjrzę na pewno.

    Na marginesie, to opisany przypadek to akurat bardzo powtarzalny i łatwy do wychwycenia. Natomiast dzieją się jeszcze inne, poważniejsze cuda-wianki, które nie są powtarzalne. I próba naprawienia tych pierwszych sprawiła, że te drugie znacznie częściej zaczęły występować. Także coś tam w ogóle jest schrzanione. Obecnie zrezygnowałem w ogóle z właściwości Selected do wykorzystywania na innych zakładkach i buduję własne listy obiektów, które semantycznie są właśnie listą zaznaczonych. Jutro zobaczymy, jak wyjdzie w praniu, bo nijak nie umiałem tego wiarygodnie przetestować.

Podsumowanie tematu

✨ Użytkownik zgłasza problem z kontrolką ListView w aplikacji działającej na Windows Server 2012, gdzie po rozłączeniu i ponownym połączeniu z pulpitem zdalnym, zaznaczenie elementu znika, mimo że wizualnie pozostaje zaznaczone. Problemy występują głównie przy przechodzeniu między zakładkami. Użytkownik zauważa, że wywołanie metody SelCount przed odczytem zaznaczonego elementu naprawia problem, ale nie jest to satysfakcjonujące rozwiązanie. W dyskusji pojawiają się sugestie dotyczące ustawienia HideSelection oraz testowania różnych komponentów, takich jak VirtualStringTree i JVListView, jednak użytkownik nie może sobie pozwolić na ich implementację w obliczu zbliżającej się produkcji. Wspomniano również o różnicach w działaniu na różnych wersjach serwerów Windows.
Wygenerowane przez model językowy.
REKLAMA