Pegar item sob o ponteiro do mouse, no TreeView

Delphi

14/03/2005

Pessoal, associei um PopupMenu a um Treeview, e neste PopupMenu coloquei vária opções (Por exemplo: copiar, colar, excluir, etc).
Eu sei que se eu precisar saber qual item está sob o ponteiro do mouse, basta fazer TreeView1.GetNodeAt(X, Y) num evento qualquer relacionado ao mouse. Porém, eu não posso usar estes eventos do Treeview. Eu tenho que usar os eventos do PopupMenu, de cada um dos itens que criei nele (evento do ´Colar´, do ´Excluir´, etc).

Minha dúvida é: Como saber qual o item do Treeview que está sob o ponteiro do mouse, estando executando um evento do PopupMenu?
Exemplo de evento EXCLUIR Item:

procedure TForm1.mnExcluirClick(Sender: TObject);
Var TargetNode: TTreeNode;
begin
   // Captura o Node sob o ponteiro do mouse
   TargetNode := TreeView1.GetNodeAt(XMouse, YMouse);

   TreeView1.Items.Delete(TargetNode);
end;



Wbb

Wbb

Curtidas 0

Respostas

Rômulo Barros

Rômulo Barros

14/03/2005

[u:56f251520b][b:56f251520b]Basta vc inverter a situação:[/b:56f251520b][/u:56f251520b]

procedure TForm1.Button1Click(Sender: TObject);
Var
  Temp : TPoint;
begin
     TargetNode := TreeView1.GetNodeAt(Temp.X, Temp.Y); 
...
...
end;



GOSTEI 0
Wbb

Wbb

14/03/2005

Isso não funciona, pois os valores de X e Y fazem referência à tela e não ao componente Treeview, como deveria ser (eu já havia tentado).

Valeu.


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

14/03/2005

Use o [color=green:adb822e9df] TreeView.ScreenToClient(Point(X, Y))[/color:adb822e9df] para converter as coordenadas da tela para o TreeView.


GOSTEI 0
Wbb

Wbb

14/03/2005

Fala Marcelo!

De onde você retira os valores das variáveis X e Y? Pergunto pois atualmente já uso variáveis X e Y globais, que armazenam as coordenadas do ponteiro do mouse durante o evento OnMouseDown, para em seguida usá-las da seguinte dorma:
[b:ef73829c4d]TargetNode := TreeView1.GetNodeAt(XMouse, YMouse);[/b:ef73829c4d]

Isso é necessário, pois estou executando esta linha de código dentro de um evento de um item de PopupMenu, o que me obriga a ter as coordenadas armazenadas em variáveis globais. Porém eu gostaria de saber se tem um jeito de fazer isso de outra forma, ou seja, sem que seja preciso armazenar as coordenadas em variáveis globais.
Eu já até tentei criar uma variável do tipo TMouse e a partir dela pegar as coordenadas, mas estas são as coordenadas em relação à tela como um todo e não em relação ao TreeView, como seria necessário.

Valeu.
wbb


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

14/03/2005

var
  Point: TPoint;
begin
  Point := TreeView.ScreenToClient(Mouse.CursorPos);
  with Point do  
    TargetNode := TreeView1.GetNodeAt(X, Y);
  if Assigned(TargetNode) then
    //faz algo com o TargetNode
end;


Isso teoricamente funciona

Sobre o TMouse, não precisa criar, já existe um Mouse pronto pra uso :)


GOSTEI 0
Wbb

Wbb

14/03/2005

Esse código tem o mesmo efeito do código que eu tinha feito anteriormente, em que eu criava uma variável temporária do tipo TMouse para pegar a posição XY do ponteiro. Os valores das coordenadas fazem referência à tela e não ao TreeView. Sendo assim, quando uso a linha TargetNode := TreeView1.GetNodeAt(X, Y), é retornado um valor nulo à váriável TargetNode.

Obrigado pela atenção.



GOSTEI 0
Marcelo Saviski

Marcelo Saviski

14/03/2005

vc usou o ScreenToClient para converter as coordenadas da tela para o esuivalente dentro do TreeView :?: :?:


GOSTEI 0
Wbb

Wbb

14/03/2005

Eu usei este último exemplo que você me indicou. O resultado foi o mesmo que obtive usando a maneira que eu tinha tentado antes, ou seja, pelo fato das coordenadas virem de um referencial diferente, que não o próprio Treeview, então é retornado um ´nó´ nulo como resposta ao GetNodeAt.

De qualquer forma, tentei usar sua indicação mas não obtive sucesso, apesar da idéia inicial estar perfeita.

Valeu.


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

14/03/2005

que valores vem nas coordenadas do Point:

se vc colocar depois do:
[i:bd33606c6e][color=green:bd33606c6e]TargetNode := TreeView1.GetNodeAt(X, Y); [/color:bd33606c6e][/i:bd33606c6e]
colocar
Caption := Format(´X: ¬d, Y: ¬d´, [Point.X, Point.Y]);


que tipo de valores vem, que vão aparecer no caption do form, valores negativos, numeros exorbitantes, ou numeros normais, maiores que 0 e menores que o tamanho do TreeView?


GOSTEI 0
Wbb

Wbb

14/03/2005

Entendi sua dúvida... O valores apresentados são coerentes. Tanto X quanto Y são coordenadas de um ponto que se encontra dentro do form, porém incorreto em relação ao item do Treeview. Isso acontece porque, ao abrir a lista de menus PopupMenu e ao ser selecionado um dos itens desta lista de menus, as coordenadas passadas à variável Point são atualizadas, Assim, Point passa a ter as coordenadas de tela da posição do item selecionado no PopupMenu e não mais as coordenadas do ponto onde foi clicado no Treeview (que indicaria o item do Treeview). Ainda assim, os valores de coordenadas fazem referência ao Form e não ao Treview (claro que isso poderia ser corrigido fazendo uma pequena conta de subtração, desde que a coordenada do item no Treeview estivesse correta).

wbb


GOSTEI 0
POSTAR