Hola a todos
Pues estoy diseñando un soft de monitoreo de red, que incluye un mapa de red (usando TImages), que ya esta funcionando bien, pero 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
//----- 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 ?
Editado por JoAnCa, 22 febrero 2017 - 02:40 .