popup w TreeView wywolany prawym klawiszem myszy

0

Czesc.
Oto problem, z którym nie mogę sobie poradzić.
Mam na formie komponent TreeView(Drzewo). Do tego Popup(DrzewoPopup). Teraz chcę aby po naciśnięciu prawym klawiszem myszy na jakiś element drzewka, wyświetliło mi się menu popup.
Mam taki kod:

procedure TMainFrm.DrzewoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
P : TPoint;
begin
if (button=mbright)and(Drzewo.Items.Count>1)  then begin
GetCursorPos(P);
DrzewoPopUp.Popup(P.X,P.Y);
end;
end;

Czyli jeśli elementów więcej niż jeden wyświetla popup po naciśnięciu prawym klawiszem myszki na treeview. Ale tutaj problem!
Popup wyskakuje gdy naciskam prawym klawiszem w dowolnym miejscu TreeView! A ja chcę, żeby popup wyskoczył tylko i wyłącznie gdy nacisnę prawy klawisz myszy, ale nad danym itemem.

Drugi problem to samo zaznaczanie itema przy klikaniu prawym klawiszem myszki. Gdy zaznaczę item prawym klawiszem jest on zaznaczany, ale gdy puszczam prawy klawisz, zaznaczenie itema wraca na inny item(wydaje się ze przypadkowy), a ma zostac na tym klikniętym!
Przeszukałem całe 4p, neta i nic.
Liczę na waszą pomoc.
Pozdr.//Pepe

Ps: W necie znalazlem prawdopodobnie rozwiązanie, tylko nie wiem jak to zastosować.
http://www.toflidium.com/weblog/codearticles/tvright.html
Jeśli ktoś to przerabiał, powiedz co z tym.

0

Poszukaj czegoś w rodzaju ItemAtPos(), co zwraca item, nad którym jest myszka (w listboxie, ale sądzę, że tu też będzie coś takiego). Potem tylko sprawdzasz, czy funkcja zwróciła coś innego, niż -1, jeśli taj, to wywołujesz menu. I jeszcze taka drobna uwaga, współrzędne przy wywoływaniu menu odnoszą się do całego ekranu, trzeba więc dodać do niech left i top formy.

0

hmm.. z tego co czytałem w ComCtrls musiałbyć zrobić coś odwrotnego do HitTest...

jak masz wersję delphi lepszą niż personal to obceń wszystko powiązane z GetNodeAt...

0

jak masz wersję delphi lepszą niż personal to obceń wszystko powiązane z GetNodeAt...

Rzeczywiście. Udało mi się. Dzięki GetNodeAt(x,y) i Delphi help :)
Dla potomnych, oto kod:

procedure TMainFrm.DrzewoMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
P : TPoint;
begin
GetCursorPos(P);
if (button=mbright)and(Drzewo.Items.Count>1)and(drzewo.GetNodeAt(X,Y)<>nil) then begin
DrzewoPopUp.Popup(P.X,P.Y);
end;
end;

Ale nadal nie wiem jak zapobiec temu, że przy zaznaczaniu dowolnego itema na drzewku prawym klawiszem, zaznaczenie ucieka na inny item po puszczeniu klawisza myszy. Próbował ktoś to zlikwidować?

0

Może po wywołaniu menu, zaznaczaj element, który jest na pozycji myszki (czyli ten, który zwraca nodeatpos)?

0

zacytuje swoje słowa:

Ale nadal nie wiem jak zapobiec temu, że przy zaznaczaniu dowolnego itema na drzewku prawym klawiszem, zaznaczenie ucieka na inny item po puszczeniu klawisza myszy. Próbował ktoś to zlikwidować?

Więc udalo mi się i to pokonać. Poniższy kod pozwala na zaznaczenie prawym klawiszem myszy itema, na stałe. Wtedy można sobie wywołać popupa, jak napisane jest w powyższych postach.

procedure TMainFrm.DrzewoContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
var
  tmpNode: TTreeNode;
begin
  tmpNode := (Sender as TTreeView).GetNodeAt(MousePos.X, MousePos.Y);
  if tmpNode <> nil then
    TTreeView(Sender).Selected := tmpNode;
end;

proste i działa.
Pozdr.//dzięki za wskazówki

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