PDA

Ver la Versión Completa : Problema out of bounds TObjectList con count mayor a cero


jasmad
21-11-2011, 20:58:58
Buenas,

En este momento me encuentro experimentando con las TObjectList, ya que estas son muy simples de usar para alguien que no sabe trabajar con punteros(como yo), todo iva excelente, cuando creo la lista lista := TObjectList.Create(true)

y empiezo añadir elementos lista.Add(Empleado)

, inclusive cuando hago esto tempEmpleado := (lista.Extract(lista[0]) as TEmpleado);

todo bien. Pero el item siguiente me genera error tempEmpleado := (lista.Extract(lista[1]) as TEmpleado);

con la excepcion de out of bounds indicando que el elemento en el index 1 no existe cuando ShowMessage(intttostr(lista.Count));

me muestra que es igual a tres. No se si esque estoy trabajando mal el list.

Gracias por la ayuda brindada

Neftali [Germán.Estévez]
22-11-2011, 10:39:32
Si sólo quieres acceder al ítem utiliza:


tempEmpleado := (lista.Items[0] as TEmpleado);


Piensa que con el Extract, además de acceder al elemento lo eliminas de las lista, por tanto los índices cambian (se decrementan).

Si utilizas por ejemplo un for para recorrer la lista y dentro de él un Extract, fallará el recorrido, a no ser que lo hagas en orden inverso.
¿Puedes poner el código completo que utilizas?

jasmad
22-11-2011, 17:58:15
gracias neftali el problema es el mismo que menciona, extraer saca el objeto inmediatamente y mueve los otros

//Esto me daba error porque se restan elementos
for i:=0 to lista.Count-1 do begin
tempEmpleado := (lista.Extract(lista[1]) as TEmpleado);
showMessage(inttostr(lista.Count));//mostrara valor diferente al inicial pero no se puede hacer nada ya que el for esta encaminado
end;

//esto sale bien
for i:=0 to lista.Count-1 do begin
tempEmp:=((lista[i]) as TEmpleado);
end;


disculpa no analice el procedimiento algo tan simple, esque estoy acostumbrado a ver la descripcion de los procedimientos y funciones en el autocompletar del ide y como lazarus no lo tiene no tengo como verlas ;P

Neftali [Germán.Estévez]
22-11-2011, 18:21:50
En caso de necesitar el Extract se trataría de hacerlo en orden inverso....


for i:=(lista.Count-1) downto 0 do begin
...

jasmad
06-12-2011, 22:06:46
ok lo tendre en cuenta gracias