Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-02-2006
modulay modulay is offline
Miembro
 
Registrado: feb 2006
Posts: 46
Poder: 0
modulay Va por buen camino
Unhappy constructor...propiedad heredada

Pues tengo definido un constructor para una clase que hereda de TPanel,y al intentar inicializar alguna de las propiedades heredadas me da error

Código Delphi [-]

unit Tbarco;

interface

uses
  Types, ExtCtrls, Classes, Controls;

type
  Tbarco1 = class(TPanel)
private
  dim : integer;
  vert : boolean;
  pro,pop : TPoint;
public
  property dimension : integer read dim write dim;
  property vertical : boolean read vert write vert;
  property proa : TPoint read pro write pro;
  property popa : TPoint read pop write pop;
  constructor crear(dimens,x,y,ancho,alto : integer);
end;


implementation

  constructor Tbarco1.crear(dimens,x,y,ancho,alto : integer);
  begin
    self.vert := false;
    self.dim := dimens;
    self.caption := '';   // propiedad de TPanel
    self.pro := Point(0,0);
    self.pop := Point(0,0);
  end;

end.

La llamada al constructor...

Código Delphi [-]

b := Tbarco1.crear(2,2,2,2,2);

¿es que no se puede hacer ó es q lo estoy haciendo mal?
Gracias
Responder Con Cita
  #2  
Antiguo 08-02-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Siempre que escribas en el Foro diciendo que te aparece un determinado error, por favor, especifica cuál es el mismo, puesto que de ese modo contribuirás a la posible solución que pueda ofrecérsete.

Creo que el error que tienen, en este caso, debe ser un "Access Violation", porque, tú tienes una clase que hereda de "TPanel" e implementas un constructor para tu clase, pero, ¿qué pasa con "TPanel"? Estás tratando de acceder a la propiedad de un objeto que no fue creado aún.

No tengo Delphi ahora mismo a mano, pero, prueba a llamar en el constructor de tu clase al constructor de "TPanel", más o menos así:

Código Delphi [-]
constructor Tbarco1.crear(dimens,x,y,ancho,alto : integer);
begin
  inherited Create;
  self.vert := false;
  self.dim := dimens;
  self.caption := '';   // propiedad de TPanel
  self.pro := Point(0,0);
  self.pop := Point(0,0);
end;
Pero, tal como lo expongo tampoco funcionará, porque creo recordar que "TPanel" necesita un "Owner" en su contructor, de tal modo que tendrías que proporcionárselo, ora lo incluyas como parámetro en tu constructor, ora le pases un "nil" como "Owner". Si haces esto último asegúrate de liberar objeto y el "TPanel" en un destructor de tu "TBarco", por ejemplo.

Aún así (disculpa que me enrolle tanto) es posible que no te funcione pasar un "nil" como "Owner" del "TPanel". No lo sé ahora mismo. No lo recuerdo. Prueba a ver, de todos modos y nos dices qué tal.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 08-02-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos

Cita:
Empezado por dec
Pero, tal como lo expongo tampoco funcionará, porque creo recordar que "TPanel" necesita un "Owner" en su contructor, de tal modo que tendrías que proporcionárselo, ora lo incluyas como parámetro en tu constructor, ora le pases un "nil" como "Owner". Si haces esto último asegúrate de liberar objeto y el "TPanel" en un destructor de tu "TBarco", por ejemplo.
Tratando de buscar la solucion, he intentado todo eso que has dicho. (He agregao algunas cosas mas) y naena.
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #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
Poder: 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
  #5  
Antiguo 08-02-2006
modulay modulay is offline
Miembro
 
Registrado: feb 2006
Posts: 46
Poder: 0
modulay Va por buen camino
Gracias a los dos.
La solución que ha propuesto dec me funciona bien.

Código Delphi [-]

 constructor Tbarco1.crear(dimens,x,y,ancho,alto : integer);
  begin
    inherited Create(nil);
    self.vert := false;
    self.dim := dimens;
    self.caption := '';
    self.Width := 20;
    self.Height := 20;
    self.pro := Point(0,0);
    self.pop := Point(0,0);
  end;

