Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-11-2006
dany2006 dany2006 is offline
Miembro
 
Registrado: nov 2006
Posts: 18
Poder: 0
dany2006 Va por buen camino
Obtener Nombre De Componente

Hola Necesito Obtener El Nombre Del Componente Sobre El Cual Posiciono El Puntero Del Mouse. Gracias
Responder Con Cita
  #2  
Antiguo 10-11-2006
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
Creo que la función FindVCLWindow de la unidad Controls es lo que buscas.

// Saludos
Responder Con Cita
  #3  
Antiguo 10-11-2006
dany2006 dany2006 is offline
Miembro
 
Registrado: nov 2006
Posts: 18
Poder: 0
dany2006 Va por buen camino
FindVCLWindow

me explicarias la sintaxis?. si tenes alguna sentencia de ejemplo te agradeceria.
Responder Con Cita
  #4  
Antiguo 10-11-2006
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
Pues la sintaxis exacta no sabría decírtela porque la sé para delphi, no para c++ builder, pero debe ser similar. Un ejemplo en Delphi:

Código Delphi [-]
procedure TForm1.AppEventsIdle(Sender: TObject; var Done: Boolean);
var
  Control: TWinControl;

begin
  Control := FindVCLWindow(Mouse.CursorPos);

  if Assigned(Control) then
    Caption := Control.Name;
end;

// Saludos
Responder Con Cita
  #5  
Antiguo 10-11-2006
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
Me acordé de que tengo instalado el turbo c++

Aquí el mismo ejemplo para c++:

Código:
void __fastcall TForm1::AppEventsIdle(TObject *Sender, bool &Done)
{
  TWinControl *Control;

  Control = FindVCLWindow(Mouse->CursorPos);

  if (Control)
  {
    this->Caption = Control->Name;
  }
}
En el ejemplo, AppEvents es una componente TAppEvents (pestaña Additional) y uso su evento OnIdle. Mouse es un objeto global que representa al ratón.

/* Saludos */
Responder Con Cita
  #6  
Antiguo 10-11-2006
dany2006 dany2006 is offline
Miembro
 
Registrado: nov 2006
Posts: 18
Poder: 0
dany2006 Va por buen camino
vcl

muchisimas gracias. esta perfecto, pero no funciona para lo que necesito porque no me toma en cuenta los TShape. Probé mostrando en un Edit el nombre de los componentes y me muestra todos menos los TShape. Si encuentras la forma por favor avisenme. Gracias.
Responder Con Cita
  #7  
Antiguo 10-11-2006
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
Pues por ahí hubiéramos empezado porque un Shape no es un WinControl. Lo único que se me ocurre es hacer un función que recorra todas las componentes del formulario y si es un Shape, vea si el ratón está sobre él:

Código Delphi [-]
function TForm1.FindShape(const Pos: TPoint): TShape;
var
  I: Integer;

begin
  Result := nil;

  for I := 0 to ComponentCount - 1 do
  begin
    if Components[i] is TShape then
    begin
      if PtInRect(TShape(Components[i]).BoundsRect, Pos) then
      begin
        Result := TShape(Components[i]);
        break;
      end;
    end;
  end;
end;

procedure TForm1.AppEventsIdle(Sender: TObject; var Done: Boolean);
var
  Shape: TShape;

begin
  Shape := FindShape(ScreenToClient(Mouse.CursorPos));

  if Assigned(Shape) then
    Caption := Shape.Name;
end;

No pongo ahora ejemplo en C porque mi turbo explorer se acaba de quedar congelado

// Saludos
Responder Con Cita
  #8  
Antiguo 10-11-2006
dany2006 dany2006 is offline
Miembro
 
Registrado: nov 2006
Posts: 18
Poder: 0
dany2006 Va por buen camino
shapes

ok. te cuento bien como seria. Tengo 121 Shapes en el formulario. Necesito que al pasar el puntero del mouse por cada uno de ellos pueda saber de cual se trata para cambiarle las propiedades.
Responder Con Cita
  #9  
Antiguo 10-11-2006
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
Pues no veo cuál es el problema. Con la función que puse en mi mensaje anterior puedes hacerlo invcándola en el evento MouseMove del formulario. El MouseMove no se detecta cuando se pasa por un control pero sí cuandos e pasa por un shape.

// Saludos
Responder Con Cita
  #10  
Antiguo 10-11-2006
dany2006 dany2006 is offline
Miembro
 
Registrado: nov 2006
Posts: 18
Poder: 0
dany2006 Va por buen camino
shapes

Agradeceria que pusieran el codigo de c++, porque no entiendo muy bien el de Delphi. Se que es similar la fuente, pero no pude traducirla. Gracias
Responder Con Cita
  #11  
Antiguo 10-11-2006
dany2006 dany2006 is offline
Miembro
 
Registrado: nov 2006
Posts: 18
Poder: 0
dany2006 Va por buen camino
a

Esta linea: como sería en c++?
if Components[i] is TShape then
Responder Con Cita
  #12  
Antiguo 10-11-2006
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
Buena pregunta, al parecer en C++ es distinto, no hay operador is.

Aquí ya no tengo el C++ para probar pero intentemos a ciegas:

Código:
TShape * __fastcall TForm1::FindShape(TPoint Pos)
{
  integer i;

  for (i = 0; i < this->ComponentCount; i++)
  {
    if (dynamic_cast<TShape *>(this->Components[i]))
    {
      if PtInRect(((TShape *)this->Components[i])->BoundsRect, Pos)
      {
         return ((TShape *)this->Components[i]);
      }
    }
  }

  return NULL;
}
// Saludos
Responder Con Cita
  #13  
Antiguo 10-11-2006
dany2006 dany2006 is offline
Miembro
 
Registrado: nov 2006
Posts: 18
Poder: 0
dany2006 Va por buen camino
Gracias!!!!!!!!!!

Estoy muy agradecido. Me salvaron totalmente. La verdad es que sos un capo por la disposición que tenés al escribir el código aunque sea "a ciegas". El código en C++ corregidos unos pequeños detalles sería:

Código:
TShape * __fastcall TForm1::FindShape(TPoint Pos)
{
  for (int i = 0; i < this->ComponentCount; i++)
    if ( dynamic_cast < TShape * > (this->Components[i]))
      if (PtInRect(((TShape *)this->Components[i])->BoundsRect, Pos) )
         return ((TShape *)this->Components[i]);
  return NULL;
}
Lo pongo por si le sirve a alguien más.

Hasta la próxima.

Última edición por dec fecha: 10-11-2006 a las 07:13:14.
Responder Con Cita
Respuesta



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
Obtener el nombre de la tabla jzginez Conexión con bases de datos 1 18-08-2006 23:32:03
obtener version y nombre de aplicacion droguerman OOP 2 10-06-2006 17:25:57
Obtener el nombre del Adaptador de Red wpolanco Redes 0 17-05-2006 06:16:01
Obtener el nombre de mi ejecutable jorch_yr Varios 3 29-05-2004 21:23:34
¿Se puede obtener el nombre de un handle? Al González API de Windows 5 23-12-2003 17:48:55


La franja horaria es GMT +2. Ahora son las 20:36:07.


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