Некоторые модификации методов 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; Некоторые модификации методов ReadSection и ReadSections объекта, типа TIniFile, позволяют решать проблемы нехватки оперативной памяти при чтении содержимого секций INI-файла. Комментарии и вопросыМатериалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |