Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-07-2006
Avatar de johurgi
johurgi johurgi is offline
Miembro
 
Registrado: jul 2006
Posts: 95
Poder: 18
johurgi Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 18-07-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Tienes que asignar el nuevo objeto creado a una variable:

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


Saludos...
Responder Con Cita
  #3  
Antiguo 18-07-2006
Avatar de johurgi
johurgi johurgi is offline
Miembro
 
Registrado: jul 2006
Posts: 95
Poder: 18
johurgi Va por buen camino
gracias marcos ya lo tengo solucionado
Responder Con Cita
  #4  
Antiguo 18-07-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 18-07-2006 a las 19:07:28.
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
Access Violation Carliviris Varios 5 12-05-2006 19:21:45
Problema con Quick report 'Access Violation at address 00575B9B in module' danielcordovahe Varios 3 13-05-2005 00:51:08
access violation chilenauta Impresión 15 15-12-2004 19:45:51
Access Violation ..... MADV01 Varios 2 24-03-2004 16:01:33
Access violation Giasl Varios 6 07-05-2003 12:35:51


La franja horaria es GMT +2. Ahora son las 07:33:13.


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