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 seleccionar multiples controles y moverlos (https://www.clubdelphi.com/foros/showthread.php?t=91513)

JoAnCa 22-02-2017 21:24:33

Como seleccionar multiples controles y moverlos
 
Hola a todos
Siguiendo con mi mapa de red, que ya esta funcionando bien, quisiera mejorarlo un poco.

Necesito ahora que se puedan seleccionar multiples TImages (nodos), ya sea presionando Ctrl o Shift, o arrastrando con el mouse un recuadro que seleccione a los que contenga en su interior, y poder mover todos los nodos seleccionados

Con este codigo, logor mover cada nodo con su etiqueta asociada, pero solo uno a la vez

Código Delphi [-]
//----- Para Seleccionar y Mover el Nodo -----
procedure TfrmPrincipal.ControlMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
begin
  CompCorX:=X;
  CompCorY:=Y;
  CompMoviendo:=True;
  TMovible(Sender).MouseCapture:=True;

  //--- Resaltar Nodo Seleccionado ---
  with shpSelect do
  begin
    Parent:=(Sender as TsImage).Parent;
    Visible:=True;
    Top:=TsImage(Sender).Top-1;
    Left:=TsImage(Sender).Left-1;
  end;
end;

procedure TfrmPrincipal.ControlMouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer );
begin
  if CompMoviendo then
  begin
    TImage(Sender).Left:=TImage(Sender).Left - (MouseDownSpot.x - x) - 24;
    TImage(Sender).Top:=TImage(Sender).Top - (MouseDownSpot.y - y) - 24;

    //--- Mover la etiqueta asociada ---
    lblDisp:=TLabel(FindComponent(TImage(Sender).Hint));
    lblDisp.Left:=TImage(Sender).Left+25 - Round(lblDisp.Width/2);
    lblDisp.Top:=TImage(Sender).Top + TImage(Sender).Height + 2;

    //--- Resaltar Nodo Seleccionado ---
    with shpSelect do
    begin
      SendToBack;
      Visible:=True;
      Top:=TsImage(Sender).Top-1;
      Left:=TsImage(Sender).Left-1;
    end;
  end;
end;

procedure TfrmPrincipal.ControlMouseUp( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
begin
  if CompMoviendo then
  begin
    CompMoviendo:=False;
    TMovible(Sender).MouseCapture:=False;
  end;

  //----- Para guardar las nuevas coordenadas en la BD -----
  if (Sender is TImage) then imgSelect:=TImage(Sender);
  NombDisp:=Copy(imgSelect.Name, 4, Length(imgSelect.Name));
  with DataMod do
  begin
    if (Sender as TsImage).Parent = sbMapaRed then
      begin
        fdtRedes.Locate('IdRed', NombDisp, []);
        fdtRedResum.Locate('IdRed', NombDisp, []);
        fdtRedes.Edit;
          fdtRedesPosX.Value:=imgSelect.Left;
          fdtRedesPosY.Value:=imgSelect.Top;
        fdtRedes.Post;
      end;
    if (Sender as TsImage).Parent = sbMapaLAN then
      begin
        fdtDisposit.Locate('IdDisp', NombDisp, []);
        fdtDispInf.Locate('IdDisp', NombDisp, []);
        fdtDisposit.Edit;
          fdtDispositPosX.Value:=imgSelect.Left;
          fdtDispositPosY.Value:=imgSelect.Top;
        fdtDisposit.Post;
      end;
  end;
end;

Como modificaria el código para lograr lo que quiero ?
O que tengo que agregar ?
:confused:

bitbow 22-02-2017 21:53:57

Existe un componente de Neftali (no estoy seguro), el codigo de ejemplo se encuentra en el ftp del foro, es para mover componentes en runtima, no se si ese te sirva.

Saludos.

JoAnCa 23-02-2017 15:52:25

Cita:

Empezado por bitbow (Mensaje 513607)
Existe un componente de Neftali (no estoy seguro), el codigo de ejemplo se encuentra en el ftp del foro, es para mover componentes en runtima, no se si ese te sirva.

Saludos.

Pues lo conozo, y lo probe, pero solo sirve para mover uno solo, no me permite la seleccion multiple

roman 23-02-2017 17:17:01

Me pafrece que lo que andas buscando son los Cindy Components, en particular el TcyResizer:

Cita:

TcyResizer: move and resize components at run-time like delphi 2009 does
LineComment Saludos

bitbow 23-02-2017 17:31:44

Tiene razon Roman, ademas que en el Pack de demo vienen dos referentes al componentes.

dec 24-02-2017 17:13:55

Hola a todos,

Cita:

Empezado por roman (Mensaje 513639)
Me pafrece que lo que andas buscando son los Cindy Components, en particular el TcyResizer:

LineComment Saludos

+1 por "TcyResizer" en alguno de mis proyectos con muy buenos resultados. Sin desmerecer los componentes de Neftalí, por supuesto. :)

roman 24-02-2017 17:22:24

