PDA

Ver la Versión Completa : Transportar imágenes


bulc
24-10-2012, 13:56:48
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” (http://neftali.clubdelphi.com/?p=144)

Seleccionar Shapes visualmente (http://neftali.clubdelphi.com/?p=122)

Mover controles de un form en Runtime (http://neftali.clubdelphi.com/?p=87)

Utilizar un BMP para cambiar el cursor (http://neftali.clubdelphi.com/?p=101)

Arrastrar elementos entre dos TListBox (http://neftali.clubdelphi.com/?p=137)

Crear/destruir comp. en Runtime y moverlas con el ratón (http://neftali.clubdelphi.com/?p=121)

http://neftali.clubdelphi.com/images/imagen_ej_mover_mouse.png

Espero que te sea útil.

NOTA: empieza por el último.

bulc
25-10-2012, 20:19:59
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 (http://neftali.clubdelphi.com/?p=101)

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