Ir al contenido


Foto

Access Violation en llamada a Formulario


  • Por favor identifícate para responder
6 respuestas en este tema

#1 roca

roca

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 25 agosto 2013 - 12:22

Hola a todos...
Estoy trabajando con formularios MDI, y al momento de llamar desde el formulario donde tengo el Menu Principal, al formulario hijo, me aparece el siguiente mensaje de error:
Project Software.exe raised exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'

Y al pulsar en el botón "Break" del mensaje de error, aparece sombreada la siguiente linea (que pertenece al Create del formulario hijo):
  with frmActividadEconomica.AdoQuery1 do


El codigo que tengo en el MDI Padre es:



delphi
  1. procedure TfrmMenuPrincipal.ActividadEconomica1Click(Sender: TObject);
  2. begin
  3.   TfrmActividadEconomica.Create(Application);
  4.   with TfrmActividadEconomica.Create(Application) do Show;
  5. end;




El codigo que tengo en el MDI Hijo es:



delphi
  1. procedure TfrmActividadEconomica.FormCreate(Sender: TObject);
  2. begin
  3.   with frmActividadEconomica.AdoQuery1 do
  4.   begin
  5.       Close;
  6.       SQL.Clear;
  7.       SQL.Text := 'SELECT * FROM T_ACTIVIDAD_ECONOMICA';
  8.       Open;
  9.   end;
  10. end;




He estado leyendo que es por no declarar variables, que la aplicacion no encuentra el formulario hijo, etc... pero de verdad, no he logrado dar con la solucion. Seguramente falta algo, pero no sé qué es...  :s

De antemano, les agradezco su ayuda.

  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 25 agosto 2013 - 04:03

Prueba con "with AdoQuery1 do" o bien "with self.AdoQuery1 do", y supongo que AdoQuery es un componente "pegado" en el form, no está creado por código.

También podría ser necesario pasarlo de oncreate a onactivate, mirando si adoQuery esta si conectar y solo en ese caso conectas, para evitar reconectar al pasar de un form a otro.
  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 25 agosto 2013 - 06:43

El codigo que tengo en el MDI Padre es:



delphi
  1. procedure TfrmMenuPrincipal.ActividadEconomica1Click(Sender: TObject);
  2. begin
  3.   TfrmActividadEconomica.Create(Application);
  4.   with TfrmActividadEconomica.Create(Application) do Show;
  5. end;



Nota que en el anterior trozo de código estás creando dos estancias de la clase TfrmActividadEconomica, con la primera no haces nada, con la segunda intentas mostrarla.

Intenta con lo siguiente:



delphi
  1. procedure TfrmMenuPrincipal.ActividadEconomica1Click(Sender: TObject);
  2. var
  3. FormActividadEconomica : TfrmActividadEconomica;
  4. begin
  5.   FormActividadEconomica :=  TfrmActividadEconomica.Create(Application);
  6.   FormActividadEconomica .Show;
  7. end;



Debes notar que en el modelo que planteas, cada vez que hagas click en el item de menú se va a crear y mostrar una estancia del formulario en cuestión, y este a su vez en cada llamada lanzará una consulta a la DB. ¿Es eso lo que pretendes?

También tienes que tener en cuenta  la liberación de los formularios al cerrarlos .

En el form hijo intenta con las recomendaciones de Sergio, más o menos así:


delphi
  1. procedure TfrmActividadEconomica.FormCreate(Sender: TObject);
  2. begin
  3.   with AdoQuery1 do
  4.   begin
  5.       Close;
  6.       SQL.Clear;
  7.       SQL.Text := 'SELECT * FROM T_ACTIVIDAD_ECONOMICA';
  8.       Open;
  9.   end;
  10. end




Saludos.
  • 0

#4 roca

roca

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 26 agosto 2013 - 12:45

Muchas Gracias, Sergio y Wilson, por la ayuda prestada, he realizado lo que me indicaron y ha dejado de aparecer el Access Violation.
Efectivamente, debo mejorar lo que comenta Wilson, acerca de la creacion multiple del mismo formulario, ya estuve viendo un
procedimiento que maneja adecuadamente esta situacion, pronto se las estaré comentando.

Les comento que ahora el error que aparece es en el boton Grabar, el procedimiento que tengo es:



delphi
  1. procedure TfrmActividadEconomica.BtnGrabarClick(Sender: TObject);
  2. begin
  3.   with self.ADOQuery1 do
  4.   begin
  5.       Close;
  6.       SQL.Clear;
  7.       SQL.Text := 'INSERT INTO T_ACTIVIDAD_ECONOMICA (CODIGO, DENOMINACION) Values (:COD, :DEN)';
  8.       Parameters.ParseSQL(self.ADOQuery1.SQL.Text, True);
  9.       Parameters.Refresh;
  10.       Parameters.ParamByName('COD').Value := StrToInt(self.TxtCodigo.Text);
  11.       Parameters.ParamByName('DEN').Value := self.TxtDenominacion.Text;
  12.       ExecSQL;
  13.   end;
  14. end;



El mensaje de error es:
Project Software.exe raised exception class EDatabaseError with message 'ADOQuery1:Parameter 'COD' not found.'

En el link: http://edn.embarcade...w/article/20420 aparece lo siguiente:
Question:
When using an ADOQuery with Parameters, and trying to access the Parameters with: ADOQuery.Parameters.ParamByName('ParamName').Value I get a 'Parameter "ParamName" Not Found' error. How can I fix this?
Answer:
You can easily fix this by creating the parameters before calling ADOQuery.Parameters.ParamByName('ParamName').Value by calling: ADOQuery.Parameters.ParseSQL(ADOQuery.SQL.Text, True).

He realizado lo que indican en la respuesta, pero como si nada!! No me funciona!!  :s
A ustedes les ha pasado ??

  • 0

#5 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 26 agosto 2013 - 05:11

No uso adoqueries, pero prueba a ver si ese "refresh" te sobra, no parece necesario a simple vista.
  • 0

#6 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 26 agosto 2013 - 09:04

Saludos.

Una sugerencia con relación a postear hilos, a mi entender tu problema principal ya quedo resuelto (por el cual abriste este hilo) y ahora estas enfrentando otro problema, que no esta relacionado con el original, sería adecuado abrir otro hilo para poder dar un mejor seguimiento.

Cualquier usuario del foro le sería mas fácil encontrar ayuda si tienes dos hilos separados, es solo mi humilde sugerencia.
  • 0

#7 roca

roca

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 26 agosto 2013 - 10:33

Hola  Rolphy
De acuerdo, abrire otro hilo para el nuevo problema.
Sucede que ha surgido al momento de empezar a trabajar bajo el esquema MDI Padre, MDI Hijo, y despues de realizar los cambios que me han indicado los compañeros Sergio y Wilson.
Mis disculpas por salirme de las reglas, no ha sido la intencion.
Gracias!!  :)
  • 0




IP.Board spam blocked by CleanTalk.