Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cómo controlar donde se ha hecho doble click en un TTreeView (https://www.clubdelphi.com/foros/showthread.php?t=53468)

JM75 21-02-2008 13:10:34

Cómo controlar donde se ha hecho doble click en un TTreeView
 
Hola,
tengo un componente TTreeView llamado Arbol en el cual hay un arbol con varios nodos y éstos con subnodos.

El componente Arbol tiene en el evento OnDblClick un código que lo que hace es mostrar la pantalla asociada del subnodo sobre el que se ha hecho doble click.

Para saber cual es el subnodo sobre el que se ha hecho doble click utilizo la propiedad Selected de Arbol que me dice cual es.

El problema está en que si selecciono un subnodo y hago doble click en otro sitio del componente TTreeView que no sea un nodo o un subnodo, me muestra la pantalla asociada al nodo seleccionado.

Por ejemplo, si selecciono el subnodo Nodo1_Subnodo1 y despliego y pliego rápidamente el nodo Nodo2, se cree que he hecho un doble click y me muestra la pantalla asociada al subnodo Nodo1_Subnodo1. Lo deseable es que no me mostrara esa pantalla.

Si no me he explicado bien me lo decís.

Un saludo y muchas gracias de antemano

dec 21-02-2008 13:34:40

Hola,

Tal vez pudieras encontrar una solución, pero, a mí me parece que el diseño (siempre quise decir esto) no parece muy adecuado. Es decir, que acaso no sea buena idea utilizar el "DoubleClick" para lo que quieres hacer y te convenga buscar otro camino. Pero puedo equivocarme, claro está. Además es la primera impresión que me da, nada más. ;)

JM75 21-02-2008 13:46:34

Hola dec,
tras hacer distintas pruebas en el evento DoubleClick, creo que llevas razón. Habrá que buscar la solución por otro camino. Probaré otros métodos del método TTreeView o de otro componente a ver si doy con una solución. Cuando la tenga la pondré aquí.

Gracias.

Caro 21-02-2008 14:37:15

Hola JM75

Puedes usar la función GetHitTestInfoAt del TreeView y tu le indicas en que momento quieres que haga algo, cuando se hace click en el Label en el icono, hay varias opciones.

Ejemplo, muestra el mensaje cuando se ha hecho click sobre las etiquetas del TreeeView.

Código Delphi [-]
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if (Button = mbLeft) and (htOnLabel in TreeView1.GetHitTestInfoAt(X, Y)) then
  Showmessage('Seleccionado');
end;

existe también
htOnItem -> En un item, su texto, o su BITMAP
htOnIcon -> En un Icono
........

Revisa la ayuda esta bien explicado. Espero te sirva.

Saluditos

JM75 22-02-2008 09:06:12

Hola Caro,
gracias por tu respuesta. Voy a a utilizar tu solución con otra que he encontrado que resuelve algunos casos.

Cuando hago doble click sobre un subnodo, en el evento "DoubleClick" le he quitado la selección a dicho subnodo, por lo que si vuelvo a hacer doble click en otra parte del TTreeView ya no muestra ninguna pantalla al no haber ningún subnodo seleccionado.

El caso en que mi solución no es útil es si primero seleccionas un subnodo y después haces doble click en otro sitio del TTreeView. Como el subnodo sigue seleccionado, se muestra la pantalla asociada.

Un saludo.

JM75 22-02-2008 09:48:17

Hola,
la solución de Caro me ha solucionado el problema.

He utilizado la función "MouseDown" de Caro tal y como la ha puesto, salvo que en vez de mostrar un mensaje lo que hace es guardar en una variable booleana si se se ha pulsado sobre un label del árbol o no. Y en evento "DoubleClick" compruebo la variable boolena, y solo se ejecuta el código que ya tenía si la variable booleana es true.

Gracias por las respuestas.

keyboy 23-02-2008 01:03:26

Creo que puedes ahorrarte el paso por el evento OnMouseDown y la variable booleana:

Código Delphi [-]
procedure TForm1.TreeView1DblClick(Sender: TObject);
var
  HitTests: THitTests;
  MousePos: TPoint;

begin
  MousePos := TreeView1.ScreenToClient(Mouse.CursorPos);
  HitTests := TreeView1.GetHitTestInfoAt(MousePos.X, MousePos.Y);

  if htOnLabel in HitTests then
    ShowMessage(TreeView1.Selected.Text);
end;

Bye


La franja horaria es GMT +2. Ahora son las 14:44:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi