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 06-04-2006
zvf zvf is offline
Miembro
 
Registrado: abr 2006
Posts: 158
Poder: 19
zvf Va por buen camino
Error Abstract Error y Access violation

Hola!

Yo ya les habia escrito antes para platicarles sobre estos dos errores que me ocurrian, y estuvieron revisando parte de mi codigo, hice todos los movimientos que me indicaron y no los he podido resolver.

Yo he continuado programando el resto del sistema, ignorando esos errores, pero de todas formas, lo reviso y no se como quitarselos, no veo el problema en mi codigo.

Y lo que pasa es que realiza absolutamente todas las lineas de codigo de manera correcta, y antes del end; manda el error. Y es variable, algunas veces manda el error Abstract y otras el Access violation, por eso no puedo ubicar en donde pasa, porque lo manda una linea antes de que termine la ejecucion.

Como me urge entregar el sistema la proxima semana, quiero ver la forma de ocultar esos errores, para poderlo entregar y con mas calma despues revisar el codigo, aunque nose como porque ya lo he revisado.

Pero lo he puesto con excepciones y no cacha esos errores.

¿Saben como puedo hacerle?

Si saben como ocultarlos me ayudaria mucho, porque en verdad el programa funciona muy bien, no se interrumpe con esos errores ni causa problemas.

MUCHAS GRACIAS!!

Última edición por zvf fecha: 06-04-2006 a las 20:36:59.
Responder Con Cita
  #2  
Antiguo 07-04-2006
samantha jones samantha jones is offline
Miembro
 
Registrado: ago 2004
Posts: 46
Poder: 0
samantha jones Va por buen camino
A mi me ocurria cuando estaba usando un metodo virtual en una clase heredada y aun no lo habia definido. Espero y te ayude.

Saludos
Responder Con Cita
  #3  
Antiguo 07-04-2006
zvf zvf is offline
Miembro
 
Registrado: abr 2006
Posts: 158
Poder: 19
zvf Va por buen camino
Gracias. Pero yo no uso metodos virtuales, ni clases heredadas, todo esta en una misma unit.
Responder Con Cita
  #4  
Antiguo 07-04-2006
reina reina is offline
Miembro
 
Registrado: ago 2005
Ubicación: Capital Federal-La Plata (Bs As)
Posts: 147
Poder: 19
reina Va por buen camino
Holaaa mira no vi tu hilo donde comentas tus errores, pero lo que si te puedo ecir es que tu programa bien no debe funcionar ya que un acces violation es un acceso invalido a memoria..
Te escribo una lista de excepciones a ver si te sirven, estas las podrias cachar ahi! :
Exception Base class

EAbort Abort without dialog
EAbstractError Abstract method error
AssertionFailed Assert call failed
EBitsError Boolean array error
ECommonCalendarError Calendar calc error
EDateTimeError DateTime calc error
EMonthCalError Month calc error
EConversionError Raised by Convert
EConvertError Object convert error
EDatabaseError Database error
EExternal Hardware/Windows error
EAccessViolation Access violation
EControlC User abort occured
EExternalException Other Internal error
EIntError Integer calc error
EDivByZero Integer Divide by zero
EIntOverflow Integer overflow
ERangeError Out of value range
EMathError Floating point error
EInvalidArgument Bad argument value
EInvalidOp Inappropriate operation
EOverflow Value too large
EUnderflow Value too small
EZeroDivide Floating Divide by zero
EStackOverflow Severe Delphi problem
EHeapException Dynamic memory problem
EInvalidPointer Bad memory pointer
EOutOfMemory Cannot allocate memory
EInOutError IO error
EInvalidCast Object casting error
EInvalidOperation Bad component op
EMenuError Menu item error
EOSError Operating system error
EParserError Parsing error
EPrinter Printer error
EPropertyError Class property error#
EPropReadOnly Invalid property access
EPropWriteOnly Invalid property access
EThread Thread error
EVariantError Variant problem

Esto lo podes encontrar en la ayuda de delphi, si veo tu codigo tal veZ te pueda ayudar..espero lo soluciones.

exitos

LA PATRIA SERA LIBRE!
Responder Con Cita
  #5  
Antiguo 07-04-2006
zurech zurech is offline
Miembro
 
Registrado: jul 2005
Posts: 61
Poder: 19
zurech Va por buen camino
Si estos errores te ocurren al terminar la aplicacion, prueba a finalizarla de la siguiente manera (es como lo hago yo por un problema similar):

Código Delphi [-]
{
Esta funcion, como su bonito nombre indica sirve para obtener solo el nombre del EXE, en lugar de la ruta completa
}
function TFrmPrincipal.soloExe(archivo : String) : String;
var
  resultado : String;
  i : integer;
