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 18-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 17
radge Va por buen camino
Error AccessViolation que no consigo localizar

Tengo un formulario con los siguientes componentes :
-Tquery
-dataset
-dbgrid

Lo que hago es hacer una sql con la query y mostrar la en el GRID , una vez alli muestro los campos y tengo un checkbox dependiendo si lo chekeas o no hace una sql o otra.

Un formulario realmente sencillo

La cuestión es que en el gris empiezo a “toketearlo” y cada cierto número de veces que apreto en el grid , pueden ser 10..30..40 o 2… depende…. Me sale la siguiente excepción

Project Proyecto1.exe raised exception class EAccessVioaltion with message
‘Access violation at address 004032AE in module Proyecto1.exe.
Read of address FFFFFFDC’. Process stopped….


Alguna vez rara vez he visto esta otra

Exception EAccessViolation in module Comerciales.exe at 00000000.
Access violation at address 00000000. Read of Address 00000000






Os pondria el código pero sin la sql y tal no serviria de nada ;(


he debugado y debugado pero no le veo el fallo....


salu2 radge
Responder Con Cita
  #2  
Antiguo 18-07-2008
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.310
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
Compila el código añadiendo opciones de Debug.
Una vez que estés ejecutando, prueba a ir a las opciones de Search/Find Error e introduce el primer número hexadecimal (address) a ver si por ahí aclaras algo.

__________________
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
  #3  
Antiguo 18-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 17
radge Va por buen camino
Adjunto imagen de las opciones que tengo al compilar

http://img258.imageshack.us/my.php?i...nttulo1ue9.jpg



Con la dirección que me da la pongo dodne me has dicho y lo que me sale no se descifrarlo


gracias , radge

Última edición por radge fecha: 18-07-2008 a las 12:39:55.
Responder Con Cita
  #4  
Antiguo 18-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola, debes tener la informacion de debug activada (project->options->compiler->debug options) para que te indique encima de tu codigo en que linea te salta la excepción. Es mas, si pones en 'tools->debugger options->Halt on delphi exceptions', y pulsas Ctrl+F3 una vez te ha saltado la excepcion (dentro del IDE), sabras cuales han sido las funciones llamadas antes de la excepcion.
Responder Con Cita
  #5  
Antiguo 18-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 17
radge Va por buen camino
Cita:
Empezado por coso Ver Mensaje
Hola, debes tener la informacion de debug activada (project->options->compiler->debug options) para que te indique encima de tu codigo en que linea te salta la excepción. Es mas, si pones en 'tools->debugger options->Halt on delphi exceptions', y pulsas Ctrl+F3 una vez te ha saltado la excepcion (dentro del IDE), sabras cuales han sido las funciones llamadas antes de la excepcion.
Gracias pongo la dirección en Hex. en find/search error del delphi y siempre me sale la misma dirección 004825E7

Resulta que es código suyo propio , como arreglo esto ¿?





gracias , radge
Responder Con Cita
  #6  
Antiguo 18-07-2008
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.310
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
¿Tienes la pila de llamadas de ese error?

View/Debug Windows/Call Stack

¿Puedes ponerla?
__________________
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
  #7  
Antiguo 18-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 17
radge Va por buen camino
Si claro aki esta a ver k os parece.




gracias , radge
Responder Con Cita
  #8  
Antiguo 18-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 17
radge Va por buen camino
Os pongo un eskema de lo k hace mi evento FieldChanged del wwdbgrid que como vereis es muy simple


procedure formulario1.wwDBGrid1FieldChanged(Sender: TObject; Field: TField);

begin
if (condicion1) then begin
SQL1 (INSERT INTO)
SQL2 (UPDATE)
end
else begin
Creo un formulario para rellenar unos datos
y los recibo en el formulario actual

Una vez recibido los datos lo destruyo.
SQL3 (INSERT INTO)
SQL4 (UPDATE)
end;
end


gracias , radge
Responder Con Cita
  #9  
Antiguo 18-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
si el fallo seguro que no esta en esquema, sino en algun detalle. Antes del codigo en el onchange, yo pondria
Código Delphi [-]
 if not (sender as TDBEdit).Focused then exit;
Responder Con Cita
  #10  
Antiguo 21-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 17
radge Va por buen camino
Cita:
Empezado por coso Ver Mensaje
si el fallo seguro que no esta en esquema, sino en algun detalle. Antes del codigo en el onchange, yo pondria Código Delphi [-] if not (sender as TDBEdit).Focused then exit;

Te refieres en el onfieldchanged ? Y eso que hace exactamente ? Porque yo no tengo ningun TDBEdit.

Te referias al onchange del formulario o del dbgrid ?

gracias , radge

Última edición por radge fecha: 21-07-2008 a las 09:15:33.
Responder Con Cita
  #11  
Antiguo 21-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
vaya, hubiese dicho que era dbedit. De igual manera, si, en el on fieldchange

PD : Read of address FFFFFFDC : Esto son ya las ultimas direcciones de memoria... creo que hay algo que no liberas correctamente y te va comiendo memoria.
PDD : lo que hace es que evita calculos si no esta el formulario correctamente inicializado, etc...vamos, si no tiene el foco. Para evitar actualizaciones indeseadas o incontroladas mas bien.

Última edición por coso fecha: 21-07-2008 a las 10:20:27.
Responder Con Cita
  #12  
Antiguo 21-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 17
radge Va por buen camino
if not (sender as wwDBGrid1).focused then exit;

Me dice

[Error] SupVision.pas(203): Operator not applicable to this operand type



En cuanto lo de la memoria ya lo pensé yo pero lo unico que creo es un formulario que luego destruyo antes de volver a utilizarlo

salu2 radge
Responder Con Cita
  #13  
Antiguo 21-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 17
radge Va por buen camino
Casi todo el rato me apunta aquí




Es como si intentara liberar buffer o algo similar y da error ? Van x aki los tiros ?

salu2 radge
Responder Con Cita
  #14  
Antiguo 21-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
if not (sender as TDBGrid).Focused ... esto interpreta a 'sender' como de la clase DBGrid (si no lo fuera, por ejemplo si sender fuese un edit, te saltaria excepcion).

Pues en el momento que te salga la excepcion (en delphi, no en el programa) aprietas Ctrl+F3, te sale el stack. La primera linea es la ultima funcion llamada, y las siguientes las anteriores. El debugger te apunta a el codigo nativo pues es alli donde salta, aunque seguramente se haya provocado en una de las tuyas :entonces miras mediante esta lista cual de tus funciones ha sido la ultima en llamarse que ha provocado el error, y en que linea. Venga, suerte a ver si lo encuentras.

Última edición por coso fecha: 21-07-2008 a las 11:11:54.
Responder Con Cita
  #15  
Antiguo 21-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 17
radge Va por buen camino
Cita:
Empezado por coso Ver Mensaje
if not (sender as TDBGrid).Focused ... esto interpreta a 'sender' como de la clase DBGrid (si no lo fuera, por ejemplo si sender fuese un edit, te saltaria excepcion).

Pues en el momento que te salga la excepcion (en delphi, no en el programa) aprietas Ctrl+F3, te sale el stack. La primera linea es la ultima funcion llamada, y las siguientes las anteriores. El debugger te apunta a el codigo nativo pues es alli donde salta, aunque seguramente se haya provocado en una de las tuyas :entonces miras mediante esta lista cual de tus funciones ha sido la ultima en llamarse que ha provocado el error, y en que linea. Venga, suerte a ver si lo encuentras.
Gracias , pero el problema que el onfield changes apenas tiene 50 0 60 lineas he puesto varios try catch para ver donde me salta la excepción pero no hay forma de que salte en el delphi , pero si en el programa.

Entonces por eso no se donde pillar lo , porque no se lo que o donde lo esta provocando.

salu2 radge
Responder Con Cita
  #16  
Antiguo 21-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
a eso voy... cuando te salga la excepcion, aprietas Ctrl+F3 y te sale la lista de las llamadas a funciones. Olvidandote del codigo nativo, que esta correcto, tu vas a tu funcion y veras en que linea se te ha provocado y entonces puedes deducir porque. Saludos.

Cita:
pero no hay forma de que salte en el delphi
tools->debugger options->exception->stop on delphi exceptions

esto anterior te hara saltar la excepcion en delphi aunque la tengas en un try

Cita:
apenas tiene 50 0 60 lineas
y ya son demasiadas. divide y venceras.

Última edición por coso fecha: 21-07-2008 a las 11:29:58.
Responder Con Cita
  #17  
Antiguo 22-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 17
radge Va por buen camino
else if (FilaCheck = 'N') then
if (var1= var2) then begin
botoseleccionat := MessageDlg('Estas seguro que quieres borrar las unidades servidas ?',mtCustom,
[mbYes,mbNo], 0);
if botoseleccionat = mrYes then begin
cadenaSQL := 'update sql';
ModuloDatos.Ejecutar_SQL(cadenaSQL);
cadenaSQL := 'update SQL';
ModuloDatos.Ejecutar_SQL(cadenaSQL);
try
query_supvision.Close;
query_supvision.Open;
except
showmessage('Error abriendo la base de datos');
end
end
end


He debugado y debugado y uno de las veces al mirar el "call stack" me marca en esta posición , pero yo no le veo nada a esta linea de codigo.

gracias radge
Responder Con Cita
  #18  
Antiguo 22-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
debugar es fastidioso , y hacerlo online, un poco mas . Otro truquito que se hace es ir comentando lineas, probando, comentando lineas, ... hasta que no te salte. Es raro, porque esa linea de codigo no tiene nada ciertamente...a no ser que, como deciamos, ya no tengas memoria ni para llenar un TModalResult...No se si cargas un exceso de datos por algun otro lado que no liberas, alguna form que creas varias veces en tiempo de ejecucion, querys que se crean y llaman multitud de veces (ejecutar_SQL) sin luego liberarlas,bitmaps,...ni idea, deberia repasar todo el codigo. Si tienes alguna otra duda, por eso, no dudes en ponerla aqui. Venga, saludos, i sort!

PD : prueba de ponerlo en otro evento que no sea el OnFieldChanged, pues ahora que pienso, si modificas la misma base de datos que se mira en el DBGrid, es probable que la llames recursivamente una y otra vez. Saludos.

Última edición por coso fecha: 22-07-2008 a las 09:31:31.
Responder Con Cita
  #19  
Antiguo 22-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Si puedes, pon el codigo entero de
procedure formulario1.wwDBGrid1FieldChanged(Sender: TObject; Field: TField)

Cita:
Exception EAccessViolation in module Comerciales.exe at 00000000.
Access violation at address 00000000. Read of Address 00000000
este es otro completamente independiente, seguro
Responder Con Cita
  #20  
Antiguo 22-07-2008
radge radge is offline
Miembro
 
Registrado: may 2008
Posts: 147
Poder: 17
radge Va por buen camino
Código PHP:

procedure TfrmSupVision
.wwDBGrid1FieldChanged(SenderTObject;
  
FieldTField);
Var
   
cadenaSQL,FilaCheck,Lin_Codi,Alb_Codi,Per_Codi,accountnum,dataareaid ,
   
varDades varUnitatsRestants string;
   
Cantidad UnitatsServidesBD botoseleccionat  Integer ;
   
Marca TBookMarkStr;

begin
         Lin_Codi 
:= query_supvision.FieldbyName('LIN_Codi').AsString;
         
Alb_Codi := query_supvision.FieldbyName('ALB_Codi').AsString;
         
Per_Codi := query_supvision.FieldbyName('Per_Codi').AsString;
         
Accountnum := query_supvision.FieldbyName('accountnum').AsString;
         
Dataareaid := query_supvision.FieldbyName('dataareaid').AsString;
         
Cantidad := query_supvision.FieldbyName('Cantidad').asinteger;
         
UnitatsServidesBD := query_supvision.FieldbyName('Unitats_Servides').asinteger;


        if ((
Lin_Codi <> '') and (Dataareaid <> '') and (Alb_Codi <> '') and (Per_Codi <> '') and (Accountnum <> '') AND (inttostr(Cantidad) <> '') ) then begin
           
if (combobox1.text 'TODOS'then
               FreeAndNil
(Marca);
               
Marca := query_supvision.Bookmark;

        
FilaCheck := wwDBGrid1.GetFieldValue(7); 

        if (
FilaCheck 'S'then  begin
             
if (Cantidad 1then begin
                 cadenaSQL 
:= 'SQL XXXXXXXXXXX';
              
ModuloDatos.Ejecutar_SQL(cadenaSQL);
              
cadenaSQL := 'SQL XXXXXXXXX';
              
ModuloDatos.Ejecutar_SQL(cadenaSQL);
               try
                  
query_supvision.Close;
                  
query_supvision.Open;
               
except
                  showmessage
('Error al abrir/cerrar BD vuelve a intentar lo');
               
end;
             
end

             
else begin // Si hi ha més d'una unitat d'aquella linea de pedido ==> FORM NOU
                 
try
                   
Application.CreateForm (TfrmUnidadesPedidoVentafrmUnidadesPedidoVenta);
                 
except
                 
;
                 
end;
                   
frmUnidadesPedidoVenta.CarregaDades(Cantidad,UnitatsServidesBD);
                   if (
Cantidad 0) and (UnitatsServidesBD >=)then begin
                   frmUnidadesPedidoVenta
.ShowModal;
                   
varDades := frmUnidadesPedidoVenta.rebreDades;
                   
varUnitatsRestants := frmUnidadesPedidoVenta.rebreUnitatsRestants;
                      
cadenaSQL := 'SQL XXXXXXXXXXXXXXXXXX';
                      
ModuloDatos.Ejecutar_SQL(cadenaSQL);
                      
cadenaSQL := 'SQL XXXXXXXXXXXXXXXXXX';
                      
ModuloDatos.Ejecutar_SQL(cadenaSQL);
                      
query_supvision.Close;
                      
query_supvision.Open;
                  
end
                  
else begin
                     showmessage
('Error al recibir los datos');
                  
end;
              
end;
        
end
        
else if (FilaCheck 'N'then
             
if (Cantidad UnitatsServidesBDthen begin
                   botoseleccionat 
:= MessageDlg('Estas seguro que quieres borrar las unidades servidas ?',mtCustom,[mbYes,mbNo], 0);
                 if 
botoseleccionat mrYes then begin
                      cadenaSQL 
:= 'SQL XXXXXXXXXXXXXXXXXX';
                     
ModuloDatos.Ejecutar_SQL(cadenaSQL);
                      
cadenaSQL := 'SQL XXXXXXXXXXXXXXXXXX';
                     
ModuloDatos.Ejecutar_SQL(cadenaSQL);
                     try
                        
query_supvision.Close;
                        
query_supvision.Open;
                     
except
                        showmessage
('Error abriendo la base de datos');
                     
end
                end
                
else begin
                     query_supvision
.Cancel;  // refrescar
                
end;
                
end;
    
end
    
else begin
       showmessage
('Este cliente no tiene más albaranes por editar');
    
end;
      if (
combobox1.text 'TODOS'then
      query_supvision
.Bookmark := Marca;
  
end
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
Error Raro sobre archivo "ntdll.dll" que no consigo encontrar el motivo AGAG4 Impresión 1 23-11-2007 07:11:17
localizar un registro vroa74 Conexión con bases de datos 3 17-08-2007 14:11:23
Localizar un registro alcides Varios 4 13-04-2007 20:17:27
Localizar datos con Firebird joanajj Firebird e Interbase 5 06-06-2006 00:11:42
RaveReport AccessViolation raugadel Impresión 0 03-11-2005 15:32:56


La franja horaria es GMT +2. Ahora son las 23:53:28.


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