Ver Mensaje Individual
  #5  
Antiguo 09-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
Pues esto es lo que yo tengo hasta ahora, pero la seleccion no me funciona bien, y lo de guardar las posiciones lo resolvere con el TSaveComps

Código Delphi [-]
//----- Crear el Control -----
procedure TfrmPrincipal.CrearNodo(Sender: TObject);
begin
  Randomize;
  //--- Crear el TsImage ---
  imgDisp:=TsImage.Create(tshMapaRed);
  with imgDisp do
  begin
    Parent:=tshMapaRed;
    Top:=80;
    Left:=140;
    AutoSize:=True;
    Images:=imgListDisp;
    if TipoMapa = 'Redes' then ImageIndex:=1
    else ImageIndex:=DataMod.fdtDispositIDTIPODISP.Value;

    OnMouseDown:=ControlMouseDown;
    OnMouseMove:=ControlMouseMove;
    OnMouseUp:=ControlMouseUp;
    OnClick:=ControlClick;

    //--- Crear y asociar la etiqueta ---
    lblDisp:=CrearLabelAsociada(imgDisp, TitDisp);
    imgDisp.Hint:=lblDisp.Name;
  end;
end;

La etiqueta la creo de esta forma:
Código Delphi [-]
function TfrmPrincipal.CrearLabelAsociada(AImage: TImage; Titulo: string):TLabel;
var
  lbl :TLabel;

begin
  lbl:=TLabel.Create(Self);
  with lbl do
  begin
    Name:='lblRed'+IntToStr(DataMod.fdtRedesIdRed.Value);
    Parent:=AImage.Parent;
    Left:=AImage.Left;
    Top:=AImage.Top + AImage.Height + 2;
    Caption:=Titulo;
    Alignment:=taCenter;
  end;
  Result:=lbl;
end;

Para moverlo, lo hago con estos procedimientos
Código Delphi [-]
procedure TfrmPrincipal.ControlMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
begin
  CompCorX:=X;
  CompCorY:=Y;
  CompMoviendo:=True;
  TMovible(Sender).MouseCapture:=True;
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 ;
    lblDisp.Top:=TImage(Sender).Top ;
    lblDisp.Top:=TImage(Sender).Top + TImage(Sender).Height + 2;
  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;

  if (Sender is TImage) then imgSelect:=TImage(Sender);
end;

Lo elimino asi
Código Delphi [-]
//----- Eliminar el Nodo -----
procedure TfrmPrincipal.btn2Click(Sender: TObject);
 var
  i :Integer;

begin
  if Assigned (imgSelect) then
  begin
    // Borrar el TLabel asoaciado
    for i:=ComponentCount - 1 downto 0 do
    begin
      if Components[i] is TLabel then
        if Components[i].Name = imgSelect.hint then
        begin
          Components[i].Free;
          Break;
        end;
    end;
    FreeAndNil(imgSelect);
  end;
end;

Y para seleccionarlo parece que algo me falta o no es el metodo adecuado, lo que intento es ponerle un TShape transparente para que quede alrededor del control, pero no funciona del todo bien.
Código Delphi [-]
//----- Resaltar el Control Seleccionado -----
procedure TfrmPrincipal.ControlClick(Sender: TObject);
begin
  if Assigned (imgSelect) then
  with shpSelect do
  begin
    Visible:=True;
    Top:=PosCur.X-1;
    Left:=PosCur.Y-1;
  end;
end;

Lo que sucede es que tengo que dar clic dos veces para que me muestre el TShape en el Nodo seleccionado, por ejemplo:
1ra situación:
Doy un clic y no sucede nada, doy otro clic y me muestra el TShape correctamente

2da situación:
Doy un clic en un nodo y no sucede nada, doy un clic en otro nodo y el TShape se me ubica en el nodo anterior

Al dar un clic parece que el nodo se asigna bien, porque al darle eliminar se elimina al que le di un clic, pero no sucede nada con la ubicacion del TShape

Alguna idea de lo que estoy haciendo mal?
Como podria arreglar eso?


Cita:
Empezado por neftali
No es por no hacerlo, pero creo que se "rompe" con la idea del componente.
De todas formas, no se si una solución podría ser crear un Frame con una imagen y un Label (por ejemplo) y seleccionar el frame para moverlo, cosa que no te debería dar ningún problema.
Aunque no lo he probado, no se si me sirva con un Frame, pues necesito que las imagenes tengan fondo transparente, y si el nombre de la etiqueta fuese mas largo que el ancho del frame, quizas ma la trunque
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes

Última edición por JoAnCa fecha: 09-02-2017 a las 21:19:16.
Responder Con Cita