Esa explicación me aclara,creo,algunas cosillas
Por lo que voy entendiendo,la necesidad de destruir "a mano" el TPanel creado se hace patente al no tener por ejemplo un owner de tipo Tform que destruya todos sus objetos contenidos cuando lo cerramos ¿es correcto?
Todo esto sería automático si el objeto contenido fuera por ejemplo un atributo del objeto contenedor,tanto creación como destrucción ¿no?
Responder Con Cita
  #6  
Antiguo 08-02-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por modulay
Por lo que voy entendiendo,la necesidad de destruir "a mano" el TPanel creado se hace patente al no tener por ejemplo un owner de tipo Tform que destruya todos sus objetos contenidos cuando lo cerramos ¿es correcto?
Así es. Es correcto.

Cita:
Empezado por modulay
Todo esto sería automático si el objeto contenido fuera por ejemplo un atributo del objeto contenedor,tanto creación como destrucción ¿no?
Ahí me pierdo y no sé qué decirte. Puede que no llegue a tanto. Tal vez es que no te entendí bien.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 08-02-2006
modulay modulay is offline
Miembro
 
Registrado: feb 2006
Posts: 46
Poder: 0
modulay Va por buen camino
Me refiero a lo siguiente:
Ahora mi clase tiene un atributo Timage:

Código Delphi [-]

unit Tbarco;

interface

uses
  Types, ExtCtrls, Classes, Controls;

type
  Tbarco1 = class(TPanel)
private
  dim : integer;
  vert : boolean;
  pro,pop : TPoint;
  imagen : Timage;
public
  property dimension : integer read dim write dim;
  property vertical : boolean read vert write vert;
  property proa : TPoint read pro write pro;
  property popa : TPoint read pop write pop;
  constructor crear(dimens,x,y,ancho,alto : integer);
end;


implementation

  constructor Tbarco1.crear(dimens,x,y,ancho,alto : integer);
  begin
    inherited Create(nil);
    self.vert := false;
    self.dim := dimens;
    self.pro := Point(0,0);
    self.pop := Point(0,0);
    self.Width := ancho;
    self.Height := alto;
    self.Left := x;
    self.Top := y;
    self.AutoSize := true;
    self.caption := '';
    self.Cursor := crHandPoint;
  end;

end.

Tal y como está implementado el tema,si yo llamo a barco.crear(x,x,x,x,x) ¿se llama automáticamente al constructor de imagen?
Responder Con Cita
  #8  
Antiguo 08-02-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Tal y como está implementado el tema,si yo llamo a barco.crear(x,x,x,x,x) ¿se llama automáticamente al constructor de imagen?
No. Es todo lo contrario. Debes crear el objeto "TImage" en el constructor de tu clase y encargarte de destruirlo en el destructor de tu clase.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #9  
Antiguo 08-02-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
O bien, simplemente pasarle el mismo panel al constructor del TImage y dejar que él se encargue de su destrucción. Aunque por otro lado, no estoy seguro de si es un TImage lo que realmente requiere o le bastaría un TPicture.

// Saludos
Responder Con Cita
  #10  
Antiguo 08-02-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Cita:
Empezado por modulay
...
Código Delphi [-]
...
...
  constructor Tbarco1.crear(dimens,x,y,ancho,alto : integer);
  begin
    inherited Create(nil);
    self.vert := false;
    self.dim := dimens;
    self.pro := Point(0,0);
    self.pop := Point(0,0);
    self.Width := ancho;
    self.Height := alto;
    self.Left := x;
    self.Top := y;
self.caption := '';
end;
end.
...
Que extra~o, habia hecho "casi" exactamente esto y no me funciono. Seguro me "comi" algo

Saludos
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #11  
Antiguo 08-02-2006
modulay modulay is offline
Miembro
 
Registrado: feb 2006
Posts: 46
Poder: 0
modulay Va por buen camino
Ok!!
Dudas resueltas
Gracias amigos
Responder Con Cita
  #12  
Antiguo 08-02-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por vtdeleon
Que extra~o [...] Seguro me "comi" algo
Por lo pronto las eñes.

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:19:52.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi