Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Saludos desde el retiro y una solicitud
#1

Buenas,
Salgo de mi voluntario retiro, al que me lancé con la promesa de no volver a codificar nada de nada, pero nada, oiga, en lo que me quede de vida para hacer una petición, como ese pariente lejano que te aparece cuando te toca la lotería pidiendo dinero.
Me ha gustado mucho ver cómo el foro sigue vivo, activo y aportando cosas a éste mundo tan específico y selecto en que nos movemos.

Primero un poco de historia para poneros al día:
Los útlimos 4 meses de mi vida laboral no trabajé en absoluto. Los padawanes me declararon "estorbo oficial" al grito de "tú no te estreses, tranquilízate y vete a casa, que ya te llamamos si tenemos algún problema." Era mediados de septiembre del 19 y, naturalmente, no me llamaron nunca. Dediqué aquellos meses en el limbo para rehacer mi proyecto eterno e inacabado: el ínclito "Soprano" (Sólo Otro Programa de Recursos y Ayuda al NOvelita). Me quedó muy bien. Textos, configuraciones, escaletas, estadísticas, esquemas, resúmenes, personajes, demiurgia, etc. etc. Toda la panoplia de opciones que suponía que iba a necesitar en mi próxima aventura de Jubileta Escritor.

Llegó 2020 y con él la puta pandemia que mató (y mata) tantas personas y cosas, empezando por los planes y proyectos de toda la humanidad. Mis planes se fueron al diablo y no he vuelto a retomar el tema de volver a escribir (quitando un pequeño librito de poemas sobre la experiencia de ser Abuelo que publiqué en febrero) hasta hace unas semanas.

He estado escribiendo y, ¡cómo no!, el Soprano que con tanto trabajo y cariño me costó terminar después de tantos años... no me gusta.

"Pelos de loco, loco entero" dice el refrán (por no mencionar aquél más chabacano de "Puta una vez, puta para siempre") sigo siendo programador, viejo, caduco y pasado de moda, pero programador, y me puse pues a hacer otro soprano con menos opciones, menos complicaciones y más adaptado a la manera que yo escribo en realidad, no a la manera que me imaginaba que iba a escribir, no sé si me explico.

El resultado ha sido un programa mucho más simple y cuyo manejo me está gustando mucho.
De 45 clases he pasado a 14;
de 34 formularios a 13;
de 591 funciones a 195
y de 10.560 líneas de código a 3.957.
He suprimido todas las bases de datos y todos los controles personalizados asociados a las mismas. Ahora sólo utilizo controles estándar y el manejo se basa directamente en carpetas y archivos y algún que otro fichero .conf de la clase Settings.

Todo de maravilla hasta que he encontrado una barrera tonta que no soy capaz de superar (Ahora es cuando el primo lejano te pega el sablazo):
Tengo un Dirview sobre el que quiero hacer un drag & drop desde un gridview que contiene una lista de archivos (es decir pincho en el gridview, arrastro al dirview y el archivo en cuestión se copia sobre el item del Dirview donde esté situado el ratón).
Problema 1: no encuentro la manera de averiguar el Directorio (es decir la clave del treeview ) sobre el que sitúo el ratón.
Problema 2: no encuentro la manera de hacer que se expandan los directorios al mover el ratón sobre ellos en la operación de Drag & drop.
De momento lo he suplido con las viejas acciones de copiar y pegar... pero me da mucha rabia no ser capaz de hacer estas operaciones tan simples y comunes de manera gráfica.
¿Alguien me puede echar una mano?

Saludos y perdón por el ladrillo.
    ¡Gracias!
#2

(30-04-2021, 20:26)Shordi escribió:  Problema 1: no encuentro la manera de averiguar el Directorio (es decir la clave del treeview ) sobre el que sitúo el ratón.

Para saber la clave de lo que esta seleccionado en el treeview puedes usar esto:
GAMBAS
  1. Public Sub TreeView1_Select()
  2.   Print TreeView1.Current.Key


Esto te da el texto de la clave (no el que se ve el treeview, ojo)
Siempre recomiendo usar _Select en vez de _Click porque permite la navegacion del treeview con el teclado.

(30-04-2021, 20:26)Shordi escribió:  Problema 2: no encuentro la manera de hacer que se expandan los directorios al mover el ratón sobre ellos en la operación de Drag & drop.

No se como es ese control, no lo use nunca creo, pero si es como un treeview podes hacer que cada vez que selecciones un ítem que es un directorio se expandan los ítems que penden de este con la siguiente instrucción
GAMBAS
  1. TreeView2["LaClave"].Expanded = True



