Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema de Access Violation (https://www.clubdelphi.com/foros/showthread.php?t=33832)

johurgi 18-07-2006 18:28:41

Problema de Access Violation
 
Buenas.

Soy nuevo en esto de delphi, y tengo un problemilla a la hora de acceder a los datos de una clase contenida dentro de una unidad.

Aqui os muestro el codigo.

Unit2(Clase TCuentaBancaria)
Código Delphi [-]
unit Unit2;
interface

type
  TCuentaBancaria = class(TObject)

  private
  TNumCuenta:string;
  TSaldoCta:currency;
  TTipoCuenta:string;
  public
  constructor Create(TNumCuenta:string;TSaldoCta:currency;TTipoCuenta:string);
  function Numero():string;
  function Saldo():currency;
  function Tipo():string;
  procedure Ver();
  
  end;

implementation
constructor TCuentaBancaria.Create(TNumCuenta:string;TSaldoCta:currency;TTipoCuenta:string);
begin
Self.TNumCuenta:=TNumCuenta;
Self.TSaldoCta:=TSaldoCta;
Self.TTipoCuenta:=TTipoCuenta;
end;

function TCuentaBancaria.Numero():string;
begin
result :=TNumCuenta
end;

function TCuentaBancaria.Saldo():currency;
begin
result := TSaldoCta
end;

function TCuentaBancaria.Tipo():string;
begin
result := TTipoCuenta
end;

procedure TCuentaBancaria.Ver();
begin
end;

end.

El formulario desde dondo accedo a la clase es el siguiente:
Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    MaskEdit1: TMaskEdit;
    MaskEdit2: TMaskEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    ComboBox1: TComboBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    function ValidarDatos():boolean;
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);

  private

  public
    
  end;

var
  Form1: TForm1;
  CB:TCuentaBancaria;
  TipoC:Array[1..2] of string;
  nc:string;
  sc:currency;
  tp:string;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
var
  i:integer;
begin
TipoC[1]:='Corriente';
TipoC[2]:='Ahorro';
for i:=1 to 2 do
  Form1.ComboBox1.Items.Add(TipoC[i]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Form1.ValidarDatos()=True then
begin
  TCuentaBancaria.Create(nc,sc,tp);
  //CB.Create(nc,sc,tp);
  ShowMessage('Cuenta bancaria creada');
end
  else ShowMessage('Datos mal introducidos');

end;
function TForm1.ValidarDatos():boolean;
begin
if Form1.MaskEdit1.Text <>'' then
  if Form1.MaskEdit2.Text <> '' then
    if Form1.ComboBox1.Text <> 'Tipo de Cuenta' then
    begin
    nc:=Form1.MaskEdit1.Text;
    sc:=strtocurr(Form1.MaskEdit2.Text);
    tp:=Form1.ComboBox1.Text;
    ValidarDatos :=True;
    end
    else ValidarDatos:=False
  else ValidarDatos:=False
else ValidarDatos:=False;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
try
ShowMessage(CB.Numero);
finally
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
try
ShowMessage(CurrToStr(CB.Saldo));
finally
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
try
ShowMessage(CB.Tipo)
finally
end;
end;

end.

Me da un error de access violation, cuando despues de crear el objeto "TCuentaBancaria" intento consultar alguno de los valores que le he introducido y no encuentro el porque me da ese error.

Si alguien me puede echar una mano se lo agradeceria.

Un saludo

maeyanes 18-07-2006 18:40:22

Tienes que asignar el nuevo objeto creado a una variable:

Código Delphi [-]
CB := TCuentaBancaria.Create(nc,sc,tp);


Saludos...

johurgi 18-07-2006 18:48:36

gracias marcos ya lo tengo solucionado

Lepe 18-07-2006 19:04:58

Solo hacer notar que el Standar es muy parecido al tuyo:
- Como norma general, a las variables privadas se le pone el mismo nombre pero con una "F" delante (private Field)
- En lugar de crear funciones y procedimientos, creamos Propiedades (property), ya que nos permiten ejecutar código al leer la propiedad (read) como al asignarle un valor (write) y además en una sóla línea de código tenemos todos los procedimientos que se relacionan con ella:
Código Delphi [-]
  property Tipo :String read GetTipoCta write SetTipoCta;
Tambien se suele añadir el prefijo "Get" cuando se quiere leer el valor de la propiedad, y usamos "Set" cuando es un procedimiento que asigna un valor a la propiedad.

Código Delphi [-]
unit Unit2;
interface

type
  TCuentaBancaria = class(TObject)

  private
  FNumero:string;
  FSaldoCta:currency;
  FTipoCta:string;
  protected
     function GetTipoCta: String;
     procedure SetTipoCta(Value:String);
  public
  constructor Create();
  property Numero:string read FNumCuenta write FNumCuenta;
  property Saldo :Currency read FSaldoCta write FSaldoCta;
  property Tipo :String read GetTipoCta write SetTipoCta;
  procedure Ver();
  
  end;

implementation
constructor TCuentaBancaria.Create();
begin
// no se debe pasar las propiedades al constructor;
// si son 40, ¿le pasas 40 parámetros al constructor?
FNumero := EmptyStr;
FSaldoCta := 0;
FTipoCta := EmptyStr;

end;

function TCuentaBancaria.GetTipoCta: String;
begin 
  result := FTipoCta;
end;

procedure SetTipoCta(Value:String);
begin 
  if Value <> FTipoCta then 
// Si el valor que se le quiere asignar (Value) es distinto 
// del que tenmos en nuestra variable privada ... entonces...
  begin
     FTipoCta := Value; // Guardamos el nuevo valor.
     // hacer algo mas
  end;  

procedure TCuentaBancaria.Ver();
begin
end;

end.

Saludos


La franja horaria es GMT +2. Ahora son las 10:09:26.

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