PDA

Ver la Versión Completa : DBGrid no tiene nada asignado


ReiCk_Z
29-10-2015, 07:03:23
Cordial saludo a los miembros del club.
Espero que me puedan ayudar con la siguiente inquietud.
Tengo un DBGrid que le asigno una consulta sin ningún problema, cuando ejecuto la consulta el DBGrid me carga la información sin problemas.
El problema está cuando trato de acceder a la información que contiene el DBGrid, me sale que no tiene nada asignado. Pero si vuelvo a ejecutar la consulta por segunda vez ya no pone problema. Hasta el momento de esta manera he pasado por alto este impase, pero me gustaría saber a que se debe y como solucionarlo.


procedure TFMenu.DBGrid5_1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
try
if Key = VK_RETURN then
begin
if Assigned(DBGrid5_1.Fields[1]) then // Al realizar este chequeo me devuelve False *
begin
if DBGrid5_1.SelectedField.FieldName = DM1.Q5_9.Fields[0].FieldName then
begin
Edit5_01.Text := DBGrid5_1.Fields[1].AsString;
end;
end;


*Resalto que puedo ver la información en el DBGrid pero al realizar este paso devuelve False

Les agradezco mucho la ayuda que me puedan brindar.

ecfisa
29-10-2015, 11:31:10
Hola ReiCk_Z.

Algunas dudas,
...El problema está cuando trato de acceder a la información que contiene el DBGrid, me sale que no tiene nada asignado.

¿ Cuál es "textualmente" el mensaje de error que te muestra ?
¿ El modo en que accedes es con el código de tu mensaje en el evento OnKeyDown ?



...Pero si vuelvo a ejecutar la consulta por segunda vez ya no pone problema.

¿ En que evento/procedimiento se ejecuta la consulta inicial ?
¿ Para ejecutar la consulta por segunda vez llamas al mismo código ?
¿ Se ejecuta algún código o dispara otro método entre la primer asignación que da error y la segunda que funciona ?


Saludos :)

AgustinOrtu
29-10-2015, 12:43:53
No deberias acceder a los datos mediante el DBGrid. Lo correcto es usar el DataSet. Si el DBGrid se mueve al registro nro 5, en realidad lo que pasa tras los bastidores es que el DataSet se movio al registro nro 5, el DBGrid "se entera magicamente", y para reflejarlo, muestra el registro nro 5 como seleccionado. Pero quien contiene el estado es el DataSet. El DBGrid solamente muestra informacion

ReiCk_Z
30-10-2015, 03:34:34
Hola ecfisa
Respondo tus preguntas:

¿ Cuál es "textualmente" el mensaje de error que te muestra ?
Ya no me sale error porque como vez en el codigo la linea señalada evita que entre si el DBGrid no tiene nada asignado

if Assigned(DBGrid1.Fields[0]) then

Pero antes de implementarla el error era:
First chance exception at $006BE2FA. Exception class $C0000005 with message 'access violation at 0x006be2fa: read of address 0x00000000'.

¿ El modo en que accedes es con el código de tu mensaje en el evento OnKeyDown ?
Sí...

¿ En que evento/procedimiento se ejecuta la consulta inicial ?
R/ La consulta inicial se ejecuta en un DBLookComboBox1.CloseUp
La primera vez que selecciono un dato del DBLookComboBox1 me ejecuta la consulta y me refleja la información en el DBGrid. lo raro del asunto es que cuando me posiciono en un registro del DBGrid y le doy enter no hace nada por que supuetamente el DBgrid no tiene ningun Valor asigando. Esto no tiene logica pues pudo ver la información reflejada en el DBGrid.
Cuando vuelvo al DBLookComboBox1 y vuelvo a ejecutarlo ahora si puedo acceder a la información

¿ Para ejecutar la consulta por segunda vez llamas al mismo código ?
Sí...

¿ Se ejecuta algún código o dispara otro método entre la primer asignación que da error y la segunda que funciona ?
No...

ReiCk_Z
30-10-2015, 04:24:29
Hola AgustinOrtu

He analizado lo que dijistes:

No deberias acceder a los datos mediante el DBGrid. Lo correcto es usar el DataSet.

Y después de Aplicar tu sugerencia, me ejecuta el procedimiento a la primara, como debe ser.
Claro para esto me toco quitar la linea de código que tenia donde se comprobaba si el DBGrid tenia algo asignado.

Seria bueno saber a que se debe este comportamiento:
Que al ejecutar la consulta por primera vez el DBGrid muestre que no tiene nada asignado y al ejecutarlo por segunda vez si.

Si alguien sabe la razón le agradecería que la comentaran para ampliar nuestro conocimiento.

De todas maneras espero que este tema le sirva a las personas que estaban cometiendo este mismo error y que gracias a AgustinOrtu pude solventar.

También quiero agradecerle a ecfisa, por tomarse su tiempo y analizar mi pregunta.

AgustinOrtu
30-10-2015, 05:57:06
Solamente podemos adivinar si no tenemos el codigo

ecfisa
30-10-2015, 13:21:22
Hola ReiCk_Z

...
Pero antes de implementarla el error era:
First chance exception at $006BE2FA. Exception class $C0000005 with message 'access violation at 0x006be2fa: read of address 0x00000000'.

Seria bueno saber a que se debe este comportamiento:
Que al ejecutar la consulta por primera vez el DBGrid muestre que no tiene nada asignado y al ejecutarlo por segunda vez si.

Si alguien sabe la razón le agradecería que la comentaran para ampliar nuestro conocimiento.
...

Viendo el mensaje, muy probablemente el error se produce por que al momento de hacer la asignación a Edit5_01 la propiedad DataSource del DBGrid aún no ha sido asignada, o en alguna parte del código que se ejecutó previamente (¿ algún evento ?) fue modificada.

Saludos :)