PDA

Ver la Versión Completa : Propiedad del tipo TComponentClass


basti
16-03-2007, 02:39:57
Hola foreros

He creado un componente que contiene un Edit, un Combo y tres botones.

El objetivo del componente es el siguiente, con un ejemplo creo que quedará más clara la explicación:

Supongamos que estoy en un formulario de facturas y quiero seleccionar el cliente.

1º.- Puedo escribir el código, si lo sé en el Edit.
2º.- Puedo selecionarlo desde el Combo, por el nombre.
3º.- Puedo usar uno de los botones, que me abrirá un formulario de búsqueda.
4º.- Si no existe el cliente, puedo usar otro de los botones para abrir el formulario de mantenimiento de clientes.


En este último paso, es donde tengo un pequeño problema. Tengo una propiedad del tipo TComponentClass donde puedo asignar el formulario que quiero que abra.

Todo funciona correctamente, pero me gustaría que esta propiedad apareciese en el Object Inspector (cosa que no sé porqué no hace), y que se pudiese seleccionar el formulario en él. Ahora mismo lo hago por código.


Definición de la propiedad:

published
property FormButtonForm : TComponentClass read FFormButtonForm write SetFormButtonForm;



Así es como la asigno ahora:

SelectLookupClientes.SetFormButtonForm(TClientes);


Gracias de antemano

Al González
16-03-2007, 08:04:27
¡Hola a todos!

...me gustaría que esta propiedad apareciese en el Object Inspector (cosa que no sé porqué no hace), y que se pudiese seleccionar el formulario en él...
Qué tal Basti. No mencionas cuál versión de Delphi utilizas, pero supongo que esta respuesta que doy basándome en experiencias similares con Delphi 7 y versiones anteriores es válida también para la versión que utilizas. La razón por la cual no aparece la nueva propiedad en el inspector de objetos es que éste (más específicamente el subsistema de almacenamiento de establecimientos de diseño o Streaming) no soporta las propiedades de tipo clase.

Una manera habitual de resolver el problema es cambiar el tipo de esa propiedad publicada a String, y en tiempo de ejecución utilizar la función FindClass para "convertir" esa cadena a la clase que corresponde y entonces usar ésta para los fines pretendidos.

Un detalle relevante es que la clase en cuestión debe ser registrada (agregada a una lista especial que maneja el programa) en tiempo de ejecución para que FindClass tenga éxito, pero esto no es necesario con las clases de formas que hayan sido definidas en tiempo de diseño y las clases de sus componentes contenidos; con ellas el registro se realiza de manera automática como lo dice la propia ayuda («Form classes and component classes that are referenced in a form declaration (instance variables) are automatically registered with the streaming system»).

Si en algún momento te ves obligado a registrar una clase explícitamente, te sugiero utilizar la función RegisterClass.

Algo que me entusiasmó con la salida de .NET fue pensar que en las nuevas versiones de Delphi podríamos contar con un tratamiento de clases más enriquecido para manejar todas estas cuestiones de forma más fácil y potente. Incluso en las nuevas versiones para Win32, tengo entendido hubo algunos avances al respecto, pero más allá de Delphi 7 no me he movido todavía (desconozco realmente el terreno).

Un abrazo clasificado.

Al González. :)

basti
16-03-2007, 09:06:29
Hola Al González, gracias por tu ayuda, supongo que tendré que crear una propiedad string, tal y como dices. Esperaba que se pudiese hacer de otra manera, para no tener que hacer un editor de propiedades que busque los formularios.

Ah, perdón por no haber dicho que utilizo Delphi 7.

Un saludo