Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Iniciando con el dragDrop Delhpi (https://www.clubdelphi.com/foros/showthread.php?t=91304)

Piter_1 27-12-2016 13:11:39

Iniciando con el dragDrop Delhpi
 
Hola chico Felices fiestas, Estoy empezando el manejo de DragDrop y dragover. tengo 6 Timage
(image1 ,image2, image3, image4, image5, image6) cada uno con su imagen de momento he conseguido lo básico . pasar una imagen a cualquiera de las otras imágenes. Pero lo que quiero conseguir es que solo pueda pasar la imag1 a imag4 , image 2 a image5 y image3 a image6 . Esto se puede hacer con el Dragdropp y dragover?
como se podría hacer????

Un saludo y gracias

Neftali [Germán.Estévez] 27-12-2016 14:15:54

Revisa los eventos relacionados con Drag&Drop.
Verás que hay un parámetro Accept, que te permite definir lo que permites arrastrar sobre un control y lo que no.

Por ejemplo:

Cita:

Empezado por Piter_1 (Mensaje 512018)
...quiero conseguir es que solo pueda pasar la imag1 a imag4

En el evento OnDragOver:

Código Delphi [-]
FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);

Tendrás que controlar que el Serder sea img4, el Source sea img1. En ese caso Accept le asignas True, en otro caso False;
Este OnDragOver lo programas sobre img4.

Piter_1 27-12-2016 17:42:35

Grande Neftali muchas gracias pero ahora tengo otro problema ,
El Tema es que estoy intentando hacer un juego, Si el usuario ha pasado la image1 a image4 entonces
la puntuación suma 1 , si no no aumanta, bien lo mas lógico para mi seria un botón con un evento onclick algo así:

var
Form1: TForm1;
puntuacion : integer;


procedure TForm1.FormCreate(Sender: TObject);
begin
puntuacion:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Image1.Picture=Image4.Picture then
inc(puntuacion);
Label2.Caption:=IntToStr(puntuacion);
end;

pero por algun motivo no incrementa puntuación . No se si es porque no compara la imagen nueva en image4 que fue arrastrado de image1 . o otra cosa pero ya estoy mareado de mirar el código y hacer pruebas

procedure TForm1.Image4DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if (Sender = image4 ) and (Source = image1) then
begin
inc(puntuacion);
Accept := true;
Label2.Caption:=IntToStr(puntuacion);
{ShowMessage('muy bien');}
end
else
accept:=false;
{ ShowMessage('muy mal');}
end;
Este ejemplo tampoco funciona por alguna razon puntuacion coge el valor de la coordenada x y
y en label2 muestra la coordenda x ,y .

y en el showmessage siempre sale muy mal.

ya habreis notado que acabo de empezar en el tema de programacion. :(

Neftali [Germán.Estévez] 27-12-2016 17:45:59

Antes de nada recomendarte que revises la Guía de estilo de los foros.
Por favor, cuando escribas código, utiliza TAG's para mejorar la lectura.

En el código anterior ya te las he añadido yo (los TAG's).

Neftali [Germán.Estévez] 27-12-2016 17:50:27

Cita:

Empezado por Piter_1 (Mensaje 512033)
la puntuación suma 1 , si no no aumanta, bien lo mas lógico para mi seria un botón con un evento onclick algo así:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Image1.Picture=Image5.Picture then
    inc(puntuacion);
  Label2.Caption:=IntToStr(puntuacion);
end;

Si ejecutas paso a paso ese código, imagino que no está pasando por el Inc.
Debes entender lo que has colocado, para saber porqué.

Código Delphi [-]
  if Image1.Picture=Image5.Picture then

Con esta comparación está comparando 2 direcciones a memoria, pero no 2 imágenes para saber si son iguales.
Si te explicas iun poco más tal vez podamos ayudarte.

Lo lógico en este caso (si es lo que yo me imagino) es que guardes una estructura en memoria (array bidimensional) con lo que se incluye en cada casilla y compares esos valores, en lugar de las imágenes.

Piter_1 27-12-2016 18:22:07

como no he podido editar por una restriccion de 25 minutos en la edicion de mis mensjes lo pongo aqui.
mi objetivo es que si el usuario no arrastra por ejempl image1 a image4 que o bien :
no suma puntos o ,image1.visible :=false asi quedaria fuera de juego image1 o image1.enable:=true.
pero no me funciona ninguno como yo quiera

Esto esta fuera de mi alcance :( :
es que guardes una estructura en memoria (array bidimensional) con lo que se incluye en cada casilla y compares esos valores, en lugar de las imágenes.

Código Delphi [-]
procedure TForm1.Image4DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if (Sender = image4 ) and (Source = image1) then
begin
inc(puntuacion);Coge los valores de x y  , muestra coordenada en label2 como puntuacion
Accept := true;
Label2.Caption:=IntToStr(puntuacion);
{ShowMessage('muy bien');}
end
else
accept:=false;
{ ShowMessage('muy mal');}   SIEMPRE PASA POR AQUI 
{image1.visble:=false ;} SIEMPRE SE CUMPLE ESTA CONDICION
{image1.enable:=false;}NO HACE NADA

end;

Neftali [Germán.Estévez] 27-12-2016 18:56:21

Tal vez deberías colocar un proyecto de ejemplo (ZIP) para ver qué es lo que estás intentando hacer.
Aunque sea un ejemplo reducido.

Piter_1 29-12-2016 01:34:24

Gracias neftali al final opté por plan b no era lo que que tenia en mente pero me ha sacado del apuro gracias por todo


La franja horaria es GMT +2. Ahora son las 22:27:44.

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