Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Transportar imágenes (https://www.clubdelphi.com/foros/showthread.php?t=81230)

bulc 24-10-2012 13:56:48

Transportar imágenes
 
Me gustaría que alguien pusiera un ejemplo de arrastre de imágenes u otro objeto llevándolo con el ratón. Yo sólo consigo simular un arrastre mediante cambio de cursor, seguido de quitar y poner una imagen.
Funciona pero queda poco realista.
Primero hago coloco en OnDragOver un Accept, y luego al hacer onDownMouse, Button=mbLeft, quito el TLabel. Luego onDropDrag del objeto destino hago visible de nuevo el objeto. Pero el ratón no "coge" el
objeto Source, sólo cambia de cursor.
Me imagino que alguien me podría dar una pista. Es para un programa infantil de colocar letras. Las letras podrían ser TImage, TStaticText o TLabel.
Si este tema se ha tratado, no lo he podido encontrar.
Gracias.

Neftali [Germán.Estévez] 24-10-2012 14:26:27

En mi web tienes varios ejemplos relacionados con el tema, aunque no acabo de entender lo que dices, de que "Funciona, pero queda poco realista"... :confused:

Ejemplo de tratamiento de “Planos y figuras”

Seleccionar Shapes visualmente

Mover controles de un form en Runtime

Utilizar un BMP para cambiar el cursor

Arrastrar elementos entre dos TListBox

Crear/destruir comp. en Runtime y moverlas con el ratón



Espero que te sea útil.

NOTA: empieza por el último.

bulc 25-10-2012 20:19:59

Explanation
 
Se trata de poner letras bajo un animal, por ej. GATO. Verás, cuando un nano de tres años (q seguro q aún no sabe leer) coge la letra G, la letra desaparece y se convierte en un papel chiquitito que se lo lleva el cursor del ratón. Pero el enano piensa "Qué raro, la letra se ha hecho pequeñísima". Luego al poner el papelito en el cuadro destino vuelve a aparecer la letra agrandada. No sé si ahora está más claro.
Lo que quiero es llevar la letra real, aunque luego al depositarla se haga mayor, o de otro color, pero que el cursor arrastre una letra, no un papelito colgando de la flecha...
Estudio tu código y lo pruebo. Ya casi lo tenía, pero me volvía loco el comportamiento aparentemente errático de la dichosa letra escapista.

Neftali [Germán.Estévez] 26-10-2012 08:55:16

Entonces creo que el que necesitas es este: Utilizar un BMP para cambiar el cursor

En tu caso debes "montar" el BMP con la letra que necesitas arrastrar y utilizarlo como cursor o directamente arrastrar el LABEL con la letra.

Tal vez no te estoy entendiendo. Tú debes tenerlo claro porque sabes de lo que hablas, pero piensa que nosotros, si no nos das información, no lo sam¡bemos y sólo hacemos que imaginar cosas... :(

bulc 26-10-2012 14:05:07

ProbandoProbando
 
Llamaremos "mover" letra a nuestro propósito, para no confundirlo con el Dragging=Arrastrar. Al principio colisionaba con el Drag. El BeginDrag(True), hacia saltar el cursor de la notita, y se movía de modo raro, así que lo hice únicamente controlando el "mover" con (MouseDown, MouseMove, MouseUp) siguiendo tus instrucciones y va casi perfecto.... hasta que el TLabel pasa por encima de un Dibujo. Entonces la letra (TLabel) se vuelve borrosa y parpadea en exceso, llegando casi a perderse. Si el dibujo-base se hace 'Transparent:=True' mejora un poco, pero no de modo satisfactorio.
Ahora probaré con el BitMap o con un TImage. A ver q pasa esta vez.

bulc 26-10-2012 18:21:52

Eureka
 
Pues añadiendo " (Sender as TLabel).BringToFront" el Label pasa por encima de los componentes visuales. Ahora ando intentando que al posarse en su destino tenga derecho exclusivo en su casilla, frente a otras letras. De manera que una letra no pueda "posarse" donde ya hay otra correcta.
Me gustaría saber para que sirven los eventos Dock y Shift. Sé lo que significan pero no encuentro pistas. Supongo que el Dock será para "aparcar" un objeto que se mueve, ¿pero y el Shift ese?
He entendido que MouseDown acaba en su MouseUp correspondiente del mismo objeto. Con eso me conformo. Gracias.

Neftali [Germán.Estévez] 26-10-2012 19:17:46

Se agradecen las explicaciones.

bulc 27-10-2012 13:58:14

Se trata de llevar varias letras TLabel para formar una palabra.
El caso es q muevo perfectamente el TLabel, pero pierdo la funcionalidad (Sender, Source) del Mouse por lo que si hay dos letras o más iguales, no se puede dilucidar qué letra se ha movido. Si uso a la vez las dos efectos (Drag + movimientos) se optienen movimientos "locos" del TLabel.

bulc 29-10-2012 11:10:10

Cita:

Empezado por bulc (Mensaje 448118)
Se trata de llevar varias letras TLabel para formar una palabra.
El caso es q muevo perfectamente el TLabel, pero pierdo la funcionalidad (Sender, Source) del Mouse por lo que si hay dos letras o más iguales, no se puede dilucidar qué letra se ha movido. Si uso a la vez las dos efectos (Drag + movimientos) se optienen movimientos "locos" del TLabel.

Los eventos antagonistas tienen prioridad, de manera que al entrar en la Imagen, salta el MouseUp del Sender (TLabel) y pierdo la referencia tan cómoda que facilitan los eventos del Drag (Sender y Source)
¿Cómo puedo hacer para que el objeto Imagen dispare un evento que me indique el Source y el Sender? o lo que es lo mismo; si se mueven las letras TLabel encima de los TImage, ¿cómo puedo discriminar las letrs en el caso de estar repetidas? ¿Se entiende? Espero que sí y que alguien pueda aportar su opinión. Eso espero.... y gracias.

bulc 29-10-2012 13:08:23

Cita:

Empezado por bulc (Mensaje 448216)
Los eventos antagonistas tienen prioridad, de manera que al entrar en la Imagen, salta el MouseUp del Sender (TLabel) y pierdo la referencia tan cómoda que facilitan los eventos del Drag (Sender y Source)
¿Cómo puedo hacer para que el objeto Imagen dispare un evento que me indique el Source y el Sender? o lo que es lo mismo; si se mueven las letras TLabel encima de los TImage, ¿cómo puedo discriminar las letrs en el caso de estar repetidas? ¿Se entiende? Espero que sí y que alguien pueda aportar su opinión. Eso espero.... y gracias.

Añadido: Lo q quiero es, q en vez de arrastrar (y aparezca el Cursor "portanota"), se pueda mover el TLabel pegado al ratón y que al soltarlo sobre un TImage1 (Tapa) , desaparezca el TLabel y aparezca otra imagen que estaba debajo de la "Tapa". Lo puedo hacer si hago Drag and Drop, pero me gustaría poder hacerlo llevando la letra de TLabel durante todo el recorrido. Lo hago pero al soltar la letra (TLabel), la imagen no discrimina qué letra viene (Me refiero a que haya dos letras iguales).


La franja horaria es GMT +2. Ahora son las 14:38:02.

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