Когда-то в школе изучали мы предмет "Алгоритмы и структуры данных". Во времена, когда под словом "графический интерфейс" подразумевались менюшки в стиле TurboVision, а каждую программу надо было начинать с насущной проблемы "куда и как ввести исходные данные" и уж только потом размышлять над хитростями и красотами алгоритма - типовые структуры данных вроде стека, очереди, списка, двусвязного списка являлись божественным откровением, до которого допереть своей фантазией было практически нереально.
Сейчас, когда поддержка типовых структур данных, да еще с дополнительными наворотами, встроена прямо в стандартную библиотеку языка программирования, а в соседней библиотеке есть все для работы с СУБД - кажется, что задумываться больше не о чем. Тем не менее это не так.
Если вы еще не прониклись идеей-Дзен, о том, что структуры данных, которыми оперирует программа, должны по возможности повторять структуры, применяемые в предметной области, пока это не противоречит достижению должного быстродействия и удобству работы пользователя, рассмотрим простенькие применения TStringList.
Ну с созданием, чтением и записью все более чем тривиально:
Var Config:TStringList;
Config:=TStringList.Create;
Config.LoadFromFile('config.cfg') ;
Config.SaveToFile('config.cfg') ;
С обработкой чуть интереснее: строки можно добавлять в конец по одной (Add), по нескольку (AddStrings), вставлять в нужную позицию (Insert). Если обработка не подразумевает стирания строк - по списку можно пробежаться от начала до конца:
If Config.Count>0 Then
For I:=0 To Config.Count-1 Do Begin
Config[I]:=Config[I]+'.';
End;
Первая строчка требуется, чтобы не вылететь за границы массива при обращении к первому же (нулевому) элементу, если список внезапно оказался пуст.
Если вы намереваетесь удалять строки - сканировать массив лучше от конца к началу
If Config.Count>0 Then
For I:=Config.Count-1 Downto 0 Do Begin
If (...) Then Config.Delete(I);
End;
Опять же для того, чтобы не вылететь за границы массива, только теперь при обращении к последним элементам. Дело в том, что границы цикла For будут определяются единожды - перед его началом, а в тот момент, когда Config.Count содержит изначальную длину списка. При удалении элементов список укорачивается, но цикл об этом не знает, поскольку не опрашивает Config.Count.
Для того, чтобы что-то в списке найти - необязательно просматривать все строки в цикле - можно спросить
I:=Config.IndexOf('что-то');
Как обычно для "0-based indexes" - т.е. нумераций, начинающихся с нуля (А это все List'ы, Items'ы и многое другое) - значение индекса "-1" означает отсутствие.
If I<0 then не_нашли;
Стандартные Паскалевские строки, с которыми работают функции Pos, Copy и.т.д., являются "1-based" - там отсутствию соответствует значение индекса "0".