Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-06-2006
Kilik Kilik is offline
Registrado
 
Registrado: jun 2006
Posts: 2
Poder: 0
Kilik Va por buen camino
Seleccionar shapes y moverlas

Hola,estoy haciendo unos programas en delphi, del que no tengo mucha experiencia y asi he encontrado estos foros.
Me ha surgido una pequeña duda,y despues de revisar la mayoria de posts, no he encontrado una posible solución, asi que os pregunto a ver si se puede resolver.

Lo que estoy haciendo es una especie de Paint como el de windows bastante basico. De momento, he hecho para poder dibujar figuras como rectangulos,elipses, lineas y esas cosas.
La cuestion es que quiero hacer que esas figuras se puedan seleccionar y despues mover, redimensionar o borrar en tiempo de ejecucion.

Me imagino que no debe ser muy complicado de hacer, pero no se me ocurre como.

Bueno, perdon por el tocho este, y saludos.
Responder Con Cita
  #2  
Antiguo 28-06-2006
rocio84 rocio84 is offline
Miembro
 
Registrado: oct 2005
Posts: 19
Poder: 0
rocio84 Va por buen camino
Hola

para mover componentes dinamicamente debes usar los siguientes eventos:

OnMouseDown: aqui debes almacenar en dos variables (raton_x, raton_y) la posición actual del ratón, que
se pasa como parámetro en el evento y poner a cierto una variable booleana que indica cuando se debe mover.

Código Delphi [-]
mover := true;
raton_x := X
raton_Y := Y

OnMouseMove: sumar la diferencia, entre la posicion actual y la posición guardada del ratón, a las propiedades
Top y Left de la componente.

Código Delphi [-]
if mover then
begin
    with shape do 
    begin    
        top := top + (Y-raton_Y);
        left := left + (X-raton_X);
    end;
end;

OnMouseUp: poner a falso la variable mover.

Para redimiensionar seria muy parecido pero en lugar de modificar las propiedades Top y Left debes
modificar Heigth y Width.

Como los shapes los creas dinámicamente, no puedes acceder a los eventos como cuando las componentes se
crean dinamicamente, por eso, tendrás que crear tres procedimientos, uno para cada evento anterior, que
tengan los parámetros de entrada y salida igual que los de los eventos. Para ver que parametros son pue
des crear un shape de prueba y haz doble click en estos eventos y copias la cabecera.