Postdata, me da una gran alegría tener noticias tuyas.
Un saludo.
    ¡Gracias!
#3

Oye joven de verdad, cuanto me alegra poder hablar contigo.

Veo que estas bien, me alegra. Mira tu problema ni lo he mirado, te prometo que lo miro. Para mi lo principal es saludarte y agradecer tanto bueno has hecho en los foros de Gambas.

En fin, espero que nos hablemos por aquí mas, pero comprendo que cuanto mas sabemos de Gambas, menos nos necesitaremos.

Saludos.
    ¡Gracias!
#4

Un saludo afectuoso, shordi. Me alegra volver a tenerte por aquí, aunque sea esporádicamente y sobre todo que todos sigamos con buena salud.

Un abrazo!

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
    ¡Gracias!
#5

Muchas gracias a todos Big Grin Big Grin Big Grin
Debo reconocer que estos días estoy disfrutando como un enano con esto de volver a codificar. No lo puedo evitar: me encanta. Me acuesto pensando en lo que he dejado a medias y por las mañanas, al encender el ordenador con una taza de café en la mano, siento una gozosa anticipación que pocas cosas ya me generan.
Respecto a mi problema, creo que lo he resuelto. A raíz de la respuesta de Tincho decidí ilustrar el problema a un proyecto sencillito y, como tantas veces pasa, al aislarlo encontré la solución a mis dos problemas:

1.- Averiguar qué elemento del Dirview se encuentra debajo del ratón (sin hacer click en él, claro).
La solución está en el método FindAt (x,y) que tiene el Treeview subyacente al Dirview
Es decir:
La clase Dirview ofrece como Proxy un Treeview en el que se basa.
Este Treeview dispone del método FindAt(x,y) que ubica el cursor interno del treeview en la posición x e y indicadas. Como la clase Drag ofrece Drag.x y Drag.y , pues solucionado

2.- Conseguir que la carpeta apuntada durante la operación de Drag&drop se despliegue sola:
Eso se consigue de manera muy fácil con el método .Expanded de la propiedad .item del treeview.
El problema es que si expandimos el item inmediatamente después de ejecutar FindAt, las carpetas se despliegan según el ratón pasa sobre ellas y es imposible encontrar nada a poco que tengas en tu disco carpetas con muchas subcarpetas. Lo he solucionado con timer.

La solución no es perfecta, por algún que otro detalle relativo a la clase Drag que no llego a comprender (en el código he dejado unas líneas comentadas con uno de esos detalles, para que lo veáis), pero es suficiente para lo que necesito.

Adjunto un pequeño proyecto que ilustra todo este ladrillo con un ejemplo mucho más simple de entender.

Saludos


Archivos adjuntos
.gz dragdrop-0.0.1.tar.gz Tamaño: 12.85 KB  Descargas: 4
    ¡Gracias!
#6

Yo estoy totalmente de acuerdo con tincho con respecto a Expander pero no consigo como detectar el item que recibe el Drop()

Esto debería hacerse así pero yo no se resolverlo por el momento.

1. Cuando hacemos el Drop() en el TreeView1 debemos de obtener "Key" del padre que recibe el Drop() pero ¿como? yo no lo se por el momento.
2. Y después dentro del Drop() haríamos el TreeView1["Key"].Expanded = True
3. Por último haríamos un insert dentro de los items

Para resumir tincho esta cerca y lo comprende pero en mi caso gracias a el he podido acercarme pero mi gran escollo esta en obtener el "Key" para poder poner Expanded a True ya que por el momento solo obtengo el "Key" del último elemento añadido con Add.

Lo siento Shordi pero me temo que no lo voy a obtener de forma cercana. Es algo complicado para mi.

================ Nota ==============

Pues menos mal que has dado con una solución por que yo me estaba haciendo cakita por el lio que me he metido para resolver tu caso Smile hasta sudor frio me ha dado. Vaya tela.
    ¡Gracias!
#7

(01-05-2021, 21:27)Shordi escribió:  Adjunto un pequeño proyecto que ilustra todo este ladrillo con un ejemplo mucho más simple de entender.

ok, me lo descargue, lo voy a estudiarlo.
Saludos.

(01-05-2021, 21:27)Shordi escribió:  Adjunto un pequeño proyecto que ilustra todo este ladrillo con un ejemplo mucho más simple de entender.
Shordi: FileView1 tiene la propiedad .Dir asignada a tu usuario home/user/jorge.... pero eso hace que en otros PC de error, salvo que tambien te llames Jorge  Smile
Saludos.
    ¡Gracias!
