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 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
  #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
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
  #5  
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
  #6  
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
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 05:35:01.


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