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 30-11-2007
djmetroid djmetroid is offline
Registrado
 
Registrado: nov 2007
Posts: 4
Poder: 0
djmetroid Va por buen camino
Wink como arrastro un objeto en delphi?

hola alguien sabe como arrastro un objeto mediante eventos del raton en delphi, por ejemplo, supongamos que hice un circulo con el algoritmo de bresenham, entonces quiero arrastrarlo a una determinada parte del canvas se puede hacer eso?
ATENCION no me sirve si el codigo arrastra imagenes, nesecito que arrastre objetos
si me pueden ayudar se los agradeceria

saludos.
Responder Con Cita
  #2  
Antiguo 30-11-2007
mierda mierda is offline
Miembro
 
Registrado: may 2006
Posts: 129
Poder: 18
mierda Va por buen camino
hola, yo lo hago asi:

Con estos 3 procedures, solo te falta adaptarlos a tus necesidades.
Tienes que ponerlos en esos eventos:

Código Delphi [-]
 
//--------------------------------------------------------
// con estos 3 procedures MouseDown,MouseUp, Mousemove
// hacemos lo de mover los items de la pantalla
//-------------------------------------------------------
procedure TForm1.QrDBEan1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var i: integer; comp:string;
begin
    guardado := false;
    Screen.Cursor := crSizeAll;
    // sino teniamos seleccionado el item, se selecciona
    ComboBox1.ItemIndex := combobox1.Items.IndexOf((Sender as Tcomponent).name);
    // se pone a true una variable goblal que es la que dice que se esta moviendo
    moving:=true;
    // cogemos los ultimos valores antes de moverlo
    lastx:=x;
    lasty:=y;
    // si es un texto le cogemos el el text y lo ponemos
    comp := copy(ComboBox1.Text,0,5);
    if (comp = 'texto') then
      begin
        Tcaption.Text := (Sender as Tlabel).Caption;
        if ((Sender as Tlabel).Alignment = taLeftJustify) then Calign.ItemIndex := 0;
        if ((Sender as Tlabel).Alignment = taRightJustify) then Calign.ItemIndex := 1;
        if ((Sender as Tlabel).Alignment = tacenter) then Calign.ItemIndex := 2;
        if ((sender as tlabel).WordWrap = true) then
          Checksalto.Checked := true
          else
          Checksalto.Checked := false;
        Rxgrados.Value := ((sender) as tlabel).Tag;
      end
    else
      Tcaption.Text := '';
    if (comp = 'shape') then
      begin
        if (sender as tshape).Shape = strectangle then ComboBox2.ItemIndex := 0;
        if (sender as tshape).Shape = stcircle then ComboBox2.ItemIndex := 1;
        if (sender as tshape).Pen.Style = pssolid then ComboBox3.ItemIndex := 0;
        if (sender as tshape).Pen.Style = psdot then ComboBox3.ItemIndex := 1;
        RxSpinEdit1.Value := (sender as tshape).Pen.Width;
      end;
end;
 
procedure TForm1.QrDBEan1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var i: integer; comp: string;
begin
comp := copy(ComboBox1.Text,0,5);
  for i:=0 to (form1.ComponentCount - 1) do
      if form1.Components[i].Name = ComboBox1.Text  then
      begin
        if ((moving = true) and not (SSCtrl in Shift)) then begin
             // si es el objeto que tenemos seleccionado lo movemos en tiempo real
             (form1.Components[i] as tcontrol).left:=(form1.Components[i] as Tcontrol).left+(x-lastx);
             (form1.Components[i] as tcontrol).top:=(form1.Components[i] as Tcontrol).top+(y-lasty);
            end;
      end;
end;
procedure TForm1.QrDBEan1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var i: integer; comp: string;
begin
comp := copy(ComboBox1.Text,0,5);
  for i:=0 to (form1.ComponentCount - 1) do
      if form1.Components[i].Name = ComboBox1.Text  then
      begin
        if ((moving = true)) then
           begin
              if (SSCtrl in Shift) then
              // si es el objeto que tenemos seleccionado lo movemos en tiempo real
                begin
                  (form1.Components[i] as tcontrol).width:=(form1.Components[i] as Tcontrol).width+(x-lastx);
                  (form1.Components[i] as tcontrol).height:=(form1.Components[i] as Tcontrol).height+(y-lasty);
                end
              else
                begin
                end;
            end;
      end;
 // dejamos de apretar el boton entonces ponemos la variable a false y cambiamos el raton
 moving:=false;
 Screen.Cursor := crArrow;
end;
Responder Con Cita
  #3  
Antiguo 30-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por djmetroid Ver Mensaje
hola alguien sabe como arrastro un objeto mediante eventos del raton en delphi, por ejemplo, supongamos que hice un circulo con el algoritmo de bresenham, entonces quiero arrastrarlo a una determinada parte del canvas se puede hacer eso?
ATENCION no me sirve si el codigo arrastra imagenes, nesecito que arrastre objetos
si me pueden ayudar se los agradeceria
Explícate mejor.

¿Has hecho un circulo? ¿como? ¿usando un TImage o pintando sobre un canvas? ¿qué canvas (Form, Timage, tdbgrid)?

¿mover objetos? Perdona, un objeto (TObject) no es un control visual, es abstracto, no puede moverse con el ratón.


Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #4  
Antiguo 30-11-2007
Avatar de nightynvid
[nightynvid] nightynvid is offline
Miembro Premium
 
