Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Sobre la variable Sender (https://www.clubdelphi.com/foros/showthread.php?t=15417)

yusnerqui 22-10-2004 15:48:51

Sobre la variable Sender
 
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.

Código Delphi [-]
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.
Código Delphi [-]
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í:

Código Delphi [-]
 
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

Gracias
 
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

Justo a mi gusto
 
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:
Código Delphi [-]
  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!


La franja horaria es GMT +2. Ahora son las 16:38:59.

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