begin
  for i:=1 to Length(archivo) do
    begin
      if (archivo[i] = '\') then
        resultado := ''
      else resultado := resultado + archivo[i];
    end;

  result := resultado;
end;

{
Funcion que mata el proceso de la aplicacion, y sus procesitos (hijos)
}
function TFrmPrincipal.KillTask(FileName:String):integer;
 var
     ContinueLoop:BOOL;
     FSnapshotHandle:THandle;
     FProcessEntry32:TProcessEntry32;
 const
     PROCESS_TERMINATE=$0001;
 begin
     FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
     FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
     ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
     while integer(ContinueLoop)<>0 do
     begin
         if
 ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(FileName))
             or (UpperCase(FProcessEntry32.szExeFile)=UpperCase(FileName)))
 then

 Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),

                                     FProcessEntry32.th32ProcessID),0));
           ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
     end;
     CloseHandle(FSnapshotHandle);
end;

procedure TFrmPrincipal.Terminar();
begin
  try
    KillTask (soloExe(Application.ExeName));
  except on exception do end;
end;
__________________
noticiasfrikis, mi web de chorradas
Responder Con Cita
  #6  
Antiguo 07-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
NO, NO Y NO.

El problema es grave, como indica un abstract error y un access violation, y el problema no es de código sino de concepto, para eso tendrás que estudiarlo.

Las clases bases de un form usan abstract; virtual etc en sus métodos, por tanto si te dan esos errores es que estas lanzando las ventanas mal. Normalmente es porque no identificas el Parent/Owner de una ventana o que le das información incongruente, mira este código:

Código Delphi [-]
Form1 := Tform1.Create(application);
....

Form1.Free;

El error está en decirle que el objeto Application es el encargado de destruir la ventana, pero despues te encargas tú por código de liberarla. Cuando termine tu programa el objeto Application intentará destruir el Form1, pero como ya está destruido.... Access violation.

De la misma forma al cerrar esa ventana una y otra vez te dará un error de Abstract Error, (es lo más probable).

Tienes que tener claro que el Parent de una ventana, por ejemplo, es solo para saber dentro de qué control se va a mostrar.

El Owner (dueño) de un control/ventana es el que se encarga de destruirlo, y puede ser distinto al Parent (Padre).

A ese código se suma otro error más. Cuando se hace el Form1.Free, la memoria se libera, pero la variable Form1 se queda apuntando a la zona de memoria donde estaba, por tanto, si vuelves a llamar a Form1.Free en compilación no da fallos, pero en Ejecución dará un Access Violation.

Formas correctas:
Código Delphi [-]
try
  Form1 := Tform1.Create(nil);
...
finally
  FreeandNil(Form1);
end;
Se crea, pero nadie lo destruirá.... porque lo destruyo por código yo.


Código Delphi [-]

  Form1 := Tform1.Create(Application);
...
El objeto se destruye cuando termina la aplicación, es decir, desde que se crea, hasta que finalice la applicación, el Form1 estará en Memoria.

Hay otras formas, por ejemplo con ventanas modales, pero todo se resume a lo mismo: Indicar bien los Owner y tener controlado (conceptualmente) cuando y donde se destruyen las ventanas.



Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 07-04-2006
zurech zurech is offline
Miembro
 
Registrado: jul 2005
Posts: 61
Poder: 19
zurech Va por buen camino
Lepe muchas gracias tio, son estos pequeños conceptos que no se tienen del todo claros lo que diferencia el buen codigo del mal codigo.
__________________
noticiasfrikis, mi web de chorradas
Responder Con Cita
  #8  
Antiguo 07-04-2006
zvf zvf is offline
Miembro
 
Registrado: abr 2006
Posts: 158
Poder: 19
zvf Va por buen camino
Gracias a todos!
Vean, creo que por ahi va el asunto, porque yo creo un boton en tiempo de ejecucion, mi codigo es el siguiente:

Código Delphi [-]
Procedure TFPrincipal.CreaBoton;
  var NewBoton : TLabel;
      nombre : string;
      scontador:string;
      sventana_actual : string;
   begin
       if (band = 0) then  //PRIMER BOTON QUE CREA
               begin
               ventana_actual:=1;
               sventana_actual:= IntToStr (ventana_actual);
               margen_izq := margen_izq_ini;
               margen_sup := margen_sup_ini;
               band := 1;
               end
        else
               begin
                margen_izq := margen_izq_ant;
                margen_sup := margen_sup_ant + alto_boton + margen_sup_ini;
                if (margen_sup > margen_inf) then
                    begin
                     margen_izq := margen_izq + margen_izq_ini;
                     margen_izq := margen_izq + ancho_boton;
                     margen_sup := margen_sup_ini;
                    end;
                if (margen_izq > margen_dere) then
                    begin
                     margen_izq := margen_izq_ini;
                     margen_sup := margen_sup_ini;
                     ventana_actual := ventana_actual+1;
                     sventana_actual:= IntToStr (ventana_actual);
                    end;
               end;
     with NewBoton do
        begin
        case ventana_actual of
          1: begin
             NewBoton := TLabel.create(FPrincipal.GroupBoxProd1);
             Parent := FPrincipal.GroupBoxProd1;
             end;
          2: begin
             NewBoton := TLabel.create(FPrincipal.GroupBoxProd2);
             Parent := FPrincipal.GroupBoxProd2;
             end;
          3: begin
             NewBoton := TLabel.create(FPrincipal.GroupBoxProd3);
             Parent := FPrincipal.GroupBoxProd3;
             end;
          4: begin
             NewBoton := TLabel.create(FPrincipal.GroupBoxProd4);
             Parent := FPrincipal.GroupBoxProd4;
             end;
          end;
        scontador:= IntToStr (contador);
        nombre:= 'Boton';
        Name := nombre+scontador;
        Color:= clMoneyGreen;
        Width := ancho_boton;
        Height := alto_boton;
        Left := margen_izq;
        Autosize := false;
        Top := margen_sup;
        Caption := varCaption;
        if soyingrediente <>1 then
             OnClick := mostrar_productos
        else
             OnClick := mostrar_productos;
        margen_izq_ant := margen_izq;
        margen_sup_ant := margen_sup;
      end; //fin del con hacer
  end;
