Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   cómo agregar propiedades "published" a un componente desde afuera del mismo? (https://www.clubdelphi.com/foros/showthread.php?t=63443)

poyo 13-02-2009 21:19:25

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 :confused:.

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?

Al González 13-02-2009 21:44:18

¡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? :confused:

roman 13-02-2009 21:47:19

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

poyo 13-02-2009 21:55:04

Cita:

Empezado por Al González (Mensaje 338094)
¿quieres extender una clase sin crear una derivación de ella ni modificar su código fuente? :confused:

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...

roman 13-02-2009 22:02:56

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

poyo 13-02-2009 22:10:08

Cita:

Empezado por roman (Mensaje 338099)
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.

Al González 14-02-2009 00:51:27

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í.

:)

poyo 14-02-2009 01:26:07

Cita:

Empezado por Al González (Mensaje 338109)
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.


La franja horaria es GMT +2. Ahora son las 03:34:00.

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