a rotina para ler o arquivo poderia ser assim:
var
C: Integer;
F: IniFile;
S: String;
L: TStringList;
begin
F := TIniFile.Create('arquivo.ini');
L := TStringList.Create;
C := 1;
S := F.ReadString('programas', 'Programas instalados' + IntToStr(C)', '');
while(S <> '') do
begin
L.Text := StringReplace(S, '|', #13#10, [rfReplaceAll]);
..........{rotinas com cada linhas do L, use outro contador}
Inc(C);
S := F.ReadString('programas', 'Programas instalados' + IntToStr(C)', '');
end;
F.Free;
end;