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 13-02-2009
poyo poyo is offline
Miembro
 
Registrado: ene 2009
Posts: 47
Poder: 0
poyo Va por buen camino
cómo agregar propiedades "published" a un componente desde afuera del mismo?

Alguien ha logrado publicar propiedades de un compoente desde afuera de la clase para que en designtime se vean desde el object inspector?

Les cuento. Tengo un componente de un tercero que le quiero agregar 2 propiedades: un string y un booleano y no quiero andar parcheando el código ajeno (aunque sé que es muy fácil) cada vez que sale una nueva versión... inclusive se pudiera dar el caso de que sucediese con otros componentes de los cuales no tuviera código alguno.

Intenté con los Class Helpers que, pesar de su nombre, no me ayudaron para nada .

Código Delphi [-]
type
  TXHelper = class helper for TXObject
  protected
    procedure SetI(value:integer);
    function GetI: integer;
    procedure SetS(value:String);
    function GetS: String;
  published
      property XX: Integer read GetA write SetA;
      property ZZ: String read GetS write SetS;
  end;

Arriba puse mi último intento (que incluso lo puse dentro del mismo unit donde está la clas TXObject).
Como verá las propiedades no usan Fields para el GET y SET ya que los Class helper lo no soportan.

Probé de varias maneras pero sigo sin poder lograrlo... alguien pudo hacer algo parecido alguna vez?
Responder Con Cita
  #2  
Antiguo 13-02-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola Poyo!

Gusto en saludarte. La solución es crear una clase derivada (herencia).

La verdad es que no comprendo del todo el planteamiento, ¿quieres extender una clase sin crear una derivación de ella ni modificar su código fuente?
Responder Con Cita
  #3  
Antiguo 13-02-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Entiendo que no quieras modificar el código fuente de TXObject; lo que no entiendo es porqué no heredas de él un nuevo componente al cual agregar las propiedades que quieras.

// Saludos
Responder Con Cita
  #4  
Antiguo 13-02-2009
poyo poyo is offline
Miembro
 
Registrado: ene 2009
Posts: 47
Poder: 0
poyo Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
¿quieres extender una clase sin crear una derivación de ella ni modificar su código fuente?
Exacto! es una clase base, que es hereda por otra y por otra y por otra y así por muchas.

A ver si se ve más gráficamente:

a
/ / \ \
b c d e
// \\ // \\
fg hi jk lm

Yo quiera expandi "a" y que las clases f,g,h,i,j,kl y m vean los cambios...
pensé que los classhelpers podrían ser la solución pero creo estar equivocado.

Además, si a futuro apareciesen nuevos componentes derivados de estos últimos, ésto quedarían extendidos.
me parece que va a ser más fácil gerar un .patch por ahora...
Responder Con Cita
  #5  
Antiguo 13-02-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Sigo sin entender. ¿por qué no creas un componente TXObjectExentended, derivado de TXObject al cual añades las propiedades deseadas, y del cual heredas todas las demás, b, c, d, e, f, g, h, etc.

Si en un futuro cambias la versión de TXObject, no afectas a los restantes porque éstos heredan de TXObjectExtended.

// Saludos
Responder Con Cita
  #6  
Antiguo 13-02-2009
poyo poyo is offline
Miembro
 
Registrado: ene 2009
Posts: 47
Poder: 0
poyo Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Sigo sin entender. ¿por qué no creas un componente TXObjectExentended, derivado de TXObject al cual añades las propiedades deseadas, y del cual heredas todas las demás, b, c, d, e, f, g, h, etc.

Si en un futuro cambias la versión de TXObject, no afectas a los restantes porque éstos heredan de TXObjectExtended.
// Saludos
el tema es que los objetos b, c, d, e, f, g, h...etc son ajenos a mí, es decir, herean directa o indirectamente a TXObject (inclusive hay otra librería de otros terceros que también usan A).

Yo uso b, c, d, e, f, g, h, etc. e inclusive a esta otra librería de componentes que se basa en la primera.
Responder Con Cita
  #7  
Antiguo 14-02-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Ah, ahora sí te comprendo Poyo. Pues precisamente eso es a lo que yo llamo herencia insertada, pero desafortunadamente no existe en Delphi y creo que pocos lenguajes de programación lo tienen.

Alguna vez Román me comentó en otro hilo (busca "herencia insertada") que Java Script (no Java, aclaro) sí tenía esa capacidad, pero no he estudiado cómo es eso ahí.


Última edición por Al González fecha: 14-02-2009 a las 01:08:21.
Responder Con Cita
  #8  
Antiguo 14-02-2009
poyo poyo is offline
Miembro
 
Registrado: ene 2009
Posts: 47
Poder: 0
poyo Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
Ah, ahora sí te comprendo Poyo. Pues precisamente eso es a lo que yo llamo herencia insertada, pero desafortunadamente no existe en Delphi y creo que pocos lenguajes de programación lo tienen.

Alguna vez Román me comentó en otro hilo (busca "herencia insertada") que Java Script (no Java, aclaro) sí tenía esa capacidad, pero no he estudiado cómo es eso ahí.
Si no me equivoco, creo que el concepto, más allá de la técnica utilizada, se llama refléxión.

Yo he visto hacer cosas como estás.... (no lo de la "herencia insertada", pero sí lo de agregar la propiedad publicada). lástima que estoy corto de tiempo para investigar... a ver... (desempolvando links agendados... y luego de toser un poco por el polvo...)
Para aquellos que les interese acá hay una punta:

http://blogs.codegear.com/abauer/2007/02/24/32322

http://hallvards.blogspot.com/2007/0...a-part_11.html

http://dn.codegear.com/article/33448

Lo estube chusmeando un poco y es algo engorroso.

en DesignIntf.pas está definido ISelectionPropertyFilter (de paso lean el comentario que hay en el Unit)
la idea es implementarlo para manipular la lista de propiedades del objeto, ya sea para agregar como para quitar.

Es interesante las cosas que se pueden hacer (como ser, opcionalmente, mostrar u ocultar propiedades o categorías de las mismas)

Para agregar es lo engorroso.

Lo que no me queda claro lo de Streaming (habitualmente persistencia mediante .DFM) usando:
TPersistent.DefineProperties(Filer: TFiler); virtual;
Si bien entiendo cómo y para qué es esa función, no veo cómo aplicarlo en este caso, si al form o a la clase... si es a la clase, la tengo que modificar o se puede hacer con un Class Helper? habrá que probar...
Será para cuando pueda.
Buen fin de semana. Me voy a pasarla al Delta del Rio Paraná de la Palmas.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como cambiar valores en la ventana "General" propiedades del sistema JuanErasmo API de Windows 52 17-02-2012 17:42:20
Cómo acceder a las propiedades de un "Parent" NeoAnderson API de Windows 14 12-02-2008 21:13:46
Necesito llamar a métodos de clases "hija" desde su clase "padre" Flecha OOP 17 20-04-2007 00:03:53
ComboBox - Pasar un "Key" presionado afuera como si fuera de allí amadis OOP 7 10-11-2006 14:29:48
Como pasarle el valor a un componente "convert" Juan Carlo Varios 2 23-07-2004 22:55:38


La franja horaria es GMT +2. Ahora son las 19:53:26.


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