Páginas (2): 1 2   
Shordi   30-04-2021, 20:26
#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.

No podemos regresar
tincho   30-04-2021, 21:55
#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:
Código:
Public Sub TreeView1_Select()
  Print TreeView1.Current.Key
End
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
[code]

Postdata, me da una gran alegría tener noticias tuyas.
Un saludo.
Última modificación: 30-04-2021, 21:59 por tincho.

1 Saludo.
gambafeliz   01-05-2021, 10:16
#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.
jguardon   01-05-2021, 13:51
#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'
Shordi   01-05-2021, 21:27
#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: 5)

No podemos regresar
gambafeliz   01-05-2021, 21:32
#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.
Última modificación: 01-05-2021, 21:37 por gambafeliz.
tincho   01-05-2021, 21:38
#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.
Última modificación: 01-05-2021, 22:37 por tincho.

1 Saludo.
tincho   01-05-2021, 22:46
#8
Esta es mi propuesta para el punto 1:
Código:
Public Sub DirView1_Drop()

    Dim s As Variant
    
    s = Drag.Paste()
    
    Message("Copiar \n'" & s & "'\n to '" & DirView1.Current & "'" & "\nPero esta vez usando DirView1.Current")
    
    Catch

    Message.Error("No se pudo completar la operación de Drag & Drop.")
End

Esta es mi propuesta para el punto 1 + 2:
Código:
Public Sub DirView1_Drop()

    Dim s As Variant

    DirView1[DirView1.Current].Expanded = True

    s = Drag.Paste()

    Message("Copiar \n'" & s & "'\n to '" & DirView1.Current & "'" & "\nPero esta vez usando DirView1.Current")

Catch

    Message.Error("No se pudo completar la operación de Drag & Drop.")

End
Última modificación: 01-05-2021, 22:58 por tincho.

1 Saludo.
Shordi   02-05-2021, 09:59
#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:
Código:
....   
    Message("Copiar \n'" & s & "'\n to '" & DirView1.Current & "'" & "\nPero esta vez usando DirView1.Current")
'[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
    ....

Esta es mi propuesta para el punto 1 + 2:
Código:
Public Sub DirView1_Drop()

    Dim s As Variant

    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]

    s = Drag.Paste()

    Message("Copiar \n'" & s & "'\n to '" & DirView1.Current & "'" & "\nPero esta vez usando DirView1.Current")

Catch

    Message.Error("No se pudo completar la operación de Drag & Drop.")

End

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 .
Última modificación: 02-05-2021, 10:03 por Shordi.

No podemos regresar
Shordi   02-05-2021, 11:49
#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: 5)

No podemos regresar
Páginas (2): 1 2   
  
Usuarios navegando en este tema: 7 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.