Lección 13 · 13 de 20
TStringList a fondo · Pascal
Ordene, busque y guarde pares nombre=valor con TStringList, la lista de textos de la unidad Classes que usa todo programa en Free Pascal y Lazarus.

`TStringList` (unidad Classes) es la navaja suiza de Pascal para trabajar con textos. Con `Sorted := True`, la lista se ordena y cada Add posterior va directo a su sitio. `CommaText` sirve en los dos sentidos: al asignarlo, trocea el texto por las comas; al leerlo, une los elementos.
`Find` hace una búsqueda binaria, muy rápida en listas grandes, y solo funciona con la lista ordenada. Devuelve True si encuentra el texto y deja su posición en el parámetro index: Navarro está en la 3, contando desde 0. Para listas sin ordenar está IndexOf. Al añadir Castro, aparece entre Blanco y Garcia sin que haya que reordenar.
La segunda lista guarda líneas `nombre=valor`, como un fichero de configuración (aquí, la conexión a una base de datos de Odoo). `Values['port']` devuelve el valor de ese nombre, y asignarlo cambia la línea si existe o añade una nueva al final, como pasa con user.
`Names[3]` y `ValueFromIndex[3]` dan el nombre y el valor de la línea 3 por su posición. Con LoadFromFile y SaveToFile la misma lista lee y escribe un fichero .ini o .conf entero en una línea. Es un objeto, así que se libera en el finally.
Código · main.pas
program main;uses Classes;var clients, config: TStringList; index: Integer;begin clients := TStringList.Create; config := TStringList.Create; try clients.Sorted := True; // sorts and keeps every Add in its place clients.CommaText := 'Ruiz,Alonso,Navarro,Garcia,Blanco'; WriteLn('Clients: ', clients.CommaText); if clients.Find('Navarro', index) then // binary search WriteLn('Navarro is at index ', index); clients.Add('Castro'); WriteLn('With Castro: ', clients.CommaText); config.Add('host=localhost'); config.Add('port=8069'); config.Add('database=odoo_demo'); WriteLn('Port: ', config.Values['port']); config.Values['port'] := '8070'; // changes an existing name config.Values['user'] := 'admin'; // a new name is appended WriteLn(config.Names[3], ' = ', config.ValueFromIndex[3]); WriteLn('Config: ', config.CommaText); finally clients.Free; config.Free; end;end.Salida · fpc main.pas && ./main
Clients: Alonso,Blanco,Garcia,Navarro,Ruiz Navarro is at index 3 With Castro: Alonso,Blanco,Castro,Garcia,Navarro,Ruiz Port: 8069 user = admin Config: host=localhost,port=8070,database=odoo_demo,user=admin
Para recordar
Sorted := Trueordena y mantiene el orden en cadaAdd.CommaTexttrocea y une textos separados por comas.Findbusca deprisa, pero solo en listas ordenadas.Values['nombre']lee y escribe paresnombre=valor.LoadFromFileySaveToFileleen y guardan la lista entera.
Ejercicio
Guarde config en odoo.conf con SaveToFile, cree otra TStringList, cárguelo con LoadFromFile y escriba su Values['database'].