Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1269
Благодарности: 1027

Профиль | Отправить PM | Цитировать


Цитата Johny777:
скажи только пожалуйста как получить индекс ключа и секции по имени оных? »
Johny777, перебором элементов массив(ов)а. Ты, пока не исправил свой пост, использовал функцию IndexOf класса TStrings. С его использованием код можно упростить, ведь в арсенале TStrings есть все необходимое для обработки строк типа name=value:
читать дальше »

Код: Выделить весь код
type
    TIniFile = array of record
        Section: String;
        Entries: TStringList;
    end;

function ParseIniFile(const Filename: String): TIniFile;
var
    iFile: TArrayOfString;
    i: Integer;
begin
    if not FileExists(Filename) then Exit;
    SetArrayLength(Result, 0);
    LoadStringsFromFile(Filename, iFile);
    for i := 0 to GetArrayLength(iFile)-1 do
    begin
        //для всех непустых строк, исключая комментарии
        if (iFile[i] <> '') and (Copy(iFile[i], 1, 1) <> ';') then
        begin
            //если строка является секцией...
            if (Pos('[', iFile[i]) = 1) and (Pos(']', iFile[i]) = Length(iFile[i])) then
            begin
                //...пишем в результат имя секции...
                SetArrayLength(Result, GetArrayLength(Result)+1);
                Result[GetArrayLength(Result)-1].Section := Copy(iFile[i], 2, Length(iFile[i])-2);
            end
                else
            begin
                //...иначе пишем пару параметр/значение
                if TObject(Result[GetArrayLength(Result)-1].Entries) = nil then
                    Result[GetArrayLength(Result)-1].Entries := TStringList.Create;
                Result[GetArrayLength(Result)-1].Entries.Append(iFile[i]);
            end;
        end;
    end;
end;

//своя функция для чтения значений параметров из секций
function GetIniValue(const Section, Key, Default: String; iFile: TIniFile): String;
var
    i, j: Integer;
begin
    Result := Default;
    for i := 0 to GetArrayLength(iFile)-1 do if CompareText(iFile[i].Section, Section) = 0 then
    begin
        for j := 0 to iFile[i].Entries.Count-1 do if CompareText(iFile[i].Entries.Names[j], Key) = 0 then
        begin
            Result := iFile[i].Entries.Values[Key];
            Break;
        end;
        Break;
    end;
end;

procedure InitializeWizard();
var
    iFile: TIniFile;
    i: Integer;
    res: String;
begin
    //парсим ini-файл
    iFile := ParseIniFile('d:\Program Files (x86)\Inno Setup 5\projects\johny777\test.ini');

    //пример 1 - выводим на экран содержимое ini-файла, используя созданную переменную iFile
    for i := 0 to GetArrayLength(iFile)-1 do
        res := res + '[' + iFile[i].Section + ']' + #13#10 + iFile[i].Entries.Text;
    MsgBox(res, mbInformation, MB_OK);
    
    //пример 2 - выводим на экран значение параметра name34 секции section2, используя созданную переменную iFile и свою функцию GetIniValue
    MsgBox(GetIniValue('section2', 'name34', '', iFile), mbInformation, MB_OK);
end;


Цитата R.i.m.s.k.y.:
я тоже поначалу так пробовал, полная фигня получается
Теперь делаю через стороннюю утилитку pathman »
R.i.m.s.k.y., например? Это вполне нормальный способ, вышеназванная утилита делает то же самое.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:14, 11-09-2012 | #897