Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-09-2006
ingel ingel is offline
Miembro
 
Registrado: jun 2003
Posts: 239
Poder: 21
ingel Va por buen camino
demasiados access violation

HOla foro .. puede que tenga un dia con el biorritmo bajo pero los access violation me estan fastidiando sobremanera ..
Todo comenzo con un simple listado igual a TODOS los demas , uso una tabla temporal , alli grabo con un SP lo que necesito imprimir , la asigno a un
QReport y relaciono un QRDBText con los campos de dicha tabla.
bueno .. en ESTE caso ..antes de hacer el .Print debo hacer el Open de la tabla .. pues me da access violation ..y no hay caso ..
he probado 'mover' el codigo en diferentes partes pero nada ..
(hago el open de la tabla desde el entorno y abre sin problema .. los datos grabados en la tablas estan correctos)

Tal vez el problema venga por otro lado .. y este haciendo algo incorrectamente..
Estoy ejecutando una ventana principal que usa 'varios' forms ..
los creo TODOS juntos hago el Showmodal de ESA ventana principal
y al salir hago el FREE de todos juntos ..

por ej..

Código:
Application.CreateForm(TFPediSeg,FPediSeg);
Application.CreateForm(TFPedDetProd,FPedDetProd);
Application.CreateForm(TFCompItems,FCompItems);
...// son 7 u 8 forms

FPediSeg.Showmodal

CONTROL /* esto es un procedimiento de control que hace un open de una tabla general del sistema..*/

FPediSeg.free
FPedDetProd.free
FCompItems.free
...
La primera duda es el ORDEN en que debo hacer los FREE?

Digo esto porque ahora simplemente voy entrando a sucesivos forms (ya creados en el principal) mostrandolos con Showmodal y simplemete SALIENDO
en cadena .. cuando salgo del tercero .. o sea ..el primero llama a un segundo y este segundo a un tercero ... saliendo simplemente de este tercero .. en cualquier instruccion que ponga luego de l showmodal .. me da error de access violation ..hasta en un simple Showmessage .. y todavia no he hecho ningun free..

bueno ..espero haya sido lo suficientemente claro ...y alguin pueda guiarme un poco...

GRACIAS ...y saludos
Ingel
Responder Con Cita
  #2  
Antiguo 07-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No se si esta es la duda pero para llamar a un from yo uso:

procedure TFMainForm.BitBtn10Click(Sender: TObject);
begin
FUsuarios:=TFUsuarios.Create(self);
try
FUsuarios.ShowModal;
finally
FUsuarios.Free;
end;
end;

Esto en cada from osea el que llama a otro, asi cierro el from que no necesito y ahorro memoria.
Podria ser esto.
Espero te sirva de algo.
Saludos
Responder Con Cita
  #3  
Antiguo 07-09-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
Hola compañero! la verdad que no entendi mucho..jaja pero como soy terca contesto igual
Bueno un consejo para guardar prolijidad deberias crear las ventanas cuando realmente las uses..y liberarlas cuando no las uses..
Tambien podrias proteger bloque despues de la creacion con un try... finally.
Si haces un showmodal a un form que ya esta liberado..te va a dar error..es eso lo que te pasa??
Espero te sirva mi comentario.
Salu2

LA PATRIA SERA LIBRE!
Responder Con Cita
  #4  
Antiguo 07-09-2006
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
A mi me pareció intrigante que tuvieras que crear un SP para generar una tabla para luego asignarlo a un Qreport.

Para mi lo más fácil hubiera sido utilizar un TQuery y asignarlo al QReport
__________________

Responder Con Cita
  #5  
Antiguo 07-09-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
Uhh Me Ganaron De Mano! Ja..coincido Con El Comentario Anterior..
Responder Con Cita
  #6  
Antiguo 07-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola denuevo
Este es un simple codigo que llama a un reporte de compras por medio de un query.

If Reporte = 'ComprasXFecha' then
begin
ShortDateFormat := '#yyyy/mm/dd#';
try
QRComprasXCliente:=TQRComprasXCliente.Create(self);
QRComprasXCliente.ADOQuery1.SQL.Add(' WHERE CxPagar.TipoTransac="FA" ');
QRComprasXCliente.ADOQuery1.SQL.Add(' AND FechaTransac >= '+DateToStr(DTP1.Date)+' AND FechaTransac <= '+DateToStr(DTP2.Date));
QRComprasXCliente.ADOQuery1.SQL.Add(' ORDER BY CodProveedor, FechaTransac;');
QRComprasXCliente.ADOQuery1.Open;
ShortDateFormat := 'dd/mm/yyyy';
QRComprasXCliente.Titulo.text := 'Compras Realizadas por Fecha';
QRComprasXCliente.QRLblDesde.Caption := DateToStr(DTP1.Date);
QRComprasXCliente.QRLblHasta.Caption := DateToStr(DTP2.Date);
If RadioGroup1.ItemIndex = 0 then QRComprasXCliente.Print
else QRComprasXCliente.Preview;
finally
QRComprasXCliente.Free;
end;

Tal vez te sirva para completar tu enlace al qreport y no te de errores
Por lo menos a mi me sirve.
Saludos
Responder Con Cita
  #7  
Antiguo 07-09-2006
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
solo como comentario apart; en la línea:
Código Delphi [-]
QRComprasXCliente.ADOQuery1.SQL.Add(' AND FechaTransac >= '+DateToStr(DTP1.Date)+' AND FechaTransac <= '+DateToStr(DTP2.Date));


