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 31-05-2010
rodrigo881215 rodrigo881215 is offline
Registrado
 
Registrado: may 2010
Posts: 2
Poder: 0
rodrigo881215 Va por buen camino
Exclamation problemas al crear objetos en delphi

Hola que tal, soy nuevo en esto de programar con delphi y me dejaron un proyecto de de cajero automatico. El trabajo consiste en pasar un cajero hecho en builder a delphi, el problema es que me marca errores en tiempo de ejecucion, marca un Access Violation, pienso que el problema puede ser que no estoy creando bien los objetos de mi clases o que no estan bien declarados, tambien en builder uso la clase vector para almacenar datos no se si alla una parecida en delphi, la que encontre es TList, pero haber si me recomienda otra. Aqui les anexo parte del codigo que creo que es el problema. Espera me puedan ayudar y me respondan pronto. Gracias.

Código Delphi [-]
unit UBaseDatosBanco;

interface

uses
   Classes, UCuenta, Forms;

type
   //cuentas = TList;
   BaseDatosBanco = class (TObject)
   public
      constructor Create;
      function autenticarUsuario(numeroCuentaUsuario, nipUsuario: Integer): Boolean;
      function obtenerSaldoDisponible(numeroCuentaUsuario: Integer): Double;
      function obtenerSaldoTotal(numeroCuentaUsuario: Integer): Double;
      procedure abonar(numeroCuentaUsuario: Integer; monto: Double);
      procedure cargar(numeroCuentaUsuario: Integer; monto: Double);
   private
      //cuentas: TList;
      function obtenerCuenta(numeroCuenta: Integer): Cuenta;
   end;

var
   cuentas: TList;
   cuentaUsuarioPtr: Cuenta;
   cuenta1, cuenta2, cuenta3: Cuenta;

implementation

constructor BaseDatosBanco.Create;
begin
   //inherited Create;
   cuentas := TList.Create;
   cuenta1 := Cuenta.Create(12345, 54321, 1000.0, 1200.0);
   cuenta2 := Cuenta.Create(98765, 56789, 200.0, 200.0);
   cuenta3 := Cuenta.Create(69, 96, 1800.0, 2000.0);
   cuentas.Add(cuenta1);
   cuentas.Add(cuenta2);
   cuentas.Add(cuenta3);
end;

function BaseDatosBanco.obtenerCuenta(numeroCuenta: Integer): Cuenta;
var
   i: Integer;
begin
   for i := 0 to 2 do
   begin
      if ((Cuenta(cuentas.Items[i]).obtenerNumeroCuenta) = numeroCuenta) then
         obtenerCuenta := Cuenta(cuentas.Items[i]);
         //Application.MessageBox(Cuenta(cuentas.Items[i]), "", 0);
   end;
   obtenerCuenta := nil;
end;

function BaseDatosBanco.autenticarUsuario(numeroCuentaUsuario, nipUsuario: Integer): Boolean;
{var
 cuentaUsuarioPtr: Cuenta;}
begin
   cuentaUsuarioPtr := obtenerCuenta(numeroCuentaUsuario);
   if (cuentaUsuarioPtr <> nil) then autenticarUsuario := cuentaUsuarioPtr.validarNip(nipUsuario)
   else
      autenticarUsuario := false
end;

function BaseDatosBanco.obtenerSaldoDisponible(numeroCuentaUsuario: Integer): Double;
begin;
   cuentaUsuarioPtr := obtenerCuenta(numeroCuentaUsuario);
   obtenerSaldoDisponible := cuentaUsuarioPtr.obtenerSaldoDisponible;
end;

function BaseDatosBanco.obtenerSaldoTotal(numeroCuentaUsuario: Integer): Double;
begin
   cuentaUsuarioPtr := obtenerCuenta(numeroCuentaUsuario);
   obtenerSaldoTotal := cuentaUsuarioPtr.obtenerSaldoTotal;
end;

procedure BaseDatosBanco.abonar(numeroCuentaUsuario: Integer; monto: Double);
begin
   cuentaUsuarioPtr := obtenerCuenta(numeroCuentaUsuario);
   cuentaUsuarioPtr.abonar(monto);
end;

procedure BaseDatosBanco.cargar(numeroCuentaUsuario: Integer; monto: Double);
begin
   cuentaUsuarioPtr := obtenerCuenta(numeroCuentaUsuario);
   cuentaUsuarioPtr.cargar(monto);
end;

end.

Última edición por rgstuamigo fecha: 31-05-2010 a las 23:57:52. Razón: Estética en el código
Responder Con Cita
  #2  
Antiguo 31-05-2010
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
No sé si será el origen de tu error, pero creo que el error está en la función

Código Delphi [-]
function BaseDatosBanco.obtenerCuenta(numeroCuenta: Integer): Cuenta;
var
i: Integer;
begin
for i := 0 to 2 do
begin
if ((Cuenta(cuentas.Items[i]).obtenerNumeroCuenta) = numeroCuenta) then
obtenerCuenta := Cuenta(cuentas.Items[i]);
//Application.MessageBox(Cuenta(cuentas.Items[i]), "", 0);
end;
obtenerCuenta := nil;
end;

