FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Añadiendo propiedades a un formulario
Vuelvo a estar en deuda con Ray Lischner (www.tempest-sw.com) pues este truco simplemente desarrolla la técnica que describe en su propia página. De lo que se trata es de definir nuevas clases de formularios (TForm) que incorporen nuevas propiedades y eventos, de modo tal que éstas puedan ser editadas en el propio Inspector de Objetos.
Definir un nuevo componente basado en TForm. Crear un experto. Definir un nuevo componente basado en TForm El primer paso consiste en definir el nuevo formulario que queremos utilizar, basándonos en el tipo TForm. No es estrictamente necesario que se el ancestro sea precisamente TForm; naturalmente, puede ser también un derivado de TDataModule, pero lo interesante es que podemos utilizar con el mismo éxito cualquier derivado de TWinControl. En este ejemplo, por simplificar, solamente utilizaré formularios. El nuevo tipo de formulario debe crearse dentro de un package de tiempo de ejecución. Podemos utilizar un package mixto, para diseño y ejecución, pero es preferible mover el código de tiempo de diseño fuera, para evitar sobrecargar de código a los programas que utilicen el formulario. He aquí una sencilla clase que define una propiedad, un par de métodos de clase, y que intercepta eventos de modo transparente para el programador:
Los procedimientos de clase se implementan del siguiente modo:
El funcionamiento de estos métodos está explicada en La Cara Oculta de Delphi 4 (un poco de autobombo, ¿puedo?). Ahora los métodos relacionados con el mantenimiento del puntero al conjunto de datos:
Durante la ejecución del nuevo Loaded se enganchan nuestros propios manejadores de eventos:
La respuesta interna a OnClose es muy sencilla: [delphi] procedure TDatabaseForm.InternalClose(Sender: TObject; var Action: TCloseAction); begin if Assigned(FOldClose) then FOldClose(Sender, Action); Action := caFree; end; [delphi] La respuesta a OnCloseQuery es un poco más larga: [delphi] procedure TDatabaseForm.InternalCloseQuery(Sender: TObject; var CanClose: Boolean); begin if Assigned(FOldCloseQuery) then begin FOldCloseQuery(Sender, CanClose); if not CanClose then Exit; end; if Assigned(FDataSet) and FDataSet.Active then if ModalResult in [mrOk, mrNone] then FDataSet.CheckBrowseMode else FDataSet.Cancel; end; [delphi] Con esto terminamos la programación del package de tiempo de ejecución. Crear un experto Para poder aprovechar un formulario con nuevas propiedades y eventos, necesitamos un experto que cree formularios del nuevo tipo. El experto puede crearse en otro package, esta vez de tiempo de diseño, en el cual debemos además registrar el nuevo tipo de formulario a la medida. En la unidad DsgnIntf se define el siguiente método:
El tipo TCustomModuleClass es una referencia a clases derivadas de TCustomModule, también definida en DsgnIntf. Para registrar un formulario personalizado debemos llamar a este procedimiento dentro de un procedimiento denominado Register:
Pero podemos también definir una clase derivada de TCustomModule, si deseamos, por ejemplo, añadir comandos al menú de contexto del formulario:
GetVerbCount indica el número de comandos a añadir, GetVerb debe indicar el texto del comando, y ExecuteVerb debe redefinirse para ejecutar dichos comandos:
|
|
|
|