Código Delphi [-]
procedure TForm1.IniciarMovimiento(...//parametros de OnMouseDown...);
procedure TForm1.MoverShape(...//parametros de OnMouseMove...);
procedure TForm1.FinalizarMovimiento(...//parametros de OnMouseUp...);

y en el lugar donde creas los shapes le asignas estro procedimiento al shape creado
Código Delphi [-]
...
onmousedowm := iniciarmovimiento;
onmousemove := movershape;
onmouseup   := finalizarmovimiento;
...

Para seleccionar una componente puedes usar la clase Canvas para dibujar un rectangulo alrededor del
shape ,al hacer click sobre el, para indicar de alguna manera que está seleccionado.

Espero que te haya sido útil.
Responder Con Cita
  #3  
Antiguo 29-06-2006
Kilik Kilik is offline
Registrado
 
Registrado: jun 2006
Posts: 2
Poder: 0
Kilik Va por buen camino
Muchas gracias por esa respuesta tan elaborada rocio84, creo que con eso que has puesto funcionará a la perfección.
La única duda que me queda,es a la hora de seleccionar una de las formas dibujadas para luego moverla, lo que se me ocurre es por ejemplo borrar la forma actual usando un brush de color del fondo y luego dibujarla en el lugar al que la vaya a mover.

Un saludo.
Responder Con Cita
  #4  
Antiguo 30-06-2006
turminator turminator is offline
Miembro
 
Registrado: abr 2006
Ubicación: Barcelona, Spain
Posts: 91
Poder: 19
turminator Va por buen camino
Hola, estoy siguiendo este mismo ejemplo que creo me resultará muy útil, pero me sucede ahora mismo que lo que tengo es un Timage de fondo y lo que quiero es que mediante un botón de opendialog me cargue una imagen y me la ponga encima del fondo que tengo.

Creo que solucionando este problema, podría a partir de ahí, crear tantas variables como componentes quisiera meter encima del fondo.

Como puedo solventar el problema? Llevo viendo varios ejemplos que tengo...pero ni así logré hacerlo tirar.

Muchas gracias, de veras.
Responder Con Cita
  #5  
Antiguo 08-07-2006
rocio84 rocio84 is offline
Miembro
 
Registrado: oct 2005
Posts: 19
Poder: 0
rocio84 Va por buen camino
Perdon por la tardanza de la respuesta , posiblemente ya lo hayas solucionado, de todos modos, asi es como puedes cargar la imagen de un TImage usando un openpicturedialog:
Código Delphi [-]
if OpenPictureDialog.Execute then    
Imagen.Picture.LoadFromFile(OpenPictureDialog.FileName);

Para seleccionar la imagen en lugar de usar un OpenDialog es mejor usar un OpenPictureDialog que esta especializado para imagenes.
Responder Con Cita
  #6  
Antiguo 08-07-2006
turminator turminator is offline
Miembro
 
Registrado: abr 2006
Ubicación: Barcelona, Spain
Posts: 91
Poder: 19
turminator Va por buen camino
Perfecto! Muchisimas gracias rocio84!

Lo único que me queda por dominar la aplicación seria que mediante dos edit (X, Y) se pudiera ir viendo las coordenadas de la imagen.

Como podria hacer esto?

Una vez mas,

Muchisimas gracias!
Responder Con Cita
  #7  
Antiguo 09-07-2006
rocio84 rocio84 is offline
Miembro
 
Registrado: oct 2005
Posts: 19
Poder: 0
rocio84 Va por buen camino
De nada para eso estamos y para hace eso ultimo que me pides puedes asignar las coordenadas donde se va trasladando la imagen a los edits dentro del procedimiento que usas para moverla asi:

Código Delphi [-]
edCoordenadaX.Text := imagen.Left;
edCoordenadaY.Text := imagen.Top

puede que de error porque el texto de los edits es de tipo string y los valores son enteros, si eso ocurre haz una coversion con la funcion: inttostr(int) que devuelve una cadena de caracteres.

Un saludo.
Responder Con Cita
  #8  
Antiguo 10-07-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Rocío
puede que de error...
No, no es que pueda... es fatal el error si no se hace la oportuna conversión al tipo que nos interesa, como dices, con la función "IntToStr", por ejemplo.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #9  
Antiguo 12-07-2006
dicatek dicatek is offline
Miembro
 
Registrado: jun 2006
Posts: 46
Poder: 0
dicatek Va por buen camino
Ok!

Siguiente paso solucionado!

Al final creo que está quedando algo muy digno...jejeje.

Para finalizar y dejar lel proyecto bien arreglado me gustaria saber si hay algun modo de delimitar el campo de actuación de los image, es decir, evitar que puedan salir del form. Y si hay alguna opción de al pulsar encima de las image que saliera como seleccionada y mediante las flechitas del teclado, poder mover varios pixels.

Saludos y gracias de nuevo!
Responder Con Cita
  #10  
Antiguo 13-07-2006
rocio84 rocio84 is offline
Miembro
 
Registrado: oct 2005
Posts: 19
Poder: 0
rocio84 Va por buen camino
Post

Hola:

Limitar movimiento:
Para evitar que las imagenes no se salen de los bordes, desplazalas siempre que esa condicion se cumpla, para ello puedes hacer una funcion como la sigue:

Código Delphi [-]
function posicionIncorrecta(imagenTop,imagenLeft:integer):boolean;
begin 
result := (imagenTop = 0) or (ImagenLeft=0) or //bordes superior e izquierdo
              (imagenTop+imagen.Height=form.Height) or //borde inferior
              (imagenLeft+imagen.Width = form.Width); //borde derecho
end;

de modo que dentro del procedimiento en el que desplazas las imagenes añades un if--then en el que solo muevas la imagen si no se cumple esta condicion.

Seleccionar:
Para seleccionar una imagen puedes usar la clase Canvas de delphi con la que puedes dibujar un rectangulo que simule que tienes la imagen seleccionada en el evento OnClicK de la imagen.

Mover con el teclado:
Por ultimo para mover las imagenes con el teclado puedes hacer algo similar a moverlas con el raton solo que q tienes que usar el evento OnKeyDown. En este evento compruebas si se ha pulsado las flechas del teclado y dependiendo de cual se pulse mueves en una direccion u otra. Para comprobar que se pulsan las flechas compara 'key' con:

VK_DOWN
VK_UP
VK_LEFT
VK_RIGTH

Un Saludo.

Última edición por rocio84 fecha: 13-07-2006 a las 00:53:33.
Responder Con Cita
  #11  
Antiguo 13-07-2006
alec287 alec287 is offline
Registrado
 
Registrado: jul 2006
Posts: 1
Poder: 0
alec287 Va por buen camino
Una consultita mas

Hola, mi nombre es alejandro, y estoy intentando implementar algo parecido a lo que ustedes vienen hablando. Utilice la funcion que sugirieron para controlar que los shapes no se puedan mover fuera del area del formulario (en mi caso un panel). El problema que tuve es que cuando llego a uno de los extremos, el shape no se sale del form, pero no lo puedo volver a mover mas, se queda fijo en esa posicion. Les agradeceria cualquier tipo de ayuda. Desde ya muchas gracias.

Alejandro.
Responder Con Cita
  #12  
Antiguo 13-07-2006
rocio84 rocio84 is offline
Miembro
 
Registrado: oct 2005
Posts: 19
Poder: 0
rocio84 Va por buen camino
Tienes razon, cuando llega a los bordes ya no se pueden volver a mover xq la posicion sigue siendo incorrecta. Voy a ver si puedo solucionarlo.

Un Saludo.
Responder Con Cita
  #13  
Antiguo 17-07-2006
turminator turminator is offline
Miembro
 
Registrado: abr 2006
Ubicación: Barcelona, Spain
Posts: 91
Poder: 19
turminator Va por buen camino
Bueno, para optimizar el tamaño de mi Form creo que haré un sistema mediante Chekbox que me permita sumar X valor a los Tedits, con lo que podremos ver la imagen que movemos pero en realidad estaria en una coordenada mucho más lejana.

La función que uso para marcar la posición en los TEdits es la siguiente:

Código Delphi [-]
Edit47.Text := IntToStr((Sender as TImage).Left);
Edit48.Text := IntToStr((Sender as TImage).Top);

Alguien sabe como podria hacer para que al seleccionar entre 4 CheckBox (esquina dereche,izquierda,arriba y abajo) pudiera sumar X valor al ya dado por las coordenadas?

Muchas gracias!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como seleccionar campos de una tabla sin saber cuantos van a seleccionar david duarte SQL 7 05-04-2010 21:15:43
Moviendo Shapes (CLX): flickering y Off-screen bitmaps kinobi Gráficos 15 08-08-2007 01:25:22
No puedo imprimir imagenes y shapes cesar_delphi Impresión 2 02-11-2005 02:22:50
Bucle sobre Shapes Arkaz Gráficos 1 05-01-2005 02:53:39
Array de Shapes Jozele OOP 2 18-10-2004 17:47:02


La franja horaria es GMT +2. Ahora son las 15:00:53.


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
Copyright 1996-2007 Club Delphi