creoq ue sería mejor:
Código Delphi [-]
QRComprasXCliente.ADOQuery1.SQL.Add(' AND FechaTransac between '+DateToStr(DTP1.Date)+' AND '+DateToStr(DTP2.Date)+'''');


de esta forma no tienes que validar si una fecha es mayor a la otra o no
__________________

Responder Con Cita
  #8  
Antiguo 07-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Gracias Contra veneno
Tu comentario lo tamare en cuenta, esto tambien servira para que el que hizo la pregunta mejore su codigo al igual que yo, para esto esta el foro, Aprender.
Saludos
Responder Con Cita
  #9  
Antiguo 07-09-2006
ingel ingel is offline
Miembro
 
Registrado: jun 2003
Posts: 239
Poder: 21
ingel Va por buen camino
gracias a todos por responder ...

sobre lo de usar una Query en lugar de la tabla podria ser , lo que pasa es que ya herede el codigo asi .. y todo el sistema graba en esa tabla temporal antes de imprimir (cada estacion de trabajo) y luego los reportes toman los registros segun la estacion de trabajo que manda el reporte ..hace el open e imprime.
Pero estimo ,sin probarlo , que daria el mismo error en el open de la query ..
porque creo que los problemas no son del componente ..aunque en realidad no se cual es el problema
No comprendo porque puede dar aveces access violation el open de una tabla cuando esa tabla esta en un form que fue creado y no liberado de memoria aun....
Lo de abrir y liberar todos los forms juntos lo hago justamente (luego de deliberar bon otros programadores, se supone mas experimentados que yo)
para evitar que estando en un form que usa varios otros form 'permanentemente' este creando y liberando cosas de la memoria..
me explico ? .. imaginense un form principal y 20 botones que cada uno abre un form diferente ..y se esta trabajando 'siempre' sobre el form principal presionando los 20 botones ...
pero .... quizas no sea lo optimo... no? y si lo sea abrir y liberar CADA vez que se usa cada form ...

bueno gracias por los consejos ..
como dice Les Luthiers (argentinos comprenderan) ..
" ya no se si soy de mi o si soy de ti "...
sigo en mi lucha contra las violaciones ..
Saludos
gracias
Responder Con Cita
  #10  
Antiguo 07-09-2006
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
pues utilizando un query como mínimo te ahorras todo el SP para grabar los datos en la tabla temporal. ¿no es eso motivo suficiente?

Ahora, si multiplicas eso por el número máximo de usuarios activos, pues te incrementaría el tiempo y la carga en el servidor.

Pero en fin, fue solo mi simple comentario.
__________________

Responder Con Cita
  #11  
Antiguo 08-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
En realidad Contra veneno tiene razon y de peso, tal vez en medio de la desesperacion no se ven las cosas bien, hay que tomarse un cafe, ver el ordenador de reojo, pensar, pensar con calma y veras que te dicen las cosas por algo.
Si heredas un codigo y este es habierto es tuyo puedes cambiar todo lo que quieras, El table= datos fijos, el query= lo que quieras, de eso se trata, de simplificar las cosas no de complicarlas, haz caso a Contra Veneno y otros de por aqui que te servira de mucho.
Saludos

Saludos
Responder Con Cita
  #12  
Antiguo 08-09-2006
ingel ingel is offline
Miembro
 
Registrado: jun 2003
Posts: 239
Poder: 21
ingel Va por buen camino
probare con la Query ..

y mañana les comento.
(...y de paso les comento el porque de la tabla .. (o al menos eso interpreto yo) .. los datos estan en un StringGrid (se generan a partir de varios procesos) .. para imprimir eso , se vuelca el stringgrid a la tabla temporal de impresion y luego se hace el reporte enlazandolo con la tabla , hacer una query para representar ese stringgrid seria estimo bastante tedioso al menos )

Muchas gracias a todos.
Responder Con Cita
  #13  
Antiguo 08-09-2006
ingel ingel is offline
Miembro
 
Registrado: jun 2003
Posts: 239
Poder: 21
ingel Va por buen camino
buendia ..

siguiendo con mi tema de las violaciones .. (siguen apareciendo) la pregunta
concreta seria : Hay algun ORDEN para liberar los forms que se crean ?

porque por ej. creo 3 forms juntos (en realidad son 6)
entro al primero , llamo al segundo , llamo al tercero .. cuando salgo del tercero , debajo del showmodal , le puse un showmessage .. AHI me da error de violacion ... PERO si creo un CUARTO form donde se crean todos los forms PASA SIN dar error ..

Ahora tambien cuando logro pasar sin error y simplemente quiero regresar al menu principal (saliendo del primer form) debajo de la llamada al primer form me comienza a dar error de violacion en los .FREE de cada form (si anulo el primero , me da en el segundo y asi sucesivamente) ...
Help !!
gracias ...
Responder Con Cita
  #14  
Antiguo 08-09-2006
Avatar de marceloalegre
[marceloalegre] marceloalegre is offline
Miembro Premium
 
Registrado: abr 2005
Ubicación: Mar del Plata - Argentina
Posts: 448
Poder: 20
marceloalegre Va por buen camino
Post

En cuanto a lo que comentas no veo errores concretos, pero deberias preguntarte, por lo menos para este caso, cual es el "gran beneficio" de crear dinamicamente estos formularos, son muy pocos... podrias dejarlos auto create...
Igualmente para no dejar la pregunta sin respuesta, te cuento otra forma para estas cuestiones:

Código Delphi [-]
//para la creacion:
FPediSeg:=TFPediSeg.create(nil);
 
//liberar
FreeandNil(FPediSeg);

Cuenta como te fue con esto... Saludos!
Responder Con Cita
  #15  
Antiguo 08-09-2006
ingel ingel is offline
Miembro
 
Registrado: jun 2003
Posts: 239
Poder: 21
ingel Va por buen camino
Unhappy Kanvictor .. te cuento ..

asi quedo mi codigo ..
[codigo]
0501: begin // pedidos

{Application.CreateForm(TFEntregas,FEntregas);
Application.CreateForm(TFPedPresu,FPedPresu);
Application.CreateForm(TFBusPed,FBusPed);
Application.CreateForm(TFCargaRapida,FCargaRapida);
Application.CreateForm(TFPediSeg,FPediSeg);
Application.CreateForm(TFPedDetProd,FPedDetProd);
Application.CreateForm(TFCompItems,FCompItems);
Application.CreateForm(tform1,form1);
Application.CreateForm(TFPedidos,FPedidos);}


FPedidos := TFPedidos.create(nil);
FEntregas := TFEntregas.create(nil);
FPedPresu := TFPedPresu.create(nil);
FBusPed := TFBusPed.create(nil);
FCargaRapida:= TFCargaRapida.create(nil);
FPediSeg := TFPediSeg.create(nil);
FPedDetProd := TFPedDetProd.create(nil);
FCompItems := TFCompItems.create(nil);


with FPedidos do begin
ShowModal;
end;

// if fDatos.TDatos.FieldByName('ALERTA_PRODUCTOS').asboolean then CargoAlertasProd;


FreeandNil(FPedidos);
FreeandNil(FEntregas);
FreeandNil(FPedPresu);
FreeandNil(FBusPed);
FreeandNil(FCargaRapida);
FreeandNil(FPediSeg);
FreeandNil(FPedDetProd);
FreeandNil(FCompItems);

{ FCompItems.free;
FPedDetProd.Free;
FPediSeg.Free;
FCargaRapida.Free;
FBusPed.Free;
FPedPresu.Free;
FEntregas.Free;}

end;

[/codigo]

Lo que hago es entrar a Pedidos , luego a PedPresu y luego a CompImtems y comezar a salir de cada uno .. cuando llego a FreeandNil(FPedidos); da error
si lo comento ..el error lo da el siguiente ...FreeandNil(FEntregas);
Revise y en esos form no tengo FREE de ninguno de estos forms ...
la verdad estoy ..
gracias por tu Rta..

(voy a tratar de crear cada form en el momento que lo uso ..) porque la verdad ni idea por donde viene el problema..
Responder Con Cita
  #16  
Antiguo 08-09-2006
ingel ingel is offline
Miembro
 
Registrado: jun 2003
Posts: 239
Poder: 21
ingel Va por buen camino
ya descubri el problema ...

bueno ... en definitiva lo que me ocasionaba estos access violation era
el componente XStringGrid (puesto en el TERCER form que llamaba) ,porque
al quitarlo (luego de probar llamar un form VACIO y que NO diera el error)
dejo de dar el error y el programa funciono como siempre....
ahora .. esto me causa algun problemita porque me venia MUY bien todas las
propiedades del Xstringgrid y ya habia programado todo en base a este componente.. peeero ... supongo que no sera facil encontrarle un porque y menos aun una solucion ...
bueno GRACIAS A TODOS
Saludos
Responder Con Cita
  #17  
Antiguo 08-09-2006
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
en tu post donde esta tu código... edítalo y donde donde dice [Codigo] cámbialo por ['delphi] y [ '/ delphi]

y se verá mucho mejor
__________________


Última edición por ContraVeneno fecha: 08-09-2006 a las 17:19:15.
Responder Con Cita
  #18  
Antiguo 20-09-2006
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Solo por añadir...

usar freeandnil no tiene caso si el puntero del objeto ya no se va utilizar. Por otro lado siempre será recomendable ir creando las forms de forma dinámica pues con ello optimizamos más memoria que si las dejamos en autocreate. Claro que si se trata de una o dos sencillas no habrá mucha diferencia. Una buena práctica es usar la estructura: try...finally que por ahi ya comentaron, además de eso, el constructor de las form acepta por default un owner que en el caso de una ventana normal debe ser siempre nil.. en www.about.com en la seccion de delphi hay varios artículos muy bien explicados al respecto.

Por otro lado lo de las violations a mie me sucedia antes mucho y aprendí que en un 90% de los casos se trata de algun acceso a un objeto que no esta inicializado, como por ejemplo querer darle Form1.ShowModal sin antes crear la forma, o acceder a alguno de sus métodos. Muchas veces cosas tan obvias se olvidan. De hecho tengo como regla general revisar todas las asignaciones a objetos cuando me sale ese error,.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
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
Access Violation Carliviris Varios 5 12-05-2006 19:21:45
Access violation at .... Perio Varios 5 07-02-2006 15:50:36
access violation chilenauta Impresión 15 15-12-2004 19:45:51
Access Violation ..... MADV01 Varios 2 24-03-2004 16:01:33
Access violation Giasl Varios 6 07-05-2003 12:35:51


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


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