Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-10-2004
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
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.
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #2  
Antiguo 22-10-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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....
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 22-10-2004
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
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.
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #4  
Antiguo 22-10-2004
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
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
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #5  
Antiguo 25-10-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Utilizar RTTI no es precisamente optimizar el código, que es lo que tu pedías... si posiblemente sea flexibilizarlo.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #6  
Antiguo 22-10-2004
Avatar de ruina
ruina ruina is offline
Miembro
 
Registrado: jun 2004
Posts: 196
Poder: 20
ruina Va por buen camino
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á.
__________________
todo el mundo debe creer en algo... yo creo que voy a tomarme otra copa.

Última edición por ruina fecha: 22-10-2004 a las 16:26:58.
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


La franja horaria es GMT +2. Ahora son las 02:26:27.


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