Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Obtener Nombre De Componente (https://www.clubdelphi.com/foros/showthread.php?t=37347)

dany2006 10-11-2006 00:41:07

Obtener Nombre De Componente
 
Hola Necesito Obtener El Nombre Del Componente Sobre El Cual Posiciono El Puntero Del Mouse. Gracias

roman 10-11-2006 00:59:23

Creo que la función FindVCLWindow de la unidad Controls es lo que buscas.

// Saludos

dany2006 10-11-2006 01:23:14

FindVCLWindow
 
me explicarias la sintaxis?. si tenes alguna sentencia de ejemplo te agradeceria.

roman 10-11-2006 01:29:36

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

roman 10-11-2006 01:38:30

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 */

dany2006 10-11-2006 02:13:02

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.

roman 10-11-2006 02:29:14

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

dany2006 10-11-2006 04:08:29

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.

roman 10-11-2006 04:16:46

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

dany2006 10-11-2006 04:28:59

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

dany2006 10-11-2006 04:32:21

a
 
Esta linea: como sería en c++?
if Components[i] is TShape then

roman 10-11-2006 04:48:56

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

dany2006 10-11-2006 06:24:45

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.


La franja horaria es GMT +2. Ahora son las 04:44:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi