Pegar item sob o ponteiro do mouse, no TreeView
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:
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
Curtidas 0
Respostas
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
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.
Valeu.
GOSTEI 0
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
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
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
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
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.
Obrigado pela atenção.
GOSTEI 0
Marcelo Saviski
14/03/2005
vc usou o ScreenToClient para converter as coordenadas da tela para o esuivalente dentro do TreeView :?: :?:
GOSTEI 0
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.
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
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
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?
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
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
wbb
GOSTEI 0