Registrado: may 2006
Ubicación: en algun lugar de Leon....
Posts: 111
Poder: 18
nightynvid Va por buen camino
Thumbs up

Cita:
Empezado por djmetroid Ver Mensaje
hola alguien sabe como arrastro un objeto mediante eventos del raton en delphi, por ejemplo, supongamos que hice un circulo con el algoritmo de bresenham, entonces quiero arrastrarlo a una determinada parte del canvas se puede hacer eso?
ATENCION no me sirve si el codigo arrastra imagenes, nesecito que arrastre objetos
si me pueden ayudar se los agradeceria

saludos.
creo que el problema principal esta en el planteamiento de tu problema.

para los eventos de delphi creo que el amigo del nombre innombrable te ha dado una muy buena pista.

ahora para lo que quieres hacer del circulo espero que pueda ayudarte:
al realizar el circulo mediante un algoritmo, tienes que generar una estructura que guarde algunos datos del circulo creado, tales como el centro, el diametro, etc, digase los valores que te permiten crear el circulo con el algoritmo.

una vez que tienes esos valores en una estructura, en el evento mousedown debes checar primero la posicion del raton, verificar si en esa posicion alguno de los valores del circulo y del raton se intersectan, es decir, si la coordenada del raton se encuentra dentro del area del circulo, aqui debes hacer los calculos pertinentes con los valores que guardaste en la estructura.

si la interseccion de los valores es verdadera debes comenzar el arrastre, borrando el anterior circulo y volviendolo a dibujar en la nueva posicion del raton mientras se mueve, esto es en mousemove si quieres dar la impresion de movimiento, si no, simplemente en el evento mouseup borras el anterior y vuelves a dibujar el nuevo circulo con las nuevas coordenadas.

en si ya comenzamos a plantear la logica, solo resta pasarlo al codigo, ¿fácil? no lo creo pero tampoco imposible
__________________
inutilerias.blogspot.com
Responder Con Cita
  #5  
Antiguo 04-12-2007
djmetroid djmetroid is offline
Registrado
 
Registrado: nov 2007
Posts: 4
Poder: 0
djmetroid Va por buen camino
eso es exactamente lo que quiero hacer nightynvid, pero lo dificil esta en implementar un procedure que se encargue de ver si se intersectan o no los valores del circulo y del raton, y supongamos que ya tengo ese procedure y si se intersectan , como dice lepe, un objeto es abstracto y no puede moverse, pero me imagino que se puede llamar a un procedure que hice llamado traslacion, y que obviamente traslada ese circulo dandole la coordenada respectiva, se debe meter ese procedure en el evento mousemove me imagino o estoy mal, y el evento mouse down es el que calcula la coordenada del raton inicial, y el mouse up la coordenada donde se va a trasladar el circulo, o de plano estoy perdido, y todo esta mal
por cierto, si pinte el circulo en un canvas Timage
Responder Con Cita
  #6  
Antiguo 04-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Puedes usar los 3 eventos MouseDown, MouseMouve y MouseUp, todo depende de la lógica que quieras usar. Como lo has planteado es lo normal.

Para hallar intersección, Delphi tiene:
- ptInRect Dado un cuadrado (TRect) y un punto, devuelve True si el punto está en el cuadrado
- ptInRegion, es algo más compleja de usar, pero valdría para saber si un punto está inscrito en cualquier polígono pintado a mano alzada, (quizás el método para ver si un circulo intersecta con el cuadrado). Primero debes usar CreateRgn para crear el círculo. Mira en la ayuda de delphi.

Lo que no queda claro es la lógica del programa, una forma es esta:

Uso una variable Global del form llamada IsMouseDown:Boolean, en el MouseDown del Timage la pongo a True, en el MouseUp del Timage la pongo a false. (esto me permite saber en el evento MouseMove si el usuario tiene presionado el ratón mientras mueve el ratón por el TImage).

- Mantengo pulsado el ratón en el canvas, llamo a una función llamada Intersecta que devuelve True si el punto donde he bajado el ratón interfiere con otros ya pintados:

- Si devuelve False, pinto el circulo.
- Si devuelve True, cambio el cursor del ratón al símbolo de prohibido (dando a entender al usuario que ahí no puede pintar)
En el evento MouseMove, si la variable IsMouseDown está a true, llamo a la misma rutina Intersecta (con la nueva posición del ratón)

Por último en el evento OnMouseUp verifico que el botón estaba presionado y que se puede pintar sin colisiones, en este punto dibujo el círculo y pongo la variable IsMouseDown a false.

¿te sirve?

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 04-12-2007
djmetroid djmetroid is offline
Registrado
 
Registrado: nov 2007
Posts: 4
Poder: 0
djmetroid Va por buen camino
lo voy a intentar 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 acceder a un objeto si el nombre es pasado como un string marcelinux Varios 4 08-11-2007 00:20:39
Como obtener las variables de un objeto TEO127 OOP 17 08-06-2007 12:43:05
Como crear un objeto en Delphi ? Delphiboy OOP 3 31-01-2006 20:39:15
Como guardar un objeto en un archivo ? cmurua71 OOP 7 18-11-2005 21:26:30
como ordena delphi los fields de un objeto oworty OOP 3 27-01-2005 15:47:53


La franja horaria es GMT +2. Ahora son las 06:02:04.


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