PDA

Ver la Versión Completa : Problema con herencia


Decker
04-04-2007, 14:38:47
Hola compañeros, queria añadir una propiedad published a un formulario, para ello público la propiedad antes declarada en un antecesor.


Antecesor (abuelo):

type
TBoton=(Uno, Dos, Tres);
TBotones=set of TBoton;
TForm1 = class(TForm)
private
{ Private declarations }
FBotones: TBotones;
procedure WBotones(Value: TBotones);
protected
property Botones: TBotones read FBotones write WBotones;
public
{ Public declarations }
end;

procedure TForm1.WBotones(Value: TBotones);
begin
FBotones:=Value;
end;

PreAntecesor(Padre):

type
TForm2 = class(TForm1)
private
{ Private declarations }
public
{ Public declarations }
published
property Botones;
end;

Form en cuestión:

type
TForm3 = class(TForm2)
private
{ Private declarations }
public
{ Public declarations }
end;


Si hago lo mismo con TPanels, en la barra de propiedades (F11), me aparece una nueva Propiedad del tipo Set, si lo hago con formularios, no funciona. ¿Alguien sabe el porque?

roman
04-04-2007, 15:08:58
No funciona porque debes registrar la nueva clase de formulario con el IDE para que la reconozca el inspector de objetos. El procedimiento viene explicado en gexperts (http://www.gexperts.org). En la sección Open Tools FAQ (http://www.gexperts.org/opentools/), busca el apartado "How can I add published properties to a TForm descendent?"

// Saludos

Decker
04-04-2007, 15:25:38
Ya habia leido ese artículo, pero no es muy explicativo. Mi reino por un ejemplo.

roman
04-04-2007, 16:41:08
Bueno, ahi va paso a paso, según acabo de hacerlo:


Creas tu formulario en el IDE y agregas la propiedad deseada. Por ejemplo:



type
TrmForm = class(TForm)
private
FAuthor: String;
published
property Author: String read FAuthor write FAuthor;
end;




Guardas el formulario, digamos en urmform.pas.


Agregas el formulario al repositorio (menú contextual del formulario|Add to Repository...)


Creas un paquete de ejecución (Runtime only), digamos rmforms.dpk, al que agregas el formulario (es decir, agregas urmform.pas en la sección Contains). Compilas y guardas el paquete.


Creas un paquete de diseño (Designtime only), digamos rmformsdesign.dpk, al que agregas los paquetes designide y rmforms en la sección Requires (simplemente seleccionas la sección, oprimes el botón Add y escribes designide y repites para rmforms). designide es parte de Delphi y rmforms es el paquete de ejecución que acabas de crear.


Creas una nueva unidad, digamos urmformsreg.pas en el paquete de diseño (File|New|Unit) que se verá así:



unit urmformsreg;

interface

procedure Register;

implementation

uses
urmforms, DesignIntf, DesignEditors;

procedure Register;
begin
RegisterCustomModule(TrmForm, TCustomModule);
end;

end.




Compilas, instalas y guardas el paquete.


Con esto debe bastar. Para usar un fomulario de éstos, recuerda que debes heredar (opción inherit en el repositorio).

// Saludos

roman
24-04-2007, 03:58:31
Mi reino por un ejemplo.

¿Y bien?, ¿donde está el reino?

;) :p :D

// Saludos

roman
02-06-2007, 01:04:19
¿Nada aún?

:( :rolleyes: :cool:

pablonill
06-09-2012, 01:24:09
Fantastico roman, cuando junte plata para un reino te lo regalo!

roman
06-09-2012, 03:39:21
Ja, ja. Gracias. Algo es algo :) :D

// Saludos

pablonill
06-09-2012, 14:35:38
Hola roman, antes que nada muchas gracias por el ejemplo!, muy practico y entendible!, te hago una consulta. Aplique el ejemplo y todo perfecto, pero como hago para que el dfm aparezca en el formulario que heredo, ya que en tiempo de diseño no aparecen los controles que puse en el formulario padre, pero si aparecen en tiempo de ejecución. Muchas gracias.

roman
06-09-2012, 17:13:59
Mmm. Creo que eso tiene que ver con esto que comentan en el enlace que puse en el mensaje #2:


Note that the IDE will not allow you to add both published properties and components to a custom module at the same time. The workaround is to create a form with your custom properties in a package, and then have a descendent form in the repository which adds the components you want there by default.


// Saludos