Bueno kbaby, he terminado el ejemplo. Espero que con el ejemplo se entienda.
El ejemplo consiste en un código que guarda y abre un archivo de texto.
Puedes comprobar que funciona para uno o más datos... no importa cuandos cambios sean. Notarás que que se hacen en directo: en su posición natural. Nada de estar eliminando y agregando.
Separé el código en funciones y procedimientos a propósito para tu notaras como es que se reutiliza código y además para no darte todo regalado.
Estudia el código no pierdas esfuerzo en comprender que es un procedimiento y que es una función. Lo descubrirás a medida de veas código.
Te explico porqué funciona.
Básicamente tenemos una estructura de esta forma en el archivo:
0 - DNI
1 - NOMBRE
2 - APELLIDO
3 - CIUDAD
y se va repitiendo. Bueo imagina ahora que la primera persona tiene un valor indice 0. La segunda un indice 1, y asi sucesivamente. Entonces podemos afirmar esto:
Código:
Posicion en archivo | Indice o posición de la persona
-----------------------------------------------------------------
0 - DNI1 | 0 - Persona1
1 - Nombre1 |
2 - Apellido1 |
3 - Ciudad1 |
.................................................................
4 - DNI2 | 1 - Persona2
5 - Nombre2 |
6 - Apellido2 |
7 - Ciudad2 |
.................................................................
Si te fijas bien, el indice a cada persona incrementa sólo cuando se tienen todos los datos. Por tanto si extraemos el dato para la persona1, sus datos iran desde 0 a 3, para la segunda de 4 a 7.
¿Que tiene en común el indice con la posición de los datos?
Fácil: su división entera con 4.
Hagamos cálculos:
0 div 4 = 0
...
3 div 4 = 0
4 div 4 = 1
...
7 div 4 = 1
8 div 4 = 2
Veamos... en posición 8, quien comienza... exacto! Una nueva persona.
¿Que hago yo?
Me valgo de ese indice para tener referencia a la persona. Ese indice lo tengo que guardar en algún lado para poder recuperar los datos desde la rejilla hacia el LisBox.
Yo preferí guardar ese dato, en la columna 0 de la rejilla de modo que se impida modificarlo. En las demás celdas de dicha fila se guardan sus datos.
¿Cómo se hace entonces?
1. Leer de la fila i-ésima del StringGrid la columna 0. Guardar dicho dato en una variable. Yo la llamé indice.
Código Delphi
[-]indice := STringGrid1.Cells[0,i]
2. Teniendo ese índice puedo hacer el paso inverso:
2.1. Como en la columna 1 (j = 1) tenemos el DNI, entonces el DNI para dicha persona en el ListBox ocupa la posición k = (Indice x 4)
Entonces hacemos:
Código Delphi
[-]ListBox1.Items[k] := TStringGrid.Cells[1,i]
2.2. Como en la columna 2 (j = 2) tenemos el Nombre, entonces el Nombre para dicha persona en el ListNox ocupa la posición k = (Indice x 4) + 1:
Código Delphi
[-]ListBox1.Items[k] := TStringGrid.Cells[2,i]
2.3. Como en la columna 3 (j = 3) tenemos el Apellido, entonces el Apellido
para dicha persona en el ListBox ocupa la posición k = (Indice x 4) + 2:
Código Delphi
[-]ListBox1.Items[k] := TStringGrid.Cells[3,i]
En forma general se tiene que cualquier dato ocupa una posición k-ésima en el listBox en base a esta fórmula:
k := (Indice x 4) + (j - 1)
Siendo j la columna del dato que leemos.
De forma inversa, podemos afirmar que:
STringGrid1.Cells[PosDato,i] := ListBox1.Items[(Indice x 4) + (PosDato - 1)]
Siendo PosDato la posición en que vienen:
1 -> DNI
2 -> Nombre
3 -> Apellido
4 -> Ciudad
Nuevamente, aconsejo revisar el código que te paso. Haz lo siguiente, seleccona algún botón, por ejemplo el Botón "Buscar Todos". Haz doble click y verás esto:
Código Delphi
[-]procedure TfrmPrincipal.bBuscarTodosClick(Sender: TObject);
var cantidad: integer;
begin
LimpiarRejilla;
cantidad := BuscarYVolcar(eBuscar.Text,rgOpcion.ItemIndex);
if Cantidad = 0
then ShowMessage('No se encontraron concidencias')
else begin
sgRejilla.Enabled := true;
bVolcarAListBox.Enabled := true;
end;
end;
¿Que es ese LimpiarRejilla?
Para saber lo que hace, debes presionar Crtl y dar click en dicha línea. Notarás que mientras tengas presionada la tecla Crtl, el cursos cambiará a la forma de mano y que el código parece ser un link.
Pues eso es: te "linkea" hacia el código. En este ejemplo al código de LimpiarRejilla.
De igual manera puedes hacer con BuscarYVolcar, y cualquier código que veas.
Y nuevamente, analiza en frio y notarás como funciona el código.
Te aconsejo que primero lo compiles y pruebes el ejecutable, sin mirar código... después analiza el código.
Está correctamente escrito con comentarios para que se entienda.
Espero tus novedades.
Saludos,