PDA

Ver la Versión Completa : Como publicar una propuedad TClass


miriarteen
02-08-2003, 11:17:38
Buenas,

Tengi un componente registrado en el cual quiero que una de sus propiedades published sea de tipo TClass. No quiero guardar un objeto de este tipo, sino una clase concreta. Es decir, no quiero guadar un formulario de tipo TForm sino la clase TForm.

El problema es que si defino la propiedad como TClass, esta no aparece publicada en el inspector de objetos. Por cierto la clase pude no estar registrada.

Un saludo,


mikel.

__marcsc
02-08-2003, 11:42:55
Hola,

no estoy muy convencido pero me parece recordar que alguien dijo por este foro que si publicas TFormClass en lugar de TClass sí que te aparecerá y te dejará seleccionar la lista de clases de los forms de tu proyecto. Otra cosa es si esto no te interesa.

En caso que necesites que realmente sea TClass y no TFormClass, te recomiendo que busques en la ayuda el procedimiento RegisterPropertyEditor, que lo que hace es decirle al IDE de Delphi que cuando haya una propiedad de cierto tipo invoque a un editor que has elejido (o creado) tu.

Suerte!

andres1569
02-08-2003, 12:41:05
Hola:

Lo que dice Marcsc de que se comentó en estos foros sobre poner TFormClass y que aparecían los Forms disponibles en la unit donde estábamos ubicados, sé que se trató en los foros históricos, pero no recuerdo que se determinara que aquello funcionara, en mi opinión no, puesto que no es lo mismo tener una propiedad de tipo TClass que de tipo Objeto, en esta última Delphi sí tiene el mecanismo para mostrar en una lista los objetos creados que están a tu disposición.

El problema es que no puedes publicar una propiedad del tipo TClass (lo puedes hacer pero no te la mostrará el Object Inspector, eso ya lo has podido comprobar), ni tampoco Delphi la va a almacenar en el fichero .DFM. Lo que sí puedes es crear una propiedad, llamémosla ClassStr así:

property ClassStr : string read GetClassStr write SetClassStr;

En los métodos de lectura y escritura buscas la forma de obtener/guardar en modo cadena la Clase que estás tratando, e internamente la almacenas en una variable FClass de tipo TClass. Ello supone tener un mecanismo que te haga las conversiones, y luego, como te comenta Marcsc, crear un editor de propiedades que permita devolver una lista con todas las clases candidatas (ese editor de propiedades devuelve una lista TStrings, es decir una lista de cadenas, al Object Inspector). El método GetClassStr sería muy fácil de implementar, algo así:

result := FClass.ClassName;

Para el método SetClassStr, en el que tendrías que obtener la clase a partir de una cadena, la cosa es algo más complicada. Te aconsejo mirar los procedimientos FindClass y GetClass de la unit classes, que devuelven un TPersistentClass (¿Suficiente para lo que quieres?) de las clases registradas. Si, como dices, puede que no estén registradas pero conoces las clases candidatas, lo ideal es que tengas una especie de Lista donde las almacenes junto a su descripción, parecido a como Delphi registra las clases. Esa lista se crearía en la seccion Initialization y ahí se le añadirían las clases junto a su nombre descriptivo, que normalmente será Class.ClassName.

Muy recientemente se ha tratado un tema similar, donde al final Roman, desde lo más profundo de la vagancia :D pero sin perder su punch, ha aportado una forma de crear formularios a partir de una fábrica. La fábrica de forms almacena una lista de clases de formularios, que debemos encargarnos de registrar (¡ojo!, registrar en esa lista, nada que ver con la opción RegisterClasses de Delphi), para luego poder obtener una instancia del formulario deseado indicándole el nombre del mismo. Aquí tienes el link:

http://www.clubdelphi.com/foros/showthread.php?threadid=2656

En tu caso sería algo parecido, además supongo que almacenas una clase para más tarde crear objetos de esa misma clase, así que te puede servir.

Espero que este rollo te haya aportado algo de luz, si no es así me retiro. :)