Ir al contenido


Foto

Un Access violation (no se me ocurre otro titulo mejor....)


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

#1 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 17 julio 2009 - 10:47

Hola!
De nuevo yo...
En un form tengo 8 Edits y algunos botones y combos, necesito llevar a la bd el texto de los edit. Escribi esto pero me manda un mensaje de Access Violation. ¿Que es lo que no esta mal?  :)



delphi
  1. procedure TfmCFGBasculas.btAceptarClick(Sender: TObject);
  2. var
  3.   i: integer;
  4. begin
  5.   dmDatos.dstNombres.Open ;
  6.  
  7.   for i := 0 to Pred(fmCFGBasculas.ControlCount) do
  8.     with (fmCFGBasculas.Controls[i] as TEdit) do
  9.       begin
  10.         dmDatos.dstNombres.Insert;
  11.         dmDatos.dstNombresID.Value := 0;
  12.         dmDatos.dstNombresNombre.Value := Trim(text);
  13.         dmDatos.dstNombres.Post;
  14.       end;
  15.  
  16.   dmDatos.dstNombres.Close;
  17.  
  18. end;



y este es el mensaje de horror:

---------------------------
Debugger Exception Notification
---------------------------
Project Ezcatch.exe raised exception class EAccessViolation with message 'Access violation at address 0047E3EA in module 'Ezcatch.exe'. Read of address 000001D4'.
---------------------------
Break  Continue  Help 
---------------------------



  • 0

#2 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 599 mensajes

Escrito 17 julio 2009 - 11:03

Talvez un;



delphi
  1. // . . .
  2.  
  3. if fmCFGBasculas.Controls[i] is TEdit then
  4.   with // . . .


  • 0

#3 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 17 julio 2009 - 11:35

mi no entender
nada, nada
limonada!

Tu de pocos caracteres, yo de pocas neuronas..... :(
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 17 julio 2009 - 11:40

mi no entender
nada, nada
limonada!

Tu de pocos caracteres, yo de pocas neuronas..... :(


Lo que pasa es que estar recorriendo todos los componentes sin validar que el que estas leyendo sea un TEdit, por eso es que te falta esa comparación cuando sea TEdit haga lo que quieras.

Salud OS

  • 0

#5 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 17 julio 2009 - 11:46

Sin meterme en profundidades que no conosco me parece que AS implicitamente lleva la utilidad de IS. Por otro lado el mensaje de horror sigue igual.
  • 0

#6 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 17 julio 2009 - 11:51

en que linea te da??

eso sucede porque referencias un objeto no creado
  • 0

#7 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 17 julio 2009 - 12:12

El error se ocasiona al entrar en el ciclo if, despues de abrir el dataset.

He modificado de diversas formas el codigo y el error sigue el mismo, esta es la actual.



delphi
  1. procedure TfmCFGBasculas.btAceptarClick(Sender: TObject);
  2. var
  3.   i: integer;
  4. begin
  5.   dmDatos.dstNombres.Open ;
  6.  
  7.   for i := 0 to Pred(fmCFGBasculas.ControlCount) do
  8.     if fmCFGBasculas.Controls[i] is TEdit then
  9.       //with (fmCFGBasculas.Controls[i] as TEdit) do
  10.         begin
  11.           dmDatos.dstNombres.Insert;
  12.           dmDatos.dstNombresID.Value := 0;
  13.           dmDatos.dstNombresNombre.Value := Trim((fmCFGBasculas.Controls[i] as TEdit).text);
  14.  
  15.         end;
  16.   dmDatos.dstNombres.Post;
  17.   //dmDatos.dstNombres.Close;
  18.  
  19. end;




  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 julio 2009 - 12:16

Me da la impresión de que se trata de la función pred, ¿intentaste hacerlo del modo tradicional?:



delphi
  1. for i := 0 to fmCFGBasculas.ControlCount - 1 do



Saludos.
  • 0

#9 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 17 julio 2009 - 12:44

Pues al parecer es un error del d2009 con la propiedad ControlCount. Simplifique todo hasta que solo me mostrara una ventanita con el valor de 'i'  y funciono ok. Puse la sentencia de



delphi
  1. for i := 0 to fmCFGBasculas.ControlCount - 1 do
  2.   showMessage(InttoStr(i));



y aparecio el error.

Y si, probe de la manera tradicional y lo mismo.
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 julio 2009 - 12:48

Vaya :s...prueba con ComponentCount entonces, hay que descartar que sea problema del controlCount.

Saludos.
  • 0

#11 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 17 julio 2009 - 01:24

no sera que tienes otro control con el mismo nombre de fmCFGBasculas???

yo que yu probara con una aplicacion en blanco a ver por donde vienen los tiros
  • 0

#12 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 mensajes

Escrito 17 julio 2009 - 01:35

¡Hola Fidel!

Descarta que se trate de un problema de Delphi.

Según parece, la variable formulario fmCFGBasculas no está inicializada y es por ello que casi cualquier cosa que escribas, con "fmCFGBasculas." te causará una excepción como la que señalas.  La causa puede estar en la manera en que estás creando la instancia de clase TfmCFGBasculas.

También recuerda que dentro de un método no es necesario referirse de forma explí­cita al objeto sobre el que se está ejecutando ese método.  Así­ que en lugar de "fmCFGBasculas.ControlCount", puedes escribir simplemente "ControlCount" (porque ya estás dentro de un TfmCFGBasculas).  Y haciéndolo de esa manera, no será relevante que la variable fmCFGBasculas tenga valor o no, mientras el formulario de clase TfmCFGBasculas realmente exista (aunque no esté asignado a esa variable).

Espero haberme explicado.

Un saludo.

Al González. :)
  • 0

#13 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 18 julio 2009 - 10:00

Disculpas, ayer otros deberes me alejaron de aqui pero me hicieron darme cuenta de que ¡tengo muy mala condicion fisica!

Gracias por responder Al.

El fmCFGBasculas es un formulario que creo desde un elemento de menu asi:



delphi
  1. with TfmCFGBasculas.Create(Application) do
  2.           try
  3.             showmodal;
  4.           finally
  5.             free;
  6.           end;



He modificado el procedimiento del boton a esto



delphi
  1. procedure TfmCFGBasculas.btAceptarClick(Sender: TObject);
  2. var
  3.   i: integer;
  4. begin
  5.   dmDatos.dstNombres.Open ;
  6.  
  7.   //Si lo dejo en el ciclo For aparece un mensaje de que el dataset no esta en INSERT
  8.   dmDatos.dstNombres.Insert; 
  9.  
  10.   for i := 0 to ControlCount - 1 do
  11.     if Controls[i] is TEdit then
  12.       with (Controls[i] as TEdit) do
  13.         begin
  14.           dmDatos.dstNombresID.Value := 0;
  15.           dmDatos.dstNombresNombre.Value := Trim(text);
  16.           dmDatos.dstNombres.Post;
  17.         end;
  18.  
  19.   //dmDatos.dstNombres.Post;  Aqui marca un error de que el campo ID debe de tener un valor
  20.   //dmDatos.dstNombres.Close;
  21.  
  22.   //ShowMessage(IntToStr(i));
  23.  
  24. end;



Y despues del post hago esto (un modulo de datos):



delphi
  1. procedure TdmDatos.dstNombresAfterPost(DataSet: TDataSet);
  2. begin
  3.   Transaction.CommitRetaining ;
  4. end;



¿Porque tanto rollo? Ahora ya no registra error alguno pero no guarda datos en la BD  :o
  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 julio 2009 - 10:07



delphi
  1. dmDatos.dstNombresID.Value := 0;



creo que esa parte va así­:



delphi
  1. dmDatos.dstNombresID.Value := Null;



Me imagino que usas algún trigger o generador, deberí­a de dispararse sólo.

Saludos.
  • 0

#15 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 18 julio 2009 - 10:36

En este hilo hice mencion a ese pequeño detalle y el como lo solucione. Al momento de responder este, he hecho otras combinaciones con el codigo y he observado detalle en la ventana de mensaje que puse que la cuenta de controles solo llega a 10.

1 GroupBox
  2 Labels
  1 Edit
  1 ComboBox
  1 Boton
Total = 6 Componentes

Si lo multiplicamos por 8 son 48 componentes. El ciclo for para ControlCount solo cuenta 10 ¿Realmente cuenta los EDIT?  :shocked:
  • 0

#16 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 18 julio 2009 - 11:25

Lo que sucede es que el control solo cuenta los controles cuyo parent sea directamente el Form o el componente que esta contando, para lo que quieres necesitas es componentcount
  • 0

#17 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 18 julio 2009 - 12:13

Aun Hay mucho que aprender de Delphi...... :lipsrsealed:

Al final quedo asi:



delphi
  1. procedure TfmCFGBasculas.btAceptarClick(Sender: TObject);
  2. var
  3.   i: integer;
  4. begin
  5.   dmDatos.dstNombres.Open ;
  6.  
  7.   for i := 0 to componentCount - 1 do
  8.     begin
  9.       if Components[i] is TEdit then
  10.         with (Components[i] as TEdit) do
  11.           begin
  12.             dmDatos.dstNombres.Insert;
  13.             dmDatos.dstNombresID.Value := 0;
  14.             dmDatos.dstNombresNombre.Value := text;
  15.             dmDatos.dstNombres.Post;
  16.           end;
  17.     end;
  18.   dmDatos.dstNombres.Close;
  19. end;



Seguro aun se puede mejorar!

  • 0

#18 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 julio 2009 - 12:46

Vaya :s...prueba con ComponentCount entonces, hay que descartar que sea problema del controlCount.

Saludos.


8-)  8-) post #9 :p :p

Me alegro que hayas salido de ese atolladero :D
  • 0

#19 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 mensajes

Escrito 19 julio 2009 - 10:20

¡Hola de nuevo!

Al final quedo asi:...

Seguro aun se puede mejorar!


Una versión alternativa:



delphi
  1. procedure TfmCFGBasculas.btAceptarClick(Sender: TObject);
  2. Var
  3.   I :Integer;
  4. begin
  5.   dmDatos.dstNombres.Open;
  6.  
  7.   Try
  8.     For I := 0 To ComponentCount - 1 Do
  9.       If Components [I] Is TEdit Then
  10.         dmDatos.dstNombres.AppendRecord (
  11.           [0, Trim (TEdit (Components [I]).Text)]);
  12.   Finally
  13.     dmDatos.dstNombres.Close;
  14.   End;
  15. end;



Suponiendo que ID y Nombre  son los dos primeros campos en el conjunto de datos.  De estar separados, hay que agregar "Null" para los campos intermedios (para los finales no es necesario).

Espero sea de utilidad, feliz domingo.

Al González. :)
  • 0




IP.Board spam blocked by CleanTalk.