Некоторые модификации методов ReadSection и ReadSections объекта, типа TIniFileDelphi , Файловая система , INI файлыНекоторые модификации методов ReadSection и ReadSections объекта, типа TIniFile
Автор: VID { **** UBPFD *********** by delphibase.endimus.com **** >> Некоторые модификации методов ReadSection и ReadSections объекта, типа TIniFile Отличие функции ReadSectionEx от метода ReadSection, объекта типа TIniFile, заключается в том, что размер буффера для сохранения содержимого файла, не является константой (16Кб, в модуле IniFiles.pas), а представляет собой переменную величину, значение которой равно размеру файла инициализации (IniFileName). Таким образом решается проблема, с нехваткой выдыленного размера оперативной памяти для операции чтения содержимого секции (SectionName). Так же, в случае успешнонго выполнения чтения секции Ini-файла, функция возвращает количество строк в заполненном списке (Strings) Функция ReadSectionsEx имеет те же отличия от метода ReadSection, что и функция ReadSectionEx от метода ReadSection. Функция ReadSectionsEx помещает в список Strings все секции указанного INI-файла (IniFileName) Зависимости: Windows, SysUtils, Classes, IniFiles Автор: VID, vidsnap@mail.ru, ICQ:132234868, Махачкала Copyright: VID (базируется на коде соответствующих методов, в модуле IniFiles.pas) Дата: 24 мая 2002 г. ***************************************************** } unit INIExtension; interface uses Windows, SysUtils, Classes, IniFiles; function ReadSectionsEx(IniFileName: string; Strings: TStrings): Integer; function ReadSectionEx(IniFileName: string; SectionName: string; Strings: TStrings): Integer; implementation function ReadSectionsEx(IniFileName: string; Strings: TStrings): Integer; var BufSize: Integer; SR: TSearchRec; buffer, P: Pchar; begin Result := -1; if not FileExists(IniFileName) then EXIT; FindFirst(IniFileName, faAnyFile, SR); BufSize := Sr.Size; FindClose(SR); GetMem(Buffer, BufSize); try Strings.BeginUpdate; try Strings.Clear; if GetPrivateProfileSectionNames(buffer, BufSize, Pchar(IniFileName)) <> 0 then begin P := Buffer; while P^ <> #0 do begin Strings.Add(P); Inc(P, StrLen(P) + 1); end; end; Result := Strings.Count; finally Strings.EndUpdate; end; finally FreeMem(Buffer, BufSize) end; end; function ReadSectionEx(IniFileName: string; SectionName: string; Strings: TStrings): Integer; var BufSize: Integer; SR: TSearchRec; buffer, P: Pchar; begin Result := -1; FindFirst(IniFileName, faAnyFile, SR); BufSize := Sr.Size; FindClose(SR); GetMem(Buffer, BufSize); try Strings.BeginUpdate; try Strings.Clear; if GetPrivateProfileString(PChar(SectionName), nil, nil, Buffer, BufSize, PChar(IniFileName)) <> 0 then begin P := Buffer; while P^ <> #0 do begin Strings.Add(P); Inc(P, StrLen(P) + 1); end; end; Result := Strings.Count; finally Strings.EndUpdate; end; finally FreeMem(Buffer, BufSize) end; end; end. Пример использования: var TargetList: TStringList; Ini: TIniFile; begin TargetList := TStringList.create; Ini := TiniFile.create('system.ini'); //Заполняем список TargetList параметрами секции boot ReadSectionEx(Ini.FileName, 'Boot', TargetList); //Заполняем список TargetList именами всех секций ReadSectionsEx(Ini.FileName, TargetList); Ini.Free; TargetList.Free; end; Перевод: Код, предоставленный ниже, является расширением встроенного компонента Delphi Расшифровка каждой функции:
Основные отличия этих функций от стандартных методов
Эти изменения могут быть полезны при работе с большими файлами INI или при необходимости иметь больше контроля над процессом чтения. Пример использования, предоставленный ниже, демонстрирует, как использовать эти функции для чтения секций из файла INI. Он создает объект Однако в этом коде есть некоторые потенциальные проблемы:
Вот обновленная версия функций с учетом этих проблем:
Вот обновленный пример использования:
В этом коде предполагается, что файл INI существует и может быть прочитан. Если это не так, он выйдет без чтения ничего. Более robust версия кода включала бы обработку ошибок для этих случаев. Некоторые модификации методов ReadSection и ReadSections объекта, типа TIniFile, позволяют решать проблемы нехватки оперативной памяти при чтении содержимого секций INI-файла. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |