Delphi - Error de ejecución utilizando POO

 
Vista:

Error de ejecución utilizando POO

Publicado por Alfonso Sánchez (7 intervenciones) el 22/10/2005 12:09:47
Saludos a la lista

Estoy mirándome "la cara oculta de delphi 4", el libro en versión electrónica [1], y estoy probando a ver si consigo implementar una sencilla clase "TPersona". La cosa es que no he tenido problemas para definirla e implementarla (no me salen errores de compilacion) pero a la hora de ejecutar la aplicación me da el siguiente error:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 004042B0 in module 'Project1.exe'. Write of address 00000004'. Process stopped. User Step or Run to continue.

Al pulsar al botón de OK, la línea de ejecución se encuentra dentro del constructor que he implementado, marcando una llamada a un método de la clase (setEdad). El constructor es este:

constructor TPersona.Create (name : String; age : Integer);
Begin
setNombre (name);
setEdad (age);
End;

Pues el flujo del programa se para marcando la línea setEdad (age);

Tengo nociones de POO en C++ y la implementación de la clase TPersona la he llevado a cabo más o menos del mismo modo que haría en C++. ¿Alguien sabe en qué estoy fallando o cómo solucionarlo?

Para usar lo clase, me he creado una variable global "obj" a mi clase TPersona. He creado una instancia de la clase en el evento Show del formulario "Form1" y luego, en el evento de un botón "Button1", he mostrado el contenido de los datos miembro de mi clase TPersona. Luego, en el evento Close del formulario, he llamado al método Free de obj para liberar memoria. Por si sirviera de aclaración, aquí pongo el código de la Unit1 donde esta todo:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TPersona = class (TObject)
public
constructor Create (name : String; age : Integer);
procedure setNombre (name : String);
procedure setEdad (age : Integer);
function getNombre : String;
function getEdad : Integer;
private
nombre : String;
edad : Integer;
End;

var
Form1: TForm1;
obj : TPersona;

implementation

constructor TPersona.Create (name : String; age : Integer);
Begin
setNombre (name);
setEdad (age);
End;

Procedure TPersona.setNombre (name : String);
Begin
nombre := name
End;

Procedure TPersona.setEdad (age : Integer);
Begin
edad := age
End;

Function TPersona.getNombre : String;
Begin
getNombre := nombre
End;

Function TPersona.getEdad : Integer;
Begin
getEdad := edad
End;

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
obj.Create('Perico de los Palotes', 17)
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
obj.Free
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage (obj.getNombre + ', ' + IntToStr (obj.getEdad))
end;

end.

-----

Espero alguien pueda echarme una mano. Un saludo

[1] Si alguien no lo conoce todavía, este libro se puede encontrar en: http://www.marteens.com/CaraOculta.htm
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Error de ejecución utilizando POO

Publicado por M@rceloL (213 intervenciones) el 22/10/2005 18:04:26
Creo que se debe a que el objeto debe ser creado así:

En vez de:

obj.Create('Perico de los Palotes', 17)

Debería ser:

Obj:=TPersona.Create('Perico de los Palotes',17);

Es similar a lo que uno hace en C++: Obj=new TPersona('Perico de los Palotes',17);

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Solucionado (gracias :))

Publicado por Alfonso Sánchez (7 intervenciones) el 23/10/2005 02:07:43
Hola M@rceloL. Diste en el clavo jeje, ¡gracias! En el libro que comento aparecía del modo que puse (y declarando la variable objeto dentro del evento click del botón, por ejemplo, si funcionaba así)

Un saludo ;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar