Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   como arrastro un objeto en delphi? (https://www.clubdelphi.com/foros/showthread.php?t=50865)

djmetroid 30-11-2007 02:14:46

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.

mierda 30-11-2007 09:21:29

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;

Lepe 30-11-2007 14:50:45

Cita:

Empezado por djmetroid (Mensaje 249521)
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.

nightynvid 30-11-2007 16:29:44

Cita:

Empezado por djmetroid (Mensaje 249521)
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 :p 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

djmetroid 04-12-2007 00:16:06

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

Lepe 04-12-2007 00:55:58

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

djmetroid 04-12-2007 01:04:23

lo voy a intentar gracias


La franja horaria es GMT +2. Ahora son las 19:41:33.

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