Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-02-2017
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 19
JoAnCa Va por buen camino
Cool Ayuda con componente TSelectOnRuntime de Neftali

Hola a todos
Aunque mas bien el tema esta dirigido a Neftalí, pero cualquier otro miembro del foro pudiera aceptar el reto

Pues buscando una solucion para un proyecto que incluye un mapa de red, llegue a los componenetes TSelectOnRuntime y TSaveComps de la libreria GLib, que me sirven bien para lo que necesito, muy buenos.

Me basé en el ejemplo del restaurante que esta en la propia web de Neftali, que se adecua perfectamente a lo que quiero, pero quisiera que me ayudaran en modificar algunos detalles, necesarios para mi proyecto.

– Al crear un control, poder asociarle una etiqueta (que se ubique debajo) y que se mueva junto con el mismo
– Al seleccionarlo en lugar de rodearlo con los “circulitos” encerrarlo en un cuadrado de algun color


Alguna idea de como hacerlo?



Para Neftalí: Si quieres (o puedes) agregas las modificaciones (como propiedades o como entiendas mejor) al componente TSelectOnRuntime, y me dices para descargar la nueva actualizacion



Solo me quedan esos detalles para que me sirva 100% para lo que necesito
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes
Responder Con Cita
  #2  
Antiguo 09-02-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Aunque no está de más que cooques aquí tu mensaje, también podrías escribirle directamente en su blog y también podrías colocar aquí el enlace correspondiente de su blog para quien esté interesado y sepa bien de qué se habla.

LineComment Saludos
Responder Con Cita
  #3  
Antiguo 09-02-2017
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Hola.

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.



No se ve el ratón en la captura, pero creo que se entiende la idea.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 09-02-2017 a las 19:19:56.
Responder Con Cita
  #4  
Antiguo 09-02-2017
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 19
JoAnCa Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Aunque no está de más que cooques aquí tu mensaje, también podrías escribirle directamente en su blog y también podrías colocar aquí el enlace correspondiente de su blog para quien esté interesado y sepa bien de qué se habla.

LineComment Saludos
Disculpa, no me percate que no habia puesto el enlace, pues es lo correcto

No pude modificar el post para los enlaces, pero pueden acceder a la web de neftali para descargar la libreria GLib

PD: En su web tambien lo publique, pero ademas aqui, que hay mas posibilidades de respuestas de otros miembros
__________________
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 19:50:28.
Responder Con Cita
  #5  
Antiguo 09-02-2017
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 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 22:19:16.
Responder Con Cita
  #6  
Antiguo 10-02-2017
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 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
  #7  
Antiguo 10-02-2017
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 19
JoAnCa Va por buen camino
Al final ya quedo resuelto el problema

Lo que pasaba era que estaba usando el evento equivocado, lo de poner el resaltado del control con el Shape es en el ControlMouseDown y no en el ControlClick como lo trataba de hacer.
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes
Responder Con Cita
  #8  
Antiguo 12-02-2017
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto

Enhorabuena.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Peticion a Neftali sobre Componente kurono Varios 20 23-01-2011 11:05:18
Solicito ayuda de Neftalí JoAnCa Varios 2 20-03-2010 16:26:45
TSelectOnRunTime ACCESS VIOLATION DELPHI7 tuxtlagacse API de Windows 1 30-01-2007 12:08:45
No funcionan componentes TSelectOnRuntime cuando estan controles dentro de un panel gulder API de Windows 6 11-08-2006 10:58:50
Neftali Ayuda please! krilea Conexión con bases de datos 6 01-06-2006 16:41:22


La franja horaria es GMT +2. Ahora son las 12:20:45.


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
Copyright 1996-2007 Club Delphi