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
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


0