PDA

Ver la Versión Completa : Sobre la variable Sender


yusnerqui
22-10-2004, 15:48:51
Hola amigos del foro, mi duda es la siguiente: Tngo un evento que comparto con dos componentes de diferente tipo, pero en dicho esvento tengo que extraer las mismas propiedades a estos componentes(el hint y el caption) rl único ancestro común que tienen es TComponent y este no tiene estas propiedades, entonces tengo que hacer lo siguiente.


if (Sender is TMenuItem) then
begin
H := TMenuItem(Sender).Hint;
Cap := TMenuItem(Sender).Caption;
end
else
begin
H := TdxWinXPBarItem(Sender).Hint;
Cap :=TdxWinXPBarItem(Sender).Caption;
end;


Si nos fijamos la única diferencia es la captura del tipo de objeto que viene por Sender.

Mi pregunta es: Existe alguna forma de obtimizar el código anterior.

desde ya mil gracias

Saludos Yuserqui.

delphi.com.ar
22-10-2004, 16:03:06
Tu problema no es la optimización del codigo, sino que tu código es propenso a errores inesperados, porque si el objeto pasado como sender no es un TMenuItem o un TdxWinXPBarItem, seguramente tendras un error bastante feo.

if (Sender is TMenuItem) then
with TMenuItem(Sender) do
begin
H := Hint;
Cap := Caption;
end
else if (Sender is TdxWinXPBarItem) Then
with TdxWinXPBarItem(Sender) do
begin
H := Hint;
Cap := Caption;
end
else
raise....

ruina
22-10-2004, 16:22:22
Sí, lo que buscas se puede hacer con una técnica de OOP llamada "Reflexión"


en la unidad Typinfo.pas de delphi encontraras las funciones necesarias: GetPropInfo, SetOrdProp, SetStrProp y alguna mas... pero las interesantes son esas.

Concretamente lo que pides se puede hacer así:



uses TypInfo; //acuerdate de ponerlo
...
...
procedure TForm1.Button1Click(Sender: TObject);
var p :PPropInfo;
begin
p:= GetPropInfo(Sender.ClassInfo,'hint');
if p<>nil then
begin
SetStrProp(Sender, 'hint','hola!');
SetOrdProp(Sender, 'showhint',1); //aqui no pregunto, pero me estoy jugando una bonita excepción
end;
if GetPropInfo(Sender.ClassInfo,'Caption')<>nil then
SetStrProp(Sender, 'caption','^_^');
end;



Lo bueno es que vale para cualquier Sender .. incluso si te bajas el componente "TColorPolloFritoEdit" (se nota que tengo hambre?) funcionará.

yusnerqui
22-10-2004, 16:31:08
Muchas gracias por tu rápida respuesta, tienes mucha razón(debemos controlarlo todo) a pesar que la aplicacón la estoy programando yo y estoy completamente seguro que solo esos dos tipos apuntan a este evento no di la importancia que debía al control de errores.
Regresando al tema del hilo, no entiendo la causa de que no exista un método para acceder a una determinada propiedad por su nombre independientemente de la clase que sea.

yusnerqui
22-10-2004, 17:11:20
Muchas Gracias por la gran ayuda, mi lenta conección me obligó a responder a el amigo Delphi.com.ar antes de haber podido leer tu mensaje, no conocía esta unit que concidero muy interesante.

reslví mi problema que no era de asignar el valor a la propiedad sino de capturar dicho valor con:

H:= GetPropValue(Sender,'hint');
Cap := GetPropValue(Sender,'Caption');


Mil gracias a todos nuevamente y un saludo

Yusnerqui

delphi.com.ar
25-10-2004, 16:12:24
Utilizar RTTI no es precisamente optimizar el código, que es lo que tu pedías... si posiblemente sea flexibilizarlo.

Saludos!