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 23-11-2011
Avatar de FairyLady
FairyLady FairyLady is offline
Registrado
NULL
 
Registrado: nov 2011
Ubicación: Argentina
Posts: 6
Poder: 0
FairyLady Va por buen camino
Constructores

Hola. Saludos a todos. Soy nueva en el foro, pero creo que estoy en el sector correcto, disculpen si no. Tengo una duda con respecto a los constructores de delphi. Es necesario declararlos en cada clase? O pueden usarse los Default que heredan de Tobject?. ( O de ser necesario solo en determinados casos,¿ En cuales?).

Yo no declare constructores en ninguna clase, Solo en el programa principal. Algo de este modo.

Código Delphi [-]
Procedure blabla();
Var
  Vclase1: Tclase1;
Begin 
  Vclase1:= Tclase1.create;
  (mas codigo)
End;

Pero haciendo esto, no me dio acceso a los componentes ni funciones de la clase. (Estan todas declaradas como public).

No tira errores, solo una advertencia de que cree un objeto de la clase, que no se uso.

Si alguno puede responderme, se lo agradesco muchisimo!!!
Saludos

Última edición por Neftali [Germán.Estévez] fecha: 23-11-2011 a las 17:13:22. Razón: Añadir TAG's al código
Responder Con Cita
  #2  
Antiguo 23-11-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.318
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Hola y bienvenida a los foros.
Te recomiendo que revises nuestra Guía de estilo.

Para que el código se lea bien, lo mejor es usar TAG's.

En cuanto a tu pregunta, una vez creado el objeto de la clase Tclase1, deberías poder acceder a los métodos de esa clase sin problemas:

Código Delphi [-]
Procedure blabla();
Var
  Vclase1: Tclase1;
Begin 
  Vclase1:= Tclase1.create;

  VClase1.metodo1;
  VClase1.funcion1(1, 'casa');

  (más código)

End;

Estando metodo1 y funcion1 definidos en la clase Tclase1.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 23-11-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
tengo una duda con respecto a los constructores de delphi. Es necesario declararlos en cada clase? O pueden usarse los Default que heredan de Tobject?.
Hola FairyLady.

Podés utilizar el constructor heredado o si necesitas inicializar algo en la creación de la instancia, podes definir el constructor para tu clase.
Pero siempre necesitarás crear una instancia de la clase antes de usarla.

Un ejemplo muy simple, si tenemos:
Código Delphi [-]
type
  TMiClase = class
  public
    a: Integer; 
  ...

var
  MClase: TMiClase;
begin
  MClase.a = 5; // error

  // lo correcto es
  MClase:= TMClase.Create;
  MClase.a:= 5;

Otro caso:
Código Delphi [-]
type
  TMiClase = class
  public
    a: Integer; 
    constructor Create(Value: Integer);
  ...

var
  MClase: TMiClase;
begin
  MClase:= TMiClase.Create; // error
  // lo correcto es
  MClase:= TMiClase.Create(6);

Para eso claro, debemos haber echo con anterioridad:
Código Delphi [-]
constructor TMClase.Create(Value: Integer);
begin
  a:= Value;
end;

Espero no haber sido muy enrredado...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 23-11-2011 a las 17:29:00.
Responder Con Cita
  #4  
Antiguo 23-11-2011
Avatar de FairyLady
FairyLady FairyLady is offline
Registrado
NULL
 
Registrado: nov 2011
Ubicación: Argentina
Posts: 6
Poder: 0
FairyLady Va por buen camino
Muy Buena informacion sobre los constructores! y muy clara. muchas gracias
Responder Con Cita
  #5  
Antiguo 23-11-2011
Avatar de FairyLady
FairyLady FairyLady is offline
Registrado
NULL
 
Registrado: nov 2011
Ubicación: Argentina
Posts: 6
Poder: 0
FairyLady Va por buen camino
Con respecto a esa parte de la pregunta, sigo teniendo el mismo problema . Tengo todo bien definido en la clase. Sin constructores. y al querer usar el constructor default, me crea el objeto, pero no me deja acceder a ningun atributo ni metodo. Pido disculpas por lo del codigo, de ahora en mas usare los TAG's.
Responder Con Cita
  #6  
Antiguo 23-11-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
al querer usar el constructor default, me crea el objeto, pero no me deja acceder a ningun atributo ni metodo.
Hola.

No entiendo bién lo que te sucede, ¿ Te arroja algún mensaje de error ? ¿ Podrías poner (en líneas generales) el código donde declaras la clase y donde intentas usarla ?

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 23-11-2011
Avatar de FairyLady
FairyLady FairyLady is offline
Registrado
NULL
 
Registrado: nov 2011
Ubicación: Argentina
Posts: 6
Poder: 0
FairyLady Va por buen camino
No. Ningun mensaje de error. Solo que no me deja acceder a los atributos de la vble. Ahi va el codigo

Código Delphi [-]
Type 

Tpaquete = class(TObject)
 Basico: real;
 Function SetTarifa():real;virtual;
 Function CalculaTarifa():real;virtual;Abstract;
end;

TPaqTerr = class(TPaquete)
 TarifaT: real;
 public
  Function Settarifa (): real; override;
 function Calculatarifa (): real; override;
 //constructor Create (eTarifa:Real); overload;
 end;

TPaqAereo = class (Tpaquete)
 TarifaA:real;
 function Settarifa(): real;override;
 function Calculatarifa():real;override;
End;

TpaqMaritimo =class (Tpaquete)
 TarifaM:real;
 function Settarifa():real;Override;
 function Calculatarifa():real;override;
