Ir al contenido


Foto

Error al insertar en arrayº


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

#1 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 636 mensajes
  • LocationCiudad de México

Escrito 11 mayo 2017 - 01:51

Hola al grupo.

 

Tengo un problema con la inserciòn de elementos en un array dinàmico que explico a continuacòn.

 

Tengo un dataset con registros el cual paso a un objeto con propiedades al que se le asignan los valores del dataset, registro a registro, y se genera una inserciòn en un array previamente declarado.

 

Bien, todo perfecto, el array se genera, pero me estoy dando cuenta que cada que inserto un elemento, TODOS los elementos toman los valores del ùltimo elemento insertado. 

 

Es decir, tengo los elementos MARIA, PEDRO, JUAN, MARTA

 

Inserto el primero perfecto, pero cuando inserto el segundo, el primer elemento que se insertò como Marìa toma el valor de PEDRO, y el segundo pues ese es PEDRO, y cuando inserto el tercer elemento el primer y segundo elemento pasan a ser JUAN. 

 

Bueno, dejo un còdigo para ver si me pueden orientar.

 

Gracias


php
  1. var
  2. vlArregloMovi : Edo;
  3. vlArregloTotales : Array_Of_Edo;
  4.  
  5. Begin
  6. //-- Dataset al inicio
  7. self.oVTReg.FindFirst;
  8. for nCiclo := 0 to self.oVTReg.RecordCount -1 do
  9. Begin
  10.  
  11. vlArregloMovi := Edo.Create;
  12.  
  13. vlArregloMovi.Persona := Self.oVTReg.FieldByName('Persona').AsString;
  14. vlArregloMovi.mesPago := Self.oVTReg.FieldByName('Mes_Pago').AsString;
  15. vlArregloMovi.moneda := Self.oVTReg.FieldByName('Moneda').AsString;
  16. vlArregloMovi.Total := Self.oVTReg.FieldByName('Total').AsString;
  17.  
  18. SetLength(vlArregloTotales , nCiclo + 1 );
  19. vlArregloTotales [nCiclo] := vlArregloMovi;
  20. vlArregloMovi.DESTROY;
  21.  
  22. self.oVTReg.FindNext;
  23.  
  24. End;

Saludos y gracias por la ayuda.


Editado por FerCastro, 11 mayo 2017 - 01:53 .

  • 0

#2 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 636 mensajes
  • LocationCiudad de México

Escrito 11 mayo 2017 - 02:34

Depurando el proceso, veo que cuando hago destroy sobre el objeto que se inserta a la matriz de registros, los valores de todos los registros insertados en esta matriz se van a nulo, y vuelven a asignarse cuando se asignan desde el dataset, y el proceso se repite.

 

Alguna idea?


  • 0

#3 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 636 mensajes
  • LocationCiudad de México

Escrito 11 mayo 2017 - 03:10

Depurando el proceso, veo que cuando hago destroy sobre el objeto que se inserta a la matriz de registros, los valores de todos los registros insertados en esta matriz se van a nulo, y vuelven a asignarse cuando se asignan desde el dataset, y el proceso se repite.

 

Alguna idea?

 

Ya, no tengo que destruir el objeto, por alguna razòn se me ocurriò poner el destroy y se jodiò todo,

 

Bueno, saludos 


  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 11 mayo 2017 - 03:17

De lo que yo veo, ese código te deja un array con todos los elementos nulos, ya que está creando, asigna y luego elimina.

Cuando tu haces esto:


delphi
  1. MiArray[Posicion] := MiObjeto;

Le estás diciendo que en la posición del array apunte al objeto en cuestión.

 

Si luego haces:


php
  1. MiObjeto.Free; // No se debe usar Destroy

Estás liberando esa memoria por tanto dejando en nil la posición del vector correspondiente.

No debes eliminarlos. No al menos en esa parte del código si quieres mantener los objetos.

 

Por otro lado, además haces un mal uso de SetLength(). Estás generando una sobredimensión inncesaria. Y es una operación costosa. Ya que con cada redimensión debe copiarse los elementos actuales al nuevo tamaño. Lo mejor es definirle desde un principio el tamaño que tendrá si es conocida, o de un tamaño razonable y estimado en caso de no saberlo y recién redimensionar cuando nos quedemos sin espacio.

 

Como tu caso se trata de un valor conocido (y que es igual a la cantidad de registros del dataset) ya sabes la dimensión final que tendrá. Con una única llamada antes de entrar al for y dandole este tamaño es suficiente.

 

Saludos,


  • 0

#5 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 636 mensajes
  • LocationCiudad de México

Escrito 11 mayo 2017 - 04:50

De lo que yo veo, ese código te deja un array con todos los elementos nulos, ya que está creando, asigna y luego elimina.

Cuando tu haces esto:


delphi
  1. MiArray[Posicion] := MiObjeto;

Le estás diciendo que en la posición del array apunte al objeto en cuestión.

 

Si luego haces:


php
  1. MiObjeto.Free; // No se debe usar Destroy

Estás liberando esa memoria por tanto dejando en nil la posición del vector correspondiente.

No debes eliminarlos. No al menos en esa parte del código si quieres mantener los objetos.

 

Por otro lado, además haces un mal uso de SetLength(). Estás generando una sobredimensión inncesaria. Y es una operación costosa. Ya que con cada redimensión debe copiarse los elementos actuales al nuevo tamaño. Lo mejor es definirle desde un principio el tamaño que tendrá si es conocida, o de un tamaño razonable y estimado en caso de no saberlo y recién redimensionar cuando nos quedemos sin espacio.

 

Como tu caso se trata de un valor conocido (y que es igual a la cantidad de registros del dataset) ya sabes la dimensión final que tendrá. Con una única llamada antes de entrar al for y dandole este tamaño es suficiente.

 

Saludos,

 

 

Mi estimado Marchelo...

 

Ya quedò, gracias por los comentarios


  • 0




IP.Board spam blocked by CleanTalk.