GARANTIR DESCONTO

Fórum Pegar item sob o ponteiro do mouse, no TreeView #272206

14/03/2005

0

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

Responder

Posts

14/03/2005

Rômulo Barros

[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;



Responder

Gostei + 0

14/03/2005

Wbb

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.


Responder

Gostei + 0

15/03/2005

Marcelo Saviski

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


Responder

Gostei + 0

15/03/2005

Wbb

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


Responder

Gostei + 0

15/03/2005

Marcelo Saviski

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 :)


Responder

Gostei + 0

15/03/2005

Wbb

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.



Responder

Gostei + 0

15/03/2005

Marcelo Saviski

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


Responder

Gostei + 0

15/03/2005

Wbb

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.


Responder

Gostei + 0

15/03/2005

Marcelo Saviski

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?


Responder

Gostei + 0

15/03/2005

Wbb

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar