Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Error AccessViolation que no consigo localizar (https://www.clubdelphi.com/foros/showthread.php?t=58379)

radge 18-07-2008 11:52:02

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

Neftali [Germán.Estévez] 18-07-2008 12:26:57

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.


radge 18-07-2008 12:36:15

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

coso 18-07-2008 12:42:48

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.

radge 18-07-2008 16:05:37

Cita:

Empezado por coso (Mensaje 301298)
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

Neftali [Germán.Estévez] 18-07-2008 16:37:14

¿Tienes la pila de llamadas de ese error?

View/Debug Windows/Call Stack

¿Puedes ponerla?

radge 18-07-2008 16:40:48

Si claro aki esta a ver k os parece.




gracias , radge

radge 18-07-2008 17:47:50

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

coso 18-07-2008 19:09:34

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;

radge 21-07-2008 08:11:21

Cita:

Empezado por coso (Mensaje 301432)
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

coso 21-07-2008 10:15:52

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.

radge 21-07-2008 10:22:16

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

radge 21-07-2008 10:45:26

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

coso 21-07-2008 11:09:50

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.

radge 21-07-2008 11:19:32

Cita:

Empezado por coso (Mensaje 301821)
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

coso 21-07-2008 11:26:41

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.

radge 22-07-2008 08:29:24

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

coso 22-07-2008 09:27:34

debugar es fastidioso :mad:, y hacerlo online, un poco mas :confused:. 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.

coso 22-07-2008 09:35:33

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

radge 22-07-2008 15:25:56

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



La franja horaria es GMT +2. Ahora son las 19:36:09.

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