#8

Esta es mi propuesta para el punto 1:
GAMBAS
  1. Public Sub DirView1_Drop()
  2.  
  3.     Dim s As Variant
  4.     
  5.     s = Drag.Paste()
  6.     
  7.     Message("Copiar \n'" & s & "'\n to '" & DirView1.Current & "'" & "\nPero esta vez usando DirView1.Current")
  8.     
  9.     Catch
  10.  
  11.     Message.Error("No se pudo completar la operación de Drag & Drop.")



Esta es mi propuesta para el punto 1 + 2:
GAMBAS
  1. Public Sub DirView1_Drop()
  2.  
  3.     Dim s As Variant
  4.  
  5.     DirView1[DirView1.Current].Expanded = True
  6.  
  7.     s = Drag.Paste()
  8.  
  9.     Message("Copiar \n'" & s & "'\n to '" & DirView1.Current & "'" & "\nPero esta vez usando DirView1.Current")
  10.  
  11.  
  12.     Message.Error("No se pudo completar la operación de Drag & Drop.")
  13.  


    ¡Gracias!
#9

Gracias a los dos. Es un placer ver que el foro sigue vivo, de verdad.
Respecto a tus apuntes:
(01-05-2021, 22:46)tincho escribió:  Esta es mi propuesta para el punto 1:
GAMBAS
  1. ....   
  2.     Message("Copiar \n'" & s & "'\n to '" & DirView1.Current & "'" & "\nPero esta vez usando DirView1.Current")
  3. '[color=#27ae60]' Es lo mismo, efectivamente, lo que pasa es que se me ocurrió que el Dirview.current era un sinónimo del treeview.key y se ahorraba unos milisegundos... o no. [/color] :D :D
  4.     ....



Esta es mi propuesta para el punto 1 + 2:
GAMBAS
  1. Public Sub DirView1_Drop()
  2.  
  3.     Dim s As Variant
  4.  
  5.     DirView1[DirView1.Current].Expanded = True ' [color=#16a085]Aquí me genera un error diciendo que "[/color][color=#e74c3c]Not an array fMain.DirView1_Drop.39" [/color][color=#16a085]Por otro lado no lo entiendo. La expansión de la rama sobre la que está el ratón ha de hacerse antes del drop, a criterio del usuario. En el momento de hacer el drop, es decir, cuando ya has levantado el botón izquierdo, no parece tener sentido expandir la rama sobre la que estés ubicado... o algo se me escapa, (oxidado estoy, oiga).[/color]
  6.  
  7.     s = Drag.Paste()
  8.  
  9.     Message("Copiar \n'" & s & "'\n to '" & DirView1.Current & "'" & "\nPero esta vez usando DirView1.Current")
  10.  
  11.  
  12.     Message.Error("No se pudo completar la operación de Drag & Drop.")
  13.  


Saludos

Observo que los maravillosos colorines con los que he remarcado mis comentarios al código no son admitidos... una pena, oiga.

A no, es que el cuadro ya va formateando según la sintaxis de gambas. Poniendo la comilla de comentario sí aparece el verde... aunque no el rojo Big Grin Big Grin .
    ¡Gracias!
#10

Al implementar ese código en mi programa han salido a la luz algunos pequeños fallos a la hora de hacer los refrescos de las listas y demás. He remirado el comportamiento de la clase drag y creo que ahora funciona perfecto... salvo un par de carencias que ahora os cuento. Adjunto versión 2.

Sería interesante poder distinguir si estamos copiando o moviendo según se pulse la tecla Control, pero la clase Drag "acapara" los eventos de ratón y teclado mientras está en marcha y no he podido ver la manera de hacerlo. Por otra parte la tecla Control interfiere en la manera de selección de las listas. Si eso se pudiese conseguir después sería interesante camibar el icono según se pulsase, o no, la tecla Control, tal como hacen los manejadores de archivos. Se supone que añadiendo una imagen a la propiedad Drag.icon, es suficiente, pero no he conseguido que me funcione a entera satisfacción. La imagen parpadeaba y una vez establecida no había quién la quitase.

Por último creo que sería muy sencillo acoplar todo esto para hacer una control extendiendo el comportamiento de Dirview... pero yo no estoy ya para hacer controles que nunca más voy a volver a usar... Dodgy

Saludos


Archivos adjuntos
.gz dragdrop-0.0.2.tar.gz Tamaño: 12.9 KB  Descargas: 4
    ¡Gracias!


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)