ya que aquí no pasa como en C, que cuando asignas el valor de la función, ésta termina. En Delphi, "obtenerCuenta" es una variable más (a mí me gusta sustituirla por "Result", que referencia lo mismo y sirve para todos los nombres de funciones) y no por darle un valor fuerza el fin de la función. Deberías añadir un Exit dentro del if cuando asignas el valor de obtenerCuenta.
No me he fijado en el resto de funciones, pero si haces cosas similares, es posible que también te haya sucedido.

De hecho, si en lugar de hacer "Compile" haces "Build" el compilador te generará un Warning diciéndote que el valor asignado a obtenerCuenta no se utiliza nunca. Es por esto, porque al final es sobreescrito por nil.

Otra cosa, por convenio, todos los objetos, clases, etc en Delphi empiezan con T. Por tanto tu clase deberías renombrarla a TCuenta (sólo es por convenio, no es obligatorio, pero así podrás diferenciar clases de interfaces que empiezan por I y de punteros a clases que empiezan por P).

Espero haberte ayudado,
Un saludo,
LoPiTaL
Responder Con Cita
  #3  
Antiguo 01-06-2010
rodrigo881215 rodrigo881215 is offline
Registrado
 
Registrado: may 2010
Posts: 2
Poder: 0
rodrigo881215 Va por buen camino
Exclamation

Gracia por responderme y por la ayuda, pero el error persiste, pienso que puede ser por no se crean bien los objetos, esa clase que puse la llamo desde mi clase principal donde esta el formulario, colo esto en el contructor baseDatosBanco := BaseDatosBanco.Create

De esa manera intento cargar las cuentas en memoria para que esten almacenadas en el TList.

Espero puedan ayudarme
Responder Con Cita
  #4  
Antiguo 01-06-2010
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Ok, voy a seguir planteándote cosas, y ya nos vas diciendo... a priori no veo ningún otro error, salvo cosas que veo que no son muy correctas y tal vez te lleven al final al error:

Código Delphi [-]
var
   cuentas: TList;
   cuenta1, cuenta2, cuenta3: Cuenta;

Estas variables deberían estar declaradas dentro de la clase BaseDatosBanco, y no como globales, ya que si creas más de una instancia de BaseDatosBanco se te recrearán y se quedarán sin liberar.
Si las quieres globales NO las debes crear dentro del constructor de la clase, sino deberías crearlas y liberarlas en un bloque initialization / finalization, que se ejecutan al cargar / descargar la unit en cuestión, sin necesidad de crear una instancia de nadie.
Código Delphi [-]
   cuentaUsuarioPtr: Cuenta;

Ésta otra variable debería ser local en cada función, ya que sólo la utilizas como auxiliar...

Cita:
esa clase que puse la llamo desde mi clase principal donde esta el formulario, colo esto en el contructor baseDatosBanco := BaseDatosBanco.Create
No sé hasta qué punto sea correcto (y seguro) llamarle de la misma forma a la variable que a la clase (otra razón más para añadirle la T al principio del nombre de la clase). Recuerda que Delphi no es case sensitive.

Bueno, a priori no se me ocurre nada más. Si alguien tiene alguna sugerencia más sería interesante que la plantease.

Un saludo,
LoPiTaL
Responder Con Cita
  #5  
Antiguo 01-06-2010
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.278
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 rodrigo881215 Ver Mensaje
Gracia por responderme y por la ayuda, pero el error persiste, pienso que puede ser por no se crean bien los objetos, esa clase que puse la llamo desde mi clase principal donde esta el formulario, colo esto en el contructor baseDatosBanco := BaseDatosBanco.Create

De esa manera intento cargar las cuentas en memoria para que esten almacenadas en el TList.
Normalmente los errores de este tipo suelen ser por problemas con objetos mal creados o mal destruídos como tú dices.
Estaría bien, que ejecutes tu programa paso a paso y nos diferas en qué línea te marca o te salta el error. A partir de ahí podemos seguir investigando.

Si es en los create:
Código Delphi [-]
cuenta1 := Cuenta.Create(12345, 54321, 1000.0, 1200.0);
Habrá que ver cómo es el constructor de la 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
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
Crear Objetos en tiempo de ejecucion mmtaffarel OOP 8 14-01-2024 17:55:25
Crear objetos en tiempo de corrida Cheswar Varios 4 05-09-2007 09:41:11
Problema al momento de crear objetos DANY OOP 5 28-11-2005 10:28:05
Quiero crear objetos en tiempo de ejecución con IntraWeb en Delphi 7 atirado OOP 3 11-03-2004 23:06:31
crear objetos Javier PLatas OOP 6 10-06-2003 13:55:31


La franja horaria es GMT +2. Ahora son las 19:39:10.


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