DMarlon Studio

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.

Pascal · TStringList a fondo en DMarlon Studio: el código del ejemplo y su salida en la terminal

`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 := True ordena y mantiene el orden en cada Add.
  • CommaText trocea y une textos separados por comas.
  • Find busca deprisa, pero solo en listas ordenadas.
  • Values['nombre'] lee y escribe pares nombre=valor.
  • LoadFromFile y SaveToFile leen 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'].