Ver Mensaje Individual
  #1  
Antiguo 22-02-2017
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Reputación: 19
JoAnCa Va por buen camino
Cool 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 ?
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes
Responder Con Cita