Utrzymanie podświetlenia w TreeView

0

Witam.

Czy da się uzyskać utrzymanie podświetlania wybranej pozycji
jeżeli komponent jest nie aktywny.

screenshot-20180318190742.png

0

Myślę że musisz pokombinować coś w metodzie rysowania kontrolki.
TtreeView ma property onCustomDrawItem oraz onCustomDraw pod które pewnie można podpiąć własne metody rysowania kontrolki. Ja bym poszedł w tym kierunku, ale ponieważ rysowanie kontrolek to nie moja bajka więc nie mam pewności. Myślę że niezawodny @furious programming zajrzy tu i powie coś więcej, bo zna te tematy.

0

Nie za bardzo mam czas na testy, jednak sprawdź jakie flagi dostarcza zdarzenie malowania itemów.

W Lazarusie np. zdarzenie OnCustomDrawItem posiada argument State będący zbiorem poniższych flag:

type
  TCustomDrawStateFlag = (
    cdsSelected,
    cdsGrayed,
    cdsDisabled,
    cdsChecked,
    cdsFocused,
    cdsDefault,
    cdsHot,
    cdsMarked,
    cdsIndeterminate
  );

Sprawdziłbym więc ich znaczenie. Domyślnie TTreeView – malowany według systemowego schematu – inaczej maluje pozycję zaznaczoną gdy komponent ma fokusa (u mnie: tło pozycji jest niebieskie), a inaczej gdy kontrolka fokusa nie posiada (u mnie: tło pozycji jest szare):

treeview.png

Tak więc poeksperymentuj z tymi flagami, ustawiając różne style dla malowania pozycji (najlepiej w prostej aplikacji testowej). Przeglądnij też listę opublikowanych właściwości (w oknie inspektora obiektów), bo możliwe, że tam też znajdziesz przydatne ustawienia.

0

Muszę doprecyzować zachowanie TreeView. niebieskie podświetlenie nie znika do czasu kiedy
nie uaktywnię komponentu który ma w sobie edycję, buttona. Przy innych zostaje podświetlenie.

W TCustomDrawStateFlag nie znalazłem rozwiązania.

0

@Mr.YaHooo podał rozwiązanie. Zobacz na opis właściwości HideSelection:

Description

Determines whether a selected node appears selected when the focus shifts to another control.

Use HideSelection to specify whether the user is given visual feedback about the current selection in the tree view when it does not have focus. If true, the selected node is not visually distinct from other nodes until focus returns to the control. If false, the node always appears selected.

Na moje oko, przy włączonej opcji HideSelection, kontrolka w momencie przekazywania fokusa przemalowuje swoją zawartość, wołając odpowiednie zdarzenie, do którego nie przekazuje cdsSelected, dzięki czemu po utracie fokusa, zaznaczona pozycja przestaje być zaznaczoną. Wyłączenie opcji HideSelection zapobiega temu.

Piszę „na moje oko”, bo nie mam teraz czasu sprawdzać tego. No i też nie mam Delphi, a LCL w wielu miejscach działa inaczej niż VCL, więc nie chcę wprowadzać w błąd.

0

@Mr.YaHooo: Wielkie dzięki działa.
Nie wiem tylko dlaczego zadziałało dopiero poprawnie jak wyłączyłem HideSelection.
HideSelection := false;

0
dasej napisał(a):

Nie wiem tylko dlaczego zadziałało dopiero poprawnie jak wyłączyłem HideSelection.

No przecież tak to ma działać…

Zwróć uwagę na nazwę tej właściwości – HideSelection oznacza UkryjZaznaczenie. Jeśli jest na True (a domyślnie jest) to ukrywa zaznaczenie po utracie fokusa, w przeciwnym razie tego nie robi. Ty potrzebujesz, aby kontrolka nie ukrywała zaznaczenia, więc powinieneś ustawić tę właściwość na False.

0

@furious programming: Oczywiście. Niestety tak proste że aż na to nie wpadłem. Jeszcze raz wielkie dzięki za pomoc.

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