Ver Mensaje Individual
  #6  
Antiguo 10-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 continué experimentando con TSelectOnRuntime de Neftali en el ejemplo del restaurante y logre adicionar la etiqueta y resaltar el TImage con un TShape

Le agregue esto al procedimiento de crear las mesa (_CreateMesa) para asociarle la etiqueta

Código Delphi [-]
    //--- Crear y asociar la etiqueta ---
    lblDisp:=CrearLabelAsociada(img, NewName);
    img.Hint:=lblDisp.Name;

quedando de esta forma
Código Delphi [-]
function TFormMain._CreateMesa(AName:String; AParent:TWinControl; ALeft, ATop:Integer):TImage;
var
  img               :TImage;
  comp              :TComponent;
  NewName, TitDisp  :String;

begin
  // Crear el nuevo elemento
  img := TImage.Create(Self);
  Result := img;

  // Modificar
  with img do
  begin
    // crear la nueva mesa
    Picture := imgMesaDemo.Picture;

    // Se ha pasado nombre?
    if (AName <> '') then
    begin
      NewName := AName;
    end
    else
    begin
      // Proteccion simple por si el nombre existe... (por si se han borrado)
      NewName := 'Mesa_' + IntToStr(_nmesas);
      comp := Self.FindComponent(NewName);
      // ir buscando nombre no existente
      while Assigned(comp) do
      begin
        _nmesas := _nmesas + 1;
        NewName := 'Mesa_' + IntToStr(_nmesas);
        comp := Self.FindComponent(NewName);
      end;
    end;

    _nmesas := _nmesas + 1;
    Parent := AParent{pnlPlano};
    img.Name := NewName;
    img.ShowHint := True;
    img.Hint := 'Mesa: ' + img.Name;

    // Posicion
    Left := ALEft;
    Top := ATop;
    // Tamaño
    height := imgMesaDemo.Height;
    width := imgMesaDemo.Width;
    // Otras propìedades
    Transparent := True;
    Stretch := True;
    // eventos
    OnClick := OnMesaClick;

    //--- Crear y asociar la etiqueta ---
    lblDisp:=CrearLabelAsociada(img, NewName);
    img.Hint:=lblDisp.Name;

    // Añadirla al combo de mesas
    cbMesa.Items.Add(NewName);
    cbMesa.ItemIndex := 0;
    cbMesa2.Items.Add(NewName);
    cbMesa2.ItemIndex := 0;
  end;
end;

Estab es la funcion del Label
Código Delphi [-]
function TFormMain.CrearLabelAsociada(AImage: TImage; Titulo: string):TLabel;
var
  lbl :TLabel;

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

Y para el resaltado modifique el evento OnMesaClick, quedando de esta forma

Código Delphi [-]
//----- Para cuando se seleccione el Dispositivo -----
procedure TFormMain.OnMesaClick(Sender: TObject);
begin
  SelectOnRunTime.Selected := False;
  // En un TControl?
  if (Sender is TControl) then
  begin
    SelectOnRunTime.SelectControl:=TControl(Sender);
    SelectOnRunTime.Selected:=True;

    //--- Mostrar el Marco ---
    shp1.Visible:=True;
    shp1.Left:=TControl(Sender).Left-1;
    shp1.Top:=TControl(Sender).Top-1;

    //--- Mover la etiqueta asociada también ---
    lblDisp:=TLabel(FindComponent(TControl(Sender).Hint));
    lblDisp.Left:=TControl(Sender).Left;
    lblDisp.Top:=TControl(Sender).Top + TControl(Sender).Height + 2;
  end;
end;

Aunque me quedo un poco "rustico" ya que cuando se mueve el control, la etiqueta y el marco se quedan en su origen hasta que se suelte el control en su destino, que se ubican en la posicion correcta

Pero bueno, por ahora esta bien, despues se podra refinar un poco para que quede mejor
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes
Responder Con Cita