La verdad es que debí acreditarte :) No recordaba cuáles eran los componentes, así que fuí a ese alguno de tus proyectos y miré la lista de componentes usados. Por cierto, que ese alguno de tus proyectos es espectacular. Digo, para quien no lo sepa :)

LineComment Saludos

dec 24-02-2017 17:27:23

Hola a todos,

Cita:

Empezado por roman (Mensaje 513671)
La verdad es que debí acreditarte :) No recordaba cuáles eran los componentes, así que fuí a ese alguno de tus proyectos y miré la lista de componentes usados. Por cierto, que ese alguno de tus proyectos es espectacular. Digo, para quien no lo sepa :)

LineComment Saludos

Hombre Román, muchas gracias. Viniendo de ti me pongo colorado y no sé qué decir. :o

P.S. El proyecto en cuestión tiene futuro, según creo,... espero seguir con él (mejorándolo) muchos años, fíjate lo que digo, pero, claro, no soy adivino. :p

JoAnCa 24-02-2017 18:54:42

Cita:

Empezado por roman (Mensaje 513639)
Me pafrece que lo que andas buscando son los Cindy Components, en particular el TcyResizer:

LineComment Saludos


Instale los Cindy Components, pero la verdad que no lo entiendo bien, en la descarga no vino con ejemplos para guiarme y saber como usar el TcyResizer

Una pregunta: Tambien me permitirá hacer selecciones multiples de TImages ?

dec 24-02-2017 19:11:54

Hola a todos,

Los ejemplos de los Cindy Components se descargan por separado aquí (mira en la carpeta "Demo"). Verás que hay al menos un par de ellos que usan el componente "cyResizer".

roman 24-02-2017 19:32:27

Tal como dice dec, los demos viene aparte. La idea básica es muy sencilla:
  1. Escoges un contenedor donde colocar los controles que desees redimensionar y/o mover. Puede ser todo el formulario o, por ejemplo, un panel.

  2. Colocas un componente cyResizer.

  3. Activas el "modo de edición" del contenedor del paso 1:

    Código Delphi [-]
    cyResizer1.Activate(Panel1);
  4. Los componentes dentro de dicho contenedor son los que podras redimensionar y/o mover.

  5. Sales del "modo de edición" con

    Código Delphi [-]
    cyResizer1.Deactivate();

LineComment Saludos

JoAnCa 24-02-2017 19:37:42

Cita:

Empezado por dec (Mensaje 513681)
Hola a todos,

Los ejemplos de los Cindy Components se descargan por separado aquí (mira en la carpeta "Demo"). Verás que hay al menos un par de ellos que usan el componente "cyResizer".

Muchas gracias, justamente ya he encontrado y descargado un pack de ejemplos.

Ya estuve viendo y probando el cyResizer, y de verdad que es justamente lo que necesito, ademas de mover una seleccion múltiple, tambien permite alinear y organizar los elementos que contiene, esta bastante bueno ^\||/:D


Y gracias a Roman tambien por la explicación, es bastante sencillo trabajar con el componente

Tema Resuelto

JoAnCa 24-02-2017 20:06:41

Pues parece que aun no he terminado :rolleyes:

Lo que ahora me falta como guardar la nueva posición, para que se carguen los nodos en ella, la proxima vez que se abra el mapa de red

En que evento sería?, o en que momento ejecutar el procedimiento de guardar las nuevas coordenadas?

dec 24-02-2017 20:40:05

Hola a todos,

Cita:

Empezado por JoAnCa (Mensaje 513684)
Pues parece que aun no he terminado :rolleyes:

Lo que ahora me falta como guardar la nueva posición, para que se carguen los nodos en ella, la proxima vez que se abra el mapa de red

En que evento sería?, o en que momento ejecutar el procedimiento de guardar las nuevas coordenadas?

Puedes hacerlo en el momento que quieras, es decir, puedes guardar la posición de los controles en el momento que necesites. Además podrás hacerlo sencillamente, usando las propiedades "Top", "Left", "Width" y "Height" de los propios controles. Se trata de recorrer la propiedad "Controls" del componente "cyResizer". La única dificultad añadida puede ser que uses controles dentro de controles, de modo que tendrías que identificar a los contenedores y recorrerlos de igual manera, recursivamente.

JoAnCa 24-02-2017 21:57:15

Cita:

Empezado por dec (Mensaje 513685)
Hola a todos,

Puedes hacerlo en el momento que quieras, es decir, puedes guardar la posición de los controles en el momento que necesites. Además podrás hacerlo sencillamente, usando las propiedades "Top", "Left", "Width" y "Height" de los propios controles. Se trata de recorrer la propiedad "Controls" del componente "cyResizer". La única dificultad añadida puede ser que uses controles dentro de controles, de modo que tendrías que identificar a los contenedores y recorrerlos de igual manera, recursivamente.

Pues me será facil, porque no uso controles dentro de controles
Ya el procedimiento de guardar la posicion lo tengo implementado,

Cita:

Se trata de recorrer la propiedad "Controls" del componente "cyResizer"
Era algo como esto lo que estaba buscando, saber localizar los controles


La franja horaria es GMT +2. Ahora son las 02:17:01.

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