PDA

Ver la Versión Completa : Obtener Nombre De Componente


dany2006
10-11-2006, 00:41:07
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
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:


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++:


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
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:


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
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
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
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 (http://www.thedelphimagazine.com/samples/cbuilder/article.htm#RTTI), no hay operador is.

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


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
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:


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.