Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-11-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 17
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Los Access Violations no son muchas las posibilidades:

Código Delphi [-]
procedure Foo;
var
  bla: TAlgunaClase;
begin
  // el objeto no fue inicializado.. en realidad en estos casos puede pasar "cualquier cosa"
  // ya que bla es un puntero a alguna zona de memoria que vaya uno a saber que tiene
  bla.AlgunMetodo; // EAccesViolation es lo mas "normal"

  bla := TAlgunaClase.Create;
  bla.AlgunMetodo; // todo bien
  bla.Free;
  bla.AlgunMetodo; // EAccesViolation, porque se libero la memoria a la que apuntaba bla

  bla := nil;
  bla.AlgunMetodo; // EAccesViolation
end;

El depurador no te lleva a la linea que produce la excepcion? la forma mas sencilla de rastrearlo es con un depurador. Revisa los destructores. Revisa el codigo que no acceda a cosas que no fueron creadas/hayan sido liberada de memoria. Pon puntos de ruptura y sigue paso a paso. Mira hasta donde llega el programa y donde se rompe
Responder Con Cita
  #2  
Antiguo 12-11-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 17
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Para aportar mas al hilo:

Código Delphi [-]
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TAlgunaClase = class
  public
    procedure MetodoNormal;
    procedure MetodoVirtual; virtual;
    procedure MetodoConstante;
    procedure MetodoConstanteVirtual; virtual;
  end;

procedure TAlgunaClase.MetodoConstante;
begin
  Writeln('Metodo Constante: Hola mundo');
end;

procedure TAlgunaClase.MetodoConstanteVirtual;
begin
  Writeln('MetodoConstanteVirtual: Hola mundo virtual');
end;

procedure TAlgunaClase.MetodoNormal;
begin
  Writeln('MetodoNormal: ' + QualifiedClassName);
end;

procedure TAlgunaClase.MetodoVirtual;
begin
  Writeln('MetodoVirtual: ' + QualifiedClassName);
end;

var
  Foo: TAlgunaClase;
begin
  try
    try
      Foo.MetodoNormal; // EAccessViolation
    except
      Writeln('Fallo Foo.MetodoNormal')
    end;

    try
      Foo.MetodoVirtual; // EAccessViolation
    except
      Writeln('Fallo Foo.MetodoVirtual')
    end;

    try
      Foo.MetodoConstante; // este no falla
    except
      Writeln('Fallo Foo.MetodoConstante')
    end;

    try
      Foo.MetodoConstanteVirtual; // EAccessViolation
    except
      Writeln('Fallo Foo.MetodoConstanteVirtual')
    end;
  finally
    Readln;
  end;
end.

Interesante que invocar a un metodo constante sobre una instancia nil o con basura no eleve una excepcion. Con metodo constante me refiero a que no utiliza informacion interna del objeto como en el ejemplo
Responder Con Cita
  #3  
Antiguo 12-11-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 17
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Y este es el caso mas oscuro de todos

Código Delphi [-]
var
  Foo: TAlgunaClase;
begin
  Foo := TAlgunaClase.Create;
  Foo.Free;
  try
    Foo.MetodoNormal;
    Foo.MetodoVirtual;
    Foo.MetodoConstante;
    Foo.MetodoConstanteVirtual;
  finally
    Readln;
  end;
end.

Salida:

Código:
MetodoNormal: Project1.TAlgunaClase
MetodoVirtual: Project1.TAlgunaClase
Metodo Constante: Hola mundo
MetodoConstanteVirtual: Hola mundo virtual
Responder Con Cita
  #4  
Antiguo 12-11-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.070
Poder: 32
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por AgustinOrtu Ver Mensaje
Y este es el caso mas oscuro de todos

Código Delphi [-]
var
  Foo: TAlgunaClase;
begin
  Foo := TAlgunaClase.Create;
  Foo.Free;
  try
    Foo.MetodoNormal;
    Foo.MetodoVirtual;
    Foo.MetodoConstante;
    Foo.MetodoConstanteVirtual;
  finally
    Readln;
  end;
end.

Salida:

Código:
MetodoNormal: Project1.TAlgunaClase
MetodoVirtual: Project1.TAlgunaClase
Metodo Constante: Hola mundo
MetodoConstanteVirtual: Hola mundo virtual

jejeje caramba, no me imaginé que esto sucediera, ya estaba sorprendido con el primer caso donde MetodoConstante funcionaba y ahora esto... vaya oscuridad
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #5  
Antiguo 12-11-2016
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Interesante cuanto menos...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 13-11-2016
rmendoza83 rmendoza83 is offline
Miembro
 
Registrado: ago 2006
Posts: 50
Poder: 20
rmendoza83 Va por buen camino
Cita:
Empezado por AgustinOrtu Ver Mensaje
Los Access Violations no son muchas las posibilidades:

Código Delphi [-]
procedure Foo;
var
  bla: TAlgunaClase;
begin
  // el objeto no fue inicializado.. en realidad en estos casos puede pasar "cualquier cosa"
  // ya que bla es un puntero a alguna zona de memoria que vaya uno a saber que tiene
  bla.AlgunMetodo; // EAccesViolation es lo mas "normal"

  bla := TAlgunaClase.Create;
  bla.AlgunMetodo; // todo bien
  bla.Free;
  bla.AlgunMetodo; // EAccesViolation, porque se libero la memoria a la que apuntaba bla

  bla := nil;
  bla.AlgunMetodo; // EAccesViolation
end;

El depurador no te lleva a la linea que produce la excepcion? la forma mas sencilla de rastrearlo es con un depurador. Revisa los destructores. Revisa el codigo que no acceda a cosas que no fueron creadas/hayan sido liberada de memoria. Pon puntos de ruptura y sigue paso a paso. Mira hasta donde llega el programa y donde se rompe

Gracias por la respuesta! Realmente es lo que hago! pero no encuentro el problema! pero es como digo que el codigo funciona bien en otros modulos pero ese en particular no! le echaste un ojo a los codigos? muy complejos?
Responder Con Cita
  #7  
Antiguo 14-11-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 17
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Simplemente a ojo es imposible depurarlo. Debes ir paso a paso y usar el depurador de Delphi! El mismo te dice en que linea ocurren los errores, y podes ir instruccion por instruccion siguiendo la ejecucion.

Yo probaria poner puntos de ruptura en los eventos de los controles, a ver si cuando cierras el form se dispara alguno (por ejemplo algunos de los OnExit) y hace uso de memoria no asignada
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
error raro 11_8_88 C++ Builder 1 03-12-2008 20:37:01
error raro en firebird leo_037 Firebird e Interbase 10 03-02-2008 19:22:23
Un error raro..... Rafe Varios 3 28-07-2005 23:07:02
un error un poco raro merlin Conexión con bases de datos 2 19-07-2004 12:45:06


La franja horaria es GMT +2. Ahora son las 06:56:42.


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
Copyright 1996-2007 Club Delphi