Pregunta

Para evitar singletons y variables globales, me gustaría poder pasar parámetros a un componente TFrame. Sin embargo, dado que normalmente se incluye un TFrame en el formulario en tiempo de diseño, solo es posible utilizar el constructor predeterminado.

Por supuesto, el formulario principal puede establecer algunas propiedades en la devolución de llamada de OnCreate después de que se haya creado el TFrame. Sin embargo, esto no garantiza que no se olvide una propiedad, y las dependencias no son tan claras como usar un constructor.

Una buena manera sería si fuera posible registrar una fábrica para crear componentes mientras se lee el archivo dfm. Luego, los parámetros requeridos podrían pasarse al constructor TFrame cuando sean creados por la fábrica. ¿Hay alguna forma de lograr esto?

¿O alguien tiene una mejor solución sobre cómo pasar parámetros a un TFrame?

¿Fue útil?

Solución

Todos los componentes, incluidos los descendientes de TFrame , deben poder construirse utilizando el constructor heredado de TComponent . De lo contrario, no se pueden utilizar correctamente en el momento del diseño. Si la restricción del uso en tiempo de diseño es aceptable para usted, entonces podría anular ese constructor y generar una excepción. Eso evitaría que el componente se coloque en un formulario en el momento del diseño. Simplemente proporcione algún otro constructor que requiera otros parámetros.

Debido al requisito de tiempo de diseño, todos los componentes deben poder existir con algunas o todas sus propiedades aún en sus valores predeterminados. Eso no significa que los componentes tengan que hacer cosas útiles mientras están en ese estado, pero sí necesitan poder permanecer en ese estado por tiempo indefinido. Debería estar bien, por ejemplo, colocar un componente en un formulario, guardar el formulario y cerrar Delphi, con la intención de reanudar el diseño del formulario más adelante. El componente debe permitirse que se guarde y restaure, incluso si todas sus propiedades aún no se han configurado para su uso final.

Mi opción preferida es hacer cumplir las reglas del componente solo en tiempo de ejecución. Compruebe que todas las propiedades estén establecidas en valores razonables antes de permitir que se usen. Puede usar aserciones para imponer el uso adecuado de sus componentes. Los consumidores de sus clases aprenderán rápidamente si no han terminado de configurar sus componentes en sus formularios.

Otros consejos

Normalmente agregaría un " Inicializar " público, no virtual o (Inicializar a los estadounidenses) procedimiento que requiere que se proporcionen todos los parámetros. Esto luego establecerá las propiedades.

Haga que las propiedades estén protegidas o sean privadas, si es posible, de modo que la única forma de configurarlas sea desde la llamada Inicializar (AFoo, ABar: integer).

Luego, en TFormXXX.FormCreate o TformXXX.Create, tenemos:

inherited;
Initialise(foo, bar);

podría crear / registercomponent su propio componente tFrame y coloque eso en el formulario; es posible que se le haya pasado algo.

Si una fábrica podría proporcionar los parámetros que necesita, ¿por qué no reemplaza al constructor predeterminado de su marco y le pide parámetros a la clase de fábrica?

Normalmente hago mi propio constructor. De todos modos, no me gusta crear marcos en tiempo de diseño.

a) se puede crear un marco dinámicamente cuando sea necesario y destruirlo cuando no sea necesario

b) asigne al marco una propiedad pública con el tipo de datos del parámetro o una estructura de datos y pase los valores al formulario a través de la propiedad.

Ejemplo:
TAddress : una clase para contener los elementos habituales de una dirección.
TAddressFra : un marco con los controles visuales para mostrar la dirección

  • rellene una instancia de TAddress con valores
  • crear una instancia de TAddressFra
  • asigne la propiedad TAddressFra.address con la instancia de TAddress
  • utilice el procedimiento setAddress (o_address: TAddress) para asignar los valores de los atributos TAddress a los componentes visuales correspondientes en el TAddressFra
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top