Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2014, 08:15   #1
moon-guest
Пользователь
 
Аватар для moon-guest
 
Регистрация: 14.11.2010
Сообщений: 27
Сообщение Не стандартный INI

Доброго Всем!!!!
Имеется ini файл с не стандартным форматом секций(менять название секции или ключам не допустимо).
Код:
[VALUE
{channel=1}
{color=0}
{x=298}
{y=69}
{align=center}
{text_size=7}
{font_size=1}
]
....
[VALUE
{channel=2}
{color=0}
{x=86}
{y=35}
{align=center}
{text_size=7}
{font_size=1}
]
Создаю его как обычный текстовый файл, но имеется проблема со считыванием...
Считывание данных из секции уже реализовано, НО...

Как всем известно что выборка данных из секции производится из секции процедурой:
Код:
procedure ReadSectionValues(const Section: string; Strings: TStrings);
где первый параметр это Имя секции, а второй это контейнер под данные.
И так как у меня название секций по заданию должно быть одинаковым, то эта функция сводится на нет. Она считывает всегда первую секцию и успокаивается...

Перебора по id секции в этом классе не реализована (если мне не изменяет память) ).

Я решил добавить в класс TIniFile пару функций с одноименными именами:
Код:
procedure ReadSection(const IdSection: Integer; Strings: TStrings);
procedure ReadSectionValues(const IdSection: Integer; Strings: TStrings);
В оригинальной процедуре ReadSection поиск нужной секции производит функция:
Код:
function GetPrivateProfileString(lpAppName, lpKeyName, lpDefault: PChar;
  lpReturnedString: PChar; nSize: DWORD; lpFileName: PChar): DWORD; stdcall;
И сам вопрос чем можно её заменить или может у кого нибудь есть другое видение как считать поэтапно каждую секцию?
moon-guest вне форума Ответить с цитированием
Старый 13.11.2014, 08:22   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Это не INI файл. Работай с ним как с обычным текстовым файлом и всё. Или если уж так охото работать через TIniFile, то на время преобразуй этот файл в INI, а потом наоборот.
UPD: В INI преобразовать не получиться, т.к. имена секций будут одинаковые [VALUE], хотя можно имена сейкий брать channel

Последний раз редактировалось FaTaL; 13.11.2014 в 08:27.
FaTaL вне форума Ответить с цитированием
Старый 13.11.2014, 08:32   #3
moon-guest
Пользователь
 
Аватар для moon-guest
 
Регистрация: 14.11.2010
Сообщений: 27
По умолчанию

То что это не Ini файл в его нормальном виде, я и сам понимаю. Но функции класса TIniFiles его вполне нормально обрабатывают. Вопрос в другом как перебирать секции с одинаковыми ИМЕНАМИ?!!!!

Менять название секции или ключи не допустимо!!!

Последний раз редактировалось Stilet; 13.11.2014 в 09:44.
moon-guest вне форума Ответить с цитированием
Старый 13.11.2014, 08:45   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Это не INI файл. Работай с ним как с обычным текстовым файлом и всё.
+1
Это не INI файл. Поэтому с ним нельзя работать методами TINIFiles
Забудьте про INI, пишите свои обработчики и будет Вам Счастье!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.11.2014, 08:48   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Пиши свой парсер.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 13.11.2014, 09:35   #6
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,834
По умолчанию

Больше на JSON похоже.
В разработке: воспроизводственный контур ИТ
Vapaamies на форуме Ответить с цитированием
Старый 13.11.2014, 09:44   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Да как-то не особо похоже.
http://en.wikipedia.org/wiki/JSON#Da...ax_and_example
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.11.2014, 09:45   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
с одинаковыми ИМЕНАМИ?!!!!
Чего кричишь? сказали же - работай с ним как с обычным текстовиком. Не стоит использовать TIniFile в этом случае.
Цитата:
Да как-то не особо похоже.
Верно. Это какая-то самописка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.11.2014, 10:28   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Больше на JSON похоже.
На XML тож смахивает.
Я бы за полчаса-час класс для работы написал.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 13.11.2014, 13:05   #10
moon-guest
Пользователь
 
Аватар для moon-guest
 
Регистрация: 14.11.2010
Сообщений: 27
По умолчанию

Цитата:
По совету Stilet
Чего кричишь? сказали же - работай с ним как с обычным текстовиком.
Сделал парсер как для обычного текстовика и вставил в функцию:
Код:
procedure TIniFile.ReadSectionId(const IdSection: Integer; Strings: TStrings);
var
  _file: TextFile;
  c:char;
  k,v: integer;
  s: string;
begin
  v:=0;
  k:=0;
  s:='';
    Strings.BeginUpdate;
    try
      Strings.Clear;
      AssignFile(_file, FileName);
      Reset(_file);
      while not eof(_file) do begin // пока не конец файла
        if k <> 0 then break;
        read(_file, c);             // читаем из файла по символьно
        if c in ['['] then inc(v); // для поиска начала секции
        if v = IdSection then begin // если нужная секция
          while not eof(_file) do begin  // пока не конец сессии и файла
            k:=-2;
            read(_file, c);
            if (c in ['{']) then   // для поиска {ключ=значение}
              while not eof(_file) do begin // пока не конец секции {ключ=значение} и файла
                k:=-1;
                read(_file, c);
                if not(c in ['}', ']']) then  // не конец секции {ключ=значение} или общей
                  s:=s+c // запоминаем
                else begin  // иначе
                  Strings.Add(s);
                  s:='';
                  k:=1;
                  break;
                end;
              end;
             if (c in [']']) then begin
              k:=2;
              break;
             end;
          end;
        end;
      end;
      if k < 1 then Strings.Clear;
    finally
      Strings.EndUpdate;
      CloseFile(_file);
    end;
end;
Это если кому интересно...

Последний раз редактировалось moon-guest; 13.11.2014 в 13:22.
moon-guest вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стандартный поток вывод Joker_vad Общие вопросы C/C++ 1 22.04.2013 11:09
Стандартный заголовок модулей _-Re@l-_ Свободное общение 3 25.03.2011 11:28
Как пересмотреть все секции в INI.ini ? iskurt Помощь студентам 1 31.01.2010 07:48
Не стандартный график denverus Общие вопросы Delphi 5 06.02.2008 22:49
стандартный вопрос Алёна Общие вопросы Delphi 5 18.03.2007 07:54