End;

Esas son las declaraciones de clases y tipos. ( El constructor esta comentado ya que no estaba muy segura de como usarlo ni si era necesario).
Código Delphi [-]
Procedure TForm1.BtCalculaClick(Sender: TObject);
Var
Terrenal:Tobject;
begin

Terrenal:= Tpaqterr.create ();

Terrenal.   // aca es principalmente el problema, No accede a ningun atributo de la clase TPAQTERR. -(Tipo paquete terrestre)
Muchas gracias
Responder Con Cita
  #8  
Antiguo 23-11-2011
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
Terrenal debe sere declarado como TPaqterr o, en su defecto, debes hacer un moldeo:

Código Delphi [-]
TPaqterr(Terrenal)

// Saludos
Responder Con Cita
  #9  
Antiguo 23-11-2011
Avatar de FairyLady
FairyLady FairyLady is offline
Registrado
NULL
 
Registrado: nov 2011
Ubicación: Argentina
Posts: 6
Poder: 0
FairyLady Va por buen camino
En ves de Tobject , tipo tpaqterr, decis vos?
Responder Con Cita
  #10  
Antiguo 23-11-2011
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
Así es:

Código Delphi [-]
var
  Terrenal: Tpaqterr;

// Saludos
Responder Con Cita
  #11  
Antiguo 23-11-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Exáctamente.

Como te dijo roman, o haces:
Código Delphi [-]
var
  Terrenal:TObject;
begin
  // esto
  TPaqterr(Terrenal).Basico:= 0;
  // o esto
  (Terrenal as TPaqterr).TarifaT:= 1;

O si no, como también te dijo roman:
Código Delphi [-]
var
  Terrenal:TPaqterr;
begin
  Terrenal.Settarifa:= 5;
...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #12  
Antiguo 23-11-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.318
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por FairyLady Ver Mensaje
No. Ningun mensaje de error. Solo que no me deja acceder a los atributos de la vble. Ahi va el codigo
Digamos que para poder acceder a los métodos del objeto este debe estar definido según la clase correcta; Es decir, si cambias la definición de la variable por esta otra, verás como sí te aparecen los métodos:

Código Delphi [-]
Var
  Terrenal:Tpaqterr;
begin
  Terrenal:= Tpaqterr.create ();
  Terrenal.    

  ..Ahora sí te aparecerán

En el caso, de que quieras o necesites definir la variable como TObject, pero luego la crees de una clase en particular, para acceder a los métodos necesitas hacer un CAST, que es lo que Román te ha mostrado en su mensaje:

Código Delphi [-]
Var
  Terrenal:TObject;
begin
  Terrenal:= Tpaqterr.create ();
  Tpaqterr(Terrenal).    

  ..Ahora sí te aparecerán

También puedes usar esto:

Código Delphi [-]
Var
  Terrenal:TObject;
begin
  Terrenal:= Tpaqterr.create ();
  (Terrenal as Tpaqterr).    

  ..Ahora sí te aparecerán

Con eso le decimos al compilador que aunque hemos definido la variable Terrenal de tipo TObject, la queremos utilizar como tipo Tpaqterr (puesto que la hemos creado utilizando esta última clase.).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #13  
Antiguo 23-11-2011
Avatar de FairyLady
FairyLady FairyLady is offline
Registrado
NULL
 
Registrado: nov 2011
Ubicación: Argentina
Posts: 6
Poder: 0
FairyLady Va por buen camino
Todo funcionando muy bien! Muchas gracias a los 4!
Ahora tengo otra duda. Utilizar un constructor nos libera de utilizar los metodos SetAtributoy GetAtributo?
Responder Con Cita
  #14  
Antiguo 23-11-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Cita:
Utilizar un constructor nos libera de utilizar los metodos SetAtributo y GetAtributo?
Me parece que tenés una confusión, esos métodos, por el nombre, tienen pinta de ser usados para lectura y escritura de alguna propiedad. ¿ Como están declarados en la clase ?

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #15  
Antiguo 24-11-2011
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por FairyLady Ver Mensaje
Todo funcionando muy bien! Muchas gracias a los 4!
Ahora tengo otra duda. Utilizar un constructor nos libera de utilizar los metodos SetAtributoy GetAtributo?
Normalmente no.

Un caso típico de usar el constructor, es cuando proporcionas un valor por defecto a una propiedad:
Código Delphi [-]

TmiObjecto = class(TObject)
private
  Fmia: integer;
public
  constructor Create; override;
  property MiPropiedad:integer read Fmia write Fmia default 1;
end;

implementation

constructor TmiObjecto.Create;
begin
  Fmia := 1;
end;
Por defecto Delphi inicializará las variables de tipo integer a cero, si queremos que tenga un valor diferente, se suele hacer de esta forma y como ves, tiene poco que ver con los Get y Set. Ahora, al instanciar la clase, se inicializa a 1 la variable privada.

Además eso de "liberar de usar" creo no es apropiado, en realidad siempre tienes ventajas al usar el Get y Set porque puedes hacer operaciones adicionales a la simple asignación, de eso se trata....claro. Yo Normalmente empiezo con "read Fvar write Fvar" y al final siempre termino usando, al menos, el Set.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Sobrecarga de constructores vejerf OOP 2 06-06-2008 12:52:36
Como usar los formularios MDI, constructores de componentes Narlohe OOP 3 11-12-2006 10:54:10
constructores Dantael OOP 2 25-01-2004 23:57:50


La franja horaria es GMT +2. Ahora son las 02:16:15.


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