Ver Mensaje Individual
  #4  
Antiguo 08-02-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Reputación: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Troi
Tratando de buscar la solucion, he intentado todo eso que has dicho. (He agregao algunas cosas mas) y naena.
Porque me habré explicado como el culo.

A ver, supongamos el siguiente código fuente:

Código Delphi [-]
type
  TPanelEx = class(TPanel)
  private
    FPropiedad: string;
  public
    constructor Crear(propiedad: string);
  published
    property Propiedad: string read FPropiedad write FPropiedad;
  end;

implementation

{ TPanelEx }

constructor TPanelEx.Crear(propiedad: string);
begin
  Self.FPropiedad := propiedad;
  Self.Caption := ''; // Violación de acceso
end;
Ahí tenemos una clase que hereda de "TPanel" y añade una "Propiedad" a esta última. Ahora bien, en el constructor de la clase "TPanelEx"... ¿dónde se crea el propio "TPanel"? En ningún sitio, luego, si tratamos de acceder a la propiedad "Caption", que es de la clase "TPanel", obtendremos una violación de acceso muy linda.

¿Entonces? Pues tenemos que llamar al constructor de la clase "TPanel" desde el constructor de la clase "TPanelEx". Hasta aquí lo normal, pero, ¿qué ocurre con el constructor de "TPanel"? Pues que necesita un parámetro "Owner", de tipo "TComponent". Es decir, que no podría hacerse simplemente así:

Código Delphi [-]
constructor TPanelEx.Crear(propiedad: string);
begin
  inherited Create; // Este constructor no existe en "TPanel"
  Self.FPropiedad := propiedad;
  Self.Caption := ''; // Violación de acceso
end;
¿Y qué podemos hacer? Bien. Puesto que "TPanel" cuenta con un constructor que necesita un parámetro de tipo "TComponent", démosle ese parámetro a partir de uno en el constructor de "TPanelEx", más o menos así:

Código Delphi [-]
type
  TPanelEx = class(TPanel)
  private
    FPropiedad: string;
  public
    constructor Crear(AOwner: TComponent; propiedad: string);
  published
    property Propiedad: string read FPropiedad write FPropiedad;
  end;

implementation

{ TPanelEx }

constructor TPanelEx.Crear(AOwner: TComponent; propiedad: string);
begin
  inherited Create(AOwner);
  Self.FPropiedad := propiedad;
  Self.Caption := ''; // Ahora sí podemos acceder a "TPanel"
end;
¿Se entiende ahora mejor o sigo explicándome como el culo? Je, je, je.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita