Buenas, vengo por una tontera pero mi cabeza si sigue viendolo se va a trabar (más).
Les explico: tengo una clase llamemosle ClaseA que maneja una lista (me ayudo de un TObjectList como atributo privado) de una clase ClaseB.
ClaseB tiene puede ser de dos tipos: B1, y B2.
No hay subclases para manejar estos tipos. El diseño no lo amerita. Se maneja por un atributo simple.
Esta lista tiene la particularidad que puede estar llena, vacía, o más comunmente: parcialmente llena. ¿Cómo es eso? Si: ClaseA tiene como atributos y propiedades la cantidad total de items que va a tener, y se establece al momento de crearla.
En cualquier otro momento de su tiempo de vida, puede ir alterando la cantidad y por tanto es de esperarse que no en todo momento tenga todos los items cargados en ella. Es más, lo habitual es que tenga a medias.
Es de interés, que cuando se opere con los items, el índice se vaya "actualizando". Por ejemplo, ante una nueva agregación (.Add, no está contemplado ni se espera poder insertar en ciertas posiciones intermedias... por lo que no habrá .Insert()) el índice se cambia para apuntar al último elemento y nuevo elemento agregado. Hay un caso particular: Si la lista se encuentra completamente cargada, este Add() hace que se incremente la cantidad total.
De forma analoga pasa cuando uno quiere modificar algún item: existe tanto un Modify() sobrecargado que recibe el índice sobre el cual ubicarse, como también hay un Modify() que lee el actual valor del índice.
Es decir, cualquier "ABM" debe a la par, cambiar el valor del índice.
Los items estarán desordenados, por lo que no necesariamente estarán los de un tipo ubicados primero y luego los otros.
Esto lo llevo de buena manera... y aquí es donde se pone peliaguda: la eliminación... sea total, parcial, de un tipo u otro de B.
Tengo un Clear() que recibe como parámetro el tipo de B a eliminar. En esta situación no es problemática. Ya que se espera que el índice o bien apunte a 0, si es que queda al menos un item del otro tipo, o bien en -1 indicando que no hay items.
Con el ClearAll() no hay problema tampoco... indice pasa a -1.
El problema es un Delete(index) o su versión sobrecargada Delete(). Es decir... borrar un solo item.
Ustedes se preguntarán, ¿y cual es el problema? Recuerdan que dije que la lista puede que esté parcializada... pues eso me marea.
Internamente tengo dos contadores: uno para B1 y otro para B2. El contador no es más que un record:
TCounter = record Total, Parcial: integer; end;
Tengo también dos funciones:
ActualCount, y TotalCount. La primera me dice la cantidad total parcial (y actual) de items: B1.Parcial + B2.Parcial. Y Total, bueno se entiende: total de totales.
En mi Delete() debo actualizar este contador parcial, dependiendo del tipo claro. Y ahí es donde ya me hace dudar... ¿Cómo determinar el nuevo indice?
A ver si tiran ideas del posible algoritmo... porque hay que evaluar muchas cosas... si es el último, el primero, el del medio, si la lista ya quedó vacia...
Saludos,