'Hint' dla wskazanej przez myszkÄ™ pozycji w TTreeView

dział ogólny

'Hint' dla wskazanej przez myszkÄ™ pozycji w TTreeView

Nowy postprzez mckri » wtorek, 30 wrzeÅ›nia 2008, 11:11

Witam.
Czy ktoś poradziłby jak dla wskazanej pozycji przez myszkę zrobić podpowiedź (hint). Domyslnie hint może pokazywać np. nazwę pozycji na którą się wskazuje. Jednak po złapaniu identyfikatora tej pozycji (poprzez właśnie jej nazwę) mogę już w hincie wyświetlić dane którę chcę. Tylko nie wiem jak złapać pozycję, na którą wskazuje myszka. Nie chodzi mi tutaj o pokazanie rozszerzenia nazwy pozycji, która się nie miesci w obiekcie TTreeView.
Próbowałem z poradą CB dla TListBox, jednak to się nie powiodło w przypadku Tree.

Pozdrawiam.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
PodziÄ™kowaÅ‚ : 10
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    NieznanyNieznana

Re: 'Hint' dla wskazanej przez myszkÄ™ pozycji w TTreeView

Nowy postprzez Cyfrowy Baron » wtorek, 30 wrzeÅ›nia 2008, 11:31

Przyjrzałem się temu obiektowi i mogę stwierdzić z całą pewnością, że TreeView nie posiada żadnej funkcji, która by zwracała indeks pozycji na którą wskazuje kursor myszy. Funkcja ItemAtPos jest obsługiwana tylko przez klasy TListBox, TCustomBox i TTabSet.
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: 'Hint' dla wskazanej przez myszkÄ™ pozycji w TTreeView

Nowy postprzez mckri » Å›roda, 1 października 2008, 09:52

A jednak można. Zapytałem na innym forum, gdzie podpowiedziano mi funkcję 'GetNodeAt'
Zamieszczam przykład jej wykorzystania w zdarzeniu OnMouseMove:
Kod: Zaznacz cały
TreeView1->Selected=TreeView1->GetNodeAt(X,Y); //pobiera dane węzła (typ danych TTreeNode)
int x=TreeView1->Selected->AbsoluteIndex; //pobiera numer zaznaczonego przez mysz węzła

Minusem jest to, że po najechaniu myszki jest automatycznie zaznaczany węzeł. To nie generuje zdarzenia OnClick dla tego obiektu, więc jest dla mnie wystarczające.
Cały kod generowania podpowiedzi Hint dla węzłów TreeView, jest kombinacją porady CB tworzenia podpowiedzi dla wierszy w ListBox oraz ww. przykładu.
Pozdrawiam.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
PodziÄ™kowaÅ‚ : 10
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    NieznanyNieznana

Re: 'Hint' dla wskazanej przez myszkÄ™ pozycji w TTreeView

Nowy postprzez Cyfrowy Baron » Å›roda, 1 października 2008, 10:04

Oczywiście, że tak można, to dla mnie nic nowego, ale mamy tutaj sytuację zupełnie inną niż w przypadku funkcji ItemAtPos, gdyż pobranie numeru Indeksu powoduje jednoczesne zaznaczenie pozycji na liście, nie wywołuje to zdarzenia OnClick dlatego, że zaznaczenie (Selected) nie jest równoznaczne ze zdarzeniem gdyż nie jest wywołane przez kliknięcie myszką, lecz poprzez kod, podobnie będzie z innymi obiektami.

Możesz nieco usprawnić kod, wystarczy, że po zaznaczeniu i pobraniu wartości do właściwości Hint ustawisz właściwość TreeView1->Selected = -1; w ten sposób zostanie pobrana i wyświetlona właściwość Hint tak jak oczekujesz, ale zaznaczenie zostanie usunięte a cała operacja zaznaczania i usuwania zaznaczenia nie będzie widoczna. Takie rozwiązanie jest o tyle wygodne, że jeżeli przed pobraniem Hint masz zaznaczoną jakąś pozycję na TreeView to możesz ją pobrać do zmiennej i zapamiętać, potem pobrać wartość pozycji wskazywanej przez wskaźnik zaznaczając inną pozycję, pobrać wartość do Hint i przywrócić zaznaczenie ze zmiennej która zapamiętała pierwotną wartość.
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: 'Hint' dla wskazanej przez myszkÄ™ pozycji w TTreeView

Nowy postprzez mckri » Å›roda, 1 października 2008, 10:14

To co proponujesz TreeView1->Selected = -1 nie zadziała jak rónież nie zadziała: TreeView1->Selected->Selected = -1
[BCC32 Error] Unit1.cpp(3140): E2034 Cannot convert 'int' to 'TTreeNode *'
Chyba że masz co innego na mysli.
Co do ostatniej odpowiedzi, to przecież prosiłem o jakąkolwiek pomoc przy utworzeniu hinta dla TreeView. Natomiast Ty zbiłeś mnie z tropu pisząc że jest to nie możliwe.
Pozdrawiam.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
PodziÄ™kowaÅ‚ : 10
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    NieznanyNieznana

RozwiÄ…zanie problemu.

Nowy postprzez Cyfrowy Baron » Å›roda, 1 października 2008, 11:21

Trochę nieprecyzyjnie się wyraziłem i stąd te błędy. Metoda którą zaproponowałem wyżej jest do zrealizowania, jednak pomysł z zapamiętywaniem zaznaczenia w zmiennej i przywracaniem go po pobraniu wartości elementu listy wskazywanego przez kursor ma tą wadę, że obiekt nieustanie miga, udało mi się jednak wyeliminować tą niedogodność. Zrezygnowałem przy tym z zaznaczania czegokolwiek na liście, a jest to możliwe jeżeli stworzymy sobie dla celów tymczasowych wirtualny obiekt TTreeNode i posłuży nam ona za bufor:

Kod: Zaznacz cały
  TTreeNode *Node = TreeView1->GetNodeAt(X, Y);
  int x = Node->AbsoluteIndex;


Jak widzisz nic nie jest zaznaczane, ale pobierany jest indeks elementu listy wskazywanego przez kursor. W ten sposób nie zmienia się pozycja elementu zaznaczonego, wiec nie trzeba niczego przywracać.

► Kod kompletny 
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: 'Hint' dla wskazanej przez myszkÄ™ pozycji w TTreeView

Nowy postprzez mckri » Å›roda, 1 października 2008, 17:53

Kombinowałem w podobny sposób wcześniej, nie wiem już dlaczego i tak mi zaznaczał węzły. Teraz jest ok. Dzieki.
Przy okazji, jeżeli miałbyś ciekawe porady odnośnie tego komponentu, to myslę że przydałoby się je opisać na stronie.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
PodziÄ™kowaÅ‚ : 10
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    NieznanyNieznana


  • 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 62 gości

cron