//////  FIN DEL PROCEDIMIENTO CREAR UN BOTON EN TIEMPO DE EJECUCION   /////////
Responder Con Cita
  #9  
Antiguo 08-09-2010
ElielEgo ElielEgo is offline
Registrado
 
Registrado: sep 2010
Posts: 1
Poder: 0
ElielEgo Va por buen camino
Hola mmmm se que quizá estan dando respuesta a la pregunta de alguien más, pero yo tengo el mismo problema y según yo no lo estoy haciendo de una forma erronea.

Les comento, Tengo una forma donde lo único que tengo es un TXMLDocument (name: xml_doc) con el que leo un cuestionario en xml. Este cuestionario por necesidades del mismo varía el número de respuestas que a efectos del sistema se convertirán en radiobuttons. Por tal motivo debo generarlos de manera dinámica cada vez que se cargue una pregunta. Sin embargo en ocasiones y no siempre en el mismo momento me marca este tipo de errores cuando genero los nuevos elementos.

este es mi código

Código Delphi [-]
procedure Tfrm_quiz.cargaPregunta(index:integer);
var
  pregunta:  IXMLNode ;
  arriba, i, max_node_child:integer;
  boton : TbitBtn;
  radio: TRadioButton;
  control : TControl;
  _label : Tlabel;
begin

  boton := nil;
  radio := nil;
  _label := nil;
  control := nil;
  //Index se refiere al número de nodo que leo del xml es decir el reactivo
  if (index <> 0) then
  begin    
    for i:= 0 to (self.ControlCount -1) do
    begin       
        control := self.Controls[0];//Siempre uso el 0 porque es como ir eliminando el primero que encuentra
        freeandnil(control);
    end;
  end;

  pregunta:= self.xml_doc.DocumentElement.ChildNodes[index];
  _label := TLabel.Create(nil);

  with _label do
    begin
      left := 16;
      top:= 16;
      caption := pregunta.ChildNodes['reactivo'].Text;
      parent:=self;
    end;


  max_node_child := pregunta.ChildNodes.Count - 1;
  arriba := 64;
  for i:= 1 to max_node_child do
  begin
    radio := TRadioButton.Create(nil);
    with radio do
    begin
      left := 16;
      top:= arriba;
      arriba := arriba +30;
      width := 560;
      name := 'rdb_'+inttostr(i);
      helpKeyword := pregunta.ChildNodes[i].Attributes['etiqueta'];
      caption := pregunta.ChildNodes[i].Text;
      onClick := evaluaClick;
      parent:=self;
    end;
  end;

  if (index < self.max_node -1) then
  begin
    boton := TbitBtn.Create (nil);
    with boton do
    begin
      caption := 'Siguiente';
      left := 506;
      top := 640;
      name := 'btn_siguiente';
      OnClick := BitBtn1Click;
      parent:=self;
    end;
  end
  else
  begin    
    boton := TbitBtn.Create (nil);
    with boton do
    begin
      caption := 'Finalizar';
      left := 506;
      top := 640;
      name := 'btn_finalizar';
      OnClick := finaliza;
      parent:=self;
    end;
  end;
end;

Muchas gracias a quien me pueda ayudar y seguimos en contacto por aca...
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
Detener un error de access violation de la DbGrid - delphi..... uper Varios 1 21-09-2005 21:54:42
Error Access Violation en Paquetes (Packages) DarKraZY OOP 4 13-09-2005 14:35:31
Maldito ... Access violation Error (QuickReports) User_baja1 Impresión 1 20-04-2005 10:29:32
Error Access Violation samame Conexión con bases de datos 1 01-04-2004 10:48:10
Error Access Violation con Crystal 9 samame Impresión 0 30-03-2004 14:03:17


La franja horaria es GMT +2. Ahora son las 14:14:22.


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