Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TIniFile. Работа с Ini-файлами в Delphi. 
:(
    Опции темы
THandle
Дата 26.2.2008, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow

Репутация: 65
Всего: 372



                                  TIniFile. Работа с Ini-файлами в Delphi. 



Что такое Ini файл?

  Ini файлы – это простые текстовые файлами с расширением .ini(в принципе можно и с любым другим). Обычно они хранятся в каталоге Windows. Ini файлы предназначены для хранения настроек программы. 

Ini файлы разделены на разделы, содержащие идентификаторы, которым, в свою очередь, можно присвоить значения. 
В общем виде структура Ini файла такова:

Цитата

 
[Раздел1]

Идентификатор1=Значение1
Идентификатор2=Значение2

[Раздел2]
 
Идентификатор1=Значение1

И т.д.


  Выражение  Идентификатор = Значение очень часто называют ключом.

  В Delphi работа с Ini файлами производится посредствам класса TIniFile, объявленного в юните IniFiles. TIniFile наследуется от класса TCustomIniFile, который в свою очередь, является прямым потомком TObject.



Теперь рассмотрим свойства и методы класса TIniFile.



Метод Create.

  Объявлен как:

Код

constructor Create(const FileName: string);


  Метод Create создает экземпляр класса TIniFile, который позволяет манипулировать Ini файлом, имя которого передаётся в параметре FileName. 
  Если явно не указать, где именно нужно создать или найти Ini файл, Ваша программа будет искать его  в каталоге Windows.


Пример:

Код

Uses IniFiles; // не забываем подключить модуль IniFiles

Procedure IniFileProc;
Var
  Ini : TIniFile;
Begin
  Ini := TIniFile.Create('TestIniFile.ini'); //Ini файл с именем TestIniFile будет создан в каталоге Windows
  Ini.Free;
end;





Свойство FileName.

  Объявлено как:

Код

    property FileName: string read FFileName.


  Это read only свойство хранит в себе имя Ini файла.
Значение FileName присваивается только один раз во время работы с экземпляром класса TIniFile – в методе Create.

Пример:

Код

Uses IniFiles;

Procedure IniFileProc;  
var
  Ini : TIniFile;
Begin
  Ini := TIniFile.Create('TestIniFile.ini');
  ShowMessage(Ini.FileName); // показываем сообщение с именем нашего Ini файла
  Ini.Free;
end;


PS:  Для работы данного примера так же следует подключить модуль Dialogs, так как в нем объявлена процедура ShowMessage.


 
Методы WriteString, ReadString.


Объявлены следующим образом:

Код

    procedure WriteString(const Section, Ident, Value: String); override;

    function ReadString(const Section, Ident, Default: string): string; override;

    
Процедура WriteString записывает в раздел Section, в ключ с идентификатором Ident строку Value.

Функция ReadString читает из раздела Section строку из ключа с идентификатором Ident. Если такой раздел или ключ не обнаружены в файле, то функция вернет заданный Вами параметр Default.


Пример:
  
Код

Uses IniFiles;

Procedure IniFileProc;
Var
  Ini : TIniFile;
Begin
  Ini := TIniFile.Create('TestIniFile.ini'); 
  Ini.WriteString('Section1','Ident1','Value1');// записываем в Ini файл строку
  ShowMessage(Ini.ReadString('Section1','Ident1', 'Ключ не существует')); // читаем эту строку и показываем её в сообщении
// Результат: сообщение с надписью ‘Value1’
  ShowMessage(Ini.ReadString('Section1','Ident2','Ключ не существует'));//Теперь попробуем прочитать несуществующий ключ
// Результатом будет такое же окошко как и в предыдущий раз, но надпись будет другая, а именно – 'Ключ не существует'
  Ini.Free;
end;     
        



Методы WriteInteger, ReadInteger.

Объявлены как:

Код

procedure WriteInteger(const Section, Ident: string; Value: Longint); virtual;

function ReadInteger(const Section, Ident: string; Default: Longint): Longint; virtual;


Процедура WriteInteger записывает в ключ Ident находящийся в разделе Section целое число Value. 

Функция ReadInteger читает целое число из ключа с идентификатором Ident находящегося в разделе Section.

PS: На самом деле в файл будут записаны не числа, а строки. То есть в WriteInteger в файл пишется не само Value, а преобразованное в строку число -  IntToStr(Value). А в ReadInteger читается сначала строка, а в результате передаётся строка, преобразованная в число с помощью функции StrToInt.

Пример:
  См. примеры к методам ReadString, WriteString.



Методы WriteFloat, ReadFloat.

Объявлены как:
Код


procedure WriteFloat(const Section, Name: string; Value: Double); virtual;

function ReadFloat(const Section, Name: string; Default: Double): Double; virtual;


Процедура WriteFloat записывает в ключ Ident находящийся в разделе Section натуральное число Value. 

Функция ReadFloat читает натуральное число из ключа с идентификатором Ident находящегося в разделе Section.

PS: Аналогично Write(Read)Integer в файл пишется не само число, а строки. Но в ReadFloat, если не удастся сконвертировать строку в натуральное число, поднимется исключение типа EConvertError.

Пример:
  См. примеры к методам ReadString, WriteString.



Методы WriteBool, ReadBool.

Объявлены как:

Код

procedure WriteBool(const Section, Ident: string; Value: Boolean); virtual;

function ReadBool(const Section, Ident: string; Default: Boolean): Boolean; virtual;


Процедура WriteBool записывает в ключ Ident находящийся в разделе Section натуральное число Value. 

Функция ReadBool читает натуральное число из ключа с идентификатором Ident находящегося в разделе Section.

PS: Аналогично Write(Read)Integer(Float) в файл пишется не само число, а строки. Точнее либо '1', либо '0'. 

Пример:
  См. примеры к методам ReadString, WriteString. 



Методы WriteDate, ReadDate. 

Объявлены как:

Код

procedure WriteDate(const Section, Name: string; Value: TDateTime); virtual;

function ReadDate(const Section, Name: string; Default: TDateTime): TDateTime; virtual;



  WriteDate записывает в раздел с именем Section ключ с идентификатором Name и значением Value. 

  Функция ReadDate читает значение ключа с идентификатором Name, находящегося в разделе Section. Если ключ не найден, то результатом работы функции будет параметр Default. Если в ключе находится значение отличное от типа TDateTime, будет поднято исключение EConvertError. Так же как и во всех предыдущих методах чтения/записи, в Ini файле, после записи в него даты, будут находится строки, а при чтении будет выполнено преобразование в TDateTime.


Пример:


Код

Uses IniFiles;

Procedure IniFileProc;
Var
  Ini : TIniFile;
Begin
  Ini := TIniFile.Create('TestIniFile.ini');
  Ini.WriteDate('Section1','Date1',StrToDate('01.01.2000');// запишем в файл дату, к примеру первое января 2000 года
  ShowMessage(DateToStr(ini.ReadDate('Section1','Date1',Now)));// А теперь читаем дату из файла и показываем её в сообщении. Если ключ Date1 не будет найден, то в сообщении будет показана текущая дата
  Ini.Free;
end;     
        



Методы WriteTime, ReadTime.


Объявлены как:

Код

procedure WriteTime(const Section, Name: string; Value: TDateTime); virtual;

function ReadTime(const Section, Name: string; Default: TDateTime): TDateTime; virtual;

    
  WriteTime, ReadTime являются полными копиями WriteDate, ReadDate, но пишут не дату, а время.

Пример:
  См. Пример к методам WriteDate, ReadDate.


Методы WriteDateTime, ReadDateTime.


Объявлены как:

Код

procedure WriteDateTime(const Section, Name: string; Value: TDateTime); virtual;

function ReadDateTime(const Section, Name: string; Default: TDateTime): TDateTime; virtual;


Эти два метода класса TIniFile записывают в файл дату и время и соответственно читают их. В остальном они схожи с WriteDate и ReadDate. 
                            
Пример:
  См. Пример к методам WriteDate, ReadDate.



Методы WriteBinaryStream, ReadBinaryStream.

Объявлены как:
   
Код

procedure WriteBinaryStream(const Section, Name: string; Value: TStream); virtual;

function ReadBinaryStream(const Section, Name: string; Value: TStream): Integer; virtual;


  Процедура WriteBinaryStream записывает в ключ с идентификатором Name раздела Section данные из потока Value. Во время работы процедуры данные из потока преобразуются в шестнадцатеричную строку, и уже после этого записываются в файл.   

  Функция ReadBinaryStream читает в поток Value значение ключа с идентификатором Name, находящегося в разделе Section. Результатом является размер потока.

Пример:
  Положите на форму компонент TMemo и две кнопки(TButton).

Код


Uses IniFiles;

//По нажатию первой кнопки записываем в Ini файл текст из Memo в шестнадцатеричном виде

procedure TForm1.Button1Click(Sender: TObject);
var
  ini: TIniFile;
  s: TMemoryStream;
begin
  s := TMemoryStream.Create;
  Ini := TiniFile.Create('TestIniFile.ini');
  Memo1.Lines.SaveToStream(S);
  s.Position := 0;
  ini.WriteBinaryStream('Section1', 'Stream1', s);
  ini.Free;
  s.Free;
end;



// по нажатию второй кнопки читаем данные из файла и помещаем их в Memo

procedure TForm1.Button3Click(Sender: TObject);
var
  ini: TIniFile;
  s: TMemoryStream;
begin
  s := TMemoryStream.Create;
  Ini := TiniFile.Create('TestIniFile.ini');
  ini.ReadBinaryStream('Section1', 'Stream1', s);
  Memo1.Lines.LoadFromStream(s);
  ini.free;
  s.free;
end;




Метод ReadSection.

Объявлен как:

Код

  procedure ReadSection(const Section: string; Strings: TStrings); override;


Читает все идентификаторы ключей в разделе Section и заносит их в Strings.

Пример:

  Положите на форму компонент TMemo.

Код


Uses IniFiles;


Procedure IniFileProc;
Var
  Ini : TIniFile;
Begin
  Ini := TIniFile.Create('TestIniFile.ini');
  // запишем три ключа в один раздел
  Ini.WriteString('Section1','Ident1','Value1');
  Ini.WriteString('Section1','Ident2','Value2');
  Ini.WriteString('Section1','Ident3','Value3');
  Ini.ReadSection('Section1', Memo1.Lines);//а теперь добавим идентификаторы этих ключей в Memo
  Ini.Free;
end;    
         

  
Результат:

  В Memo1 отобразится следующий список:

Цитата

   Ident1
   Ident2
   Ident3




               
Метод ReadSections.

Объявлен как:
 
Код

   procedure ReadSections(Strings: TStrings); override;


Читает имена всех разделов в Ini файле и заносит их в Strings.

Пример:

  Положите на форму компонент TMemo.

Код


Uses IniFiles;


Procedure IniFileProc;
Var
  Ini : TIniFile;
Begin
  Ini := TIniFile.Create('TestIniFile.ini');
  // запишем три раздела в Ini файл
  Ini.WriteString('Section1','Ident1','Value1');
  Ini.WriteString('Section2','Ident2','Value2');
  Ini.WriteString('Section3','Ident3','Value3'); 
  //а теперь добавляем имена этих разделов  в Memo
  Ini.ReadSections(Memo1.Lines);
  Ini.Free;
end; 
            

  
Результат:

  В Memo1 отобразится следующий список:

Код

   Section1
   Section2
   Section3




Метод ReadSectionValues.

Объявлен как:
    
Код

procedure ReadSectionValues(const Section: string; Strings: TStrings); override;


Читает все ключи (идентификатор=значние) в разделе Section и заносит их в Strings.

Пример:

  Положите на форму компонент TMemo.

Код


Uses IniFiles;


Procedure IniFileProc;
Var
  Ini : TIniFile;
Begin
  Ini := TIniFile.Create('TestIniFile.ini');
  //запишем три ключа в один раздел Ini файла
  Ini.WriteString('Section1','Ident1','Value1');
  Ini.WriteString('Section1','Ident2','Value2');
  Ini.WriteString('Section1','Ident3','Value3');
  //а теперь добавляем эти ключи в Memo
  Ini.ReadSectionValues('Section1', Memo1.Lines);
  Ini.Free;
end;  
           


Результат:

  В Memo1 отобразится следующий список:
Цитата


     Ident1=Value1
     Ident2=Value2
     Ident3=Value3




Метод DeleteKey.

Объявлен как:

Код

   procedure DeleteKey(const Section, Ident: String); override;


  Метод DeleteKey удаляет из Ini файла ключ в разделе Section с идентификатором Ident.

Пример:

Код

Uses IniFiles;


Procedure IniFileProc;
Var
  Ini : TIniFile;
Begin
  Ini := TIniFile.Create('TestIniFile.ini'); 
  Ini.DeleteKey('Section1', 'Ident1'); // удаляем из раздела Section1 ключ с идентификатором Ident1
  Ini.Free;
End;




Метод EraseSection.

Объявлен как:   
  
Код

  procedure EraseSection(const Section: string); override;


  Метод EraseSection удаляет целый раздел из Ini файла. Параметр Section – имя раздела, который надо удалить.


Пример:


Код

Uses IniFiles;


Procedure IniFileProc;
Var
  Ini : TIniFile;
Begin
  Ini := TIniFile.Create('TestIniFile.ini'); 
  Ini.EraseSection('Section1');// удаляем раздел Section1
  Ini.Free;
End;




Метод ValueExists.

Объявлен в виде следующей функции:    

Код

   function ValueExists(const Section, Ident: string): Boolean;


  Функция проверяет наличие ключа с идентификатором Ident в разделе Section Ini файла. Если данный ключ в разделе присутствует - функция вернет true, иначе false.

Пример:

Код

Uses IniFiles;

Procedure IniFileProc;
Var
  Ini : TIniFile;
Begin
  Ini := TIniFile.Create('TestIniFile.ini');
  if Ini.ValueExists('Section1', 'Ident1') then  //если ключ найден то показываем соответствующее сообщение 
    ShowMessage('Ключ найден')
  Else // если ключ не обнаружен, то сообщаем об этом
    ShowMessage('Не удалось обнаружить ключ');
  Ini.Free;
end;        
       



Метод SectionExists.

Объявлен в виде функции:    

Код

   function SectionExists(const Section: string): Boolean;


  Функция проверяет наличие раздела Section в Ini файле. Если данный раздел в файле присутствует - функция вернет true, иначе false.

Пример:
Код


Uses IniFiles;


Procedure IniFileProc;
Var
  Ini : TIniFile;
Begin
  Ini := TIniFile.Create('TestIniFile.ini');
  if Ini.SectionExists('Section1') then  //если раздел найден то показываем соответствующее сообщение 
    ShowMessage('Раздел присутствует')
  Else // если раздел не обнаружен, то сообщаем об этом
    ShowMessage('Раздел не найден');
  Ini.Free;
end;       
        


Это сообщение отредактировал(а) THandle - 17.7.2008, 17:02
PM   Вверх
SneG0K
Дата 26.2.2008, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 1
Всего: 54



Молоток=)))  smile 
PM WWW Skype   Вверх
Ofer
Дата 26.2.2008, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

Репутация: 1
Всего: 5



А для работы с реестром статейка будет? ))
PM MAIL ICQ   Вверх
THandle
Дата 26.2.2008, 07:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow

Репутация: 65
Всего: 372



Ofer, да, наверное. smile 

ЗЫ: Если найдете ошибки, опечатки, неточности и тд., пожалуйста, напишите об этом в PM, исправлю. smile 
PM   Вверх
Magik
Дата 26.2.2008, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 6.12.2007

Репутация: нет
Всего: 2



Есть способ хранить настройки и данные в файле *.dat. Такой способ лучше тем, что прочитать его содержимое (или изменить) - дело бесполезное. 
PM MAIL   Вверх
ksili
Дата 26.2.2008, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



А у меня и из папки программы (а не Windows) нормально открывается ini-файл. Вот так открываю файл, с тем же именем, что и exe-шник, но расширением ini:
Код

TIniFile *ini;
ini = new TIniFile( ChangeFileExt( Application->ExeName, ".ini" ) );



--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Alexeis
Дата 26.2.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(ksili @  26.2.2008,  08:16 Найти цитируемый пост)
А у меня и из папки программы (а не Windows) нормально открывается ini-файл.

  Там же написано ОБЫЧНО. Это не значит, что обязательно, это ближе к слову ЧАСТО или ПРИНЯТО. Можно куда угодно его сувать.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Poseidon
Дата 26.2.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(Alexeis @  26.2.2008,  10:20 Найти цитируемый пост)
Можно куда угодно его сувать.
Это точно! Есть у меня знакомый, так он ini с настройками в ресурсы dll пихает (ну у него там в этой dll картинки, формы. Он туда и настройки сует) smile



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
ksili
Дата 26.2.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Цитата(Alexeis @  26.2.2008,  14:20 Найти цитируемый пост)
Цитата(ksili @  26.2.2008,  08:16 )
А у меня и из папки программы (а не Windows) нормально открывается ini-файл.


  Там же написано ОБЫЧНО. Это не значит, что обязательно, это ближе к слову ЧАСТО или ПРИНЯТО. Можно куда угодно его сувать

Я имел в виду, что если не указывать путь, а только имя файла, то он будет искаться при открытии  в папке программы, а не в папке Windows


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
THandle
Дата 26.2.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow

Репутация: 65
Всего: 372



ksili, хорошо, давайте напишем такой вот примерчик:

На формочку кидаем две кнопочки и в ОнКлик их пишем следущее:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
 ini : TIniFile;
begin
 ini := TIniFile.Create('Ini.ini');
 ini.WriteString('Section1', 'Ident1', 'Value1');
 Ini.free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 ini : TIniFile;
begin
 ini := TIniFile.Create('Ini.ini');
 ShowMessage(ini.ReadString('Section1', 'Ident1', 'Not found'));
 Ini.free;
end;



Сохраняем весь "проект" в какую - нибудь папку.

Теперь запускаем эту программу. Жмем первую кнопку. В проводнике открываем каталог Windows. Вот он наш файл - Ini.ini. Создан именно в каталоге Windows, а не нашей программы. Теперь перемещаем этот файл в каталог нашей программы. Именно перемещаем, а не копируем. 
Программа наша всё это время работает. 
Теперь жмем вторую кнопку.
Результат: файл не найден, хотя находится в каталоге нашей программы, ключ невозможно прочитать, и поэтому в сообщении показывается не записанное нами в значение, а параметр Default равный в данном случае 'Not found'.


Вывод: если явно не указать программе где искать Ini файл, она будет искать его в каталоге Windows.
PM   Вверх
ksili
Дата 26.2.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



а-а-а, я понял в чём прикол: в Application->ExeName из моего примера входит полный путь до exe-шника


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
THandle
Дата 26.2.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow

Репутация: 65
Всего: 372



Цитата(ksili @  26.2.2008,  13:12 Найти цитируемый пост)
а-а-а, я понял в чём прикол: в Application->ExeName из моего примера входит полный путь до exe-шника 

Угу.  smile 
PM   Вверх
lukas
Дата 26.2.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



Нужно еще заметить, что ИНИ-файл в win98 не может превышать размер 64 кб, и естественно если мы не указываем полный путь, то ини-файл сохраняется в папке windows, думаю это не очень красиво...  smile просто безобразие)))... Можно было еще бы упомянуть про TMemIniFile...  smile  Я сам придерживаюсь ини-файлов, да ну этот реестр... терпеть не могу когда люди там хранят например параметры окна и еще всякую... *** 


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
THandle
Дата 26.2.2008, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow

Репутация: 65
Всего: 372



Цитата(lukas @  26.2.2008,  17:33 Найти цитируемый пост)
Нужно еще заметить, что ИНИ-файл в win98 не может превышать размер 64 кб

Думал над этим, но как мне кажется Win98 начинающие программисты сейчас не используют.

Цитата(lukas @  26.2.2008,  17:33 Найти цитируемый пост)
и естественно если мы не указываем полный путь, то ини-файл сохраняется в папке windows

Это уже описано smile 

Цитата(lukas @  26.2.2008,  17:33 Найти цитируемый пост)
Можно было еще бы упомянуть про TMemIniFile...

Про него то я и напишу в следующей после реестра статье.



Это сообщение отредактировал(а) THandle - 26.2.2008, 18:00
PM   Вверх
JackYF
Дата 26.2.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Модератор
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: нет
Всего: 162



Зашёл поглядеть, толковая статья вышла smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bems
Дата 26.2.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3399
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Alexeis @  26.2.2008,  10:20 Найти цитируемый пост)
Это не значит, что обязательно, это ближе к слову ЧАСТО или ПРИНЯТО. Можно куда угодно его сувать. 
а ПРАВИЛЬНО - в каталоге юзера

Добавлено через 12 минут и 28 секунд
Цитата(THandle @  26.2.2008,  13:07 Найти цитируемый пост)
Результат: файл не найден, хотя находится в каталоге нашей программы, ключ невозможно прочитать, и поэтому в сообщении показывается не записанное нами в значение, а параметр Default равный в данном случае 'Not found'.

логика поиска описана в хелпе к функции WritePrivateProfileString



--------------------
Обижено школьников: 8
PM MAIL   Вверх
aktuba
Дата 26.2.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата(Magik @ 26.2.2008,  09:59)
Есть способ хранить настройки и данные в файле *.dat. Такой способ лучше тем, что прочитать его содержимое (или изменить) - дело бесполезное.

С чего это ты решил? Смотря как хранится в самом файле, а в .dat можно хранить как угодно, хоть тот же .ini...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Alexeis
Дата 26.2.2008, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(bems @  26.2.2008,  17:35 Найти цитируемый пост)
а ПРАВИЛЬНО - в каталоге юзера

  Все зависит от желаемого функционала. Что от чего должно зависеть и сохраняться. По современным требованиям это вообще должен быть либо реестр либо папка Aplication Data текущего юзера. 
  В Своем каталоге обычно хранят настройки простые программы, для которых весь дом ограничивается своей папкой. Если приложение регистрируют COM/ActiveX, то оно в любом случае зависимо от текущей ОС. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bems
Дата 27.2.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3399
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Alexeis @  26.2.2008,  20:27 Найти цитируемый пост)
По современным требованиям это вообще должен быть либо реестр либо папка Aplication Data текущего юзера. 
и я о том же. Если рееестр, то в кусте пользователя.

Цитата(Alexeis @  26.2.2008,  20:27 Найти цитируемый пост)
В Своем каталоге обычно хранят настройки простые программы, для которых весь дом ограничивается своей папкой
Если говорить о том что наблюдается, то ты прав. А если о том как надо - то изменение места хранения настроек не усложняет программу, она как была простой, так ею и останется. Но зато упростит установку, потому что не нужно проверять и устанавливать разрешения на запись в папку программы



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Lexicss
Дата 11.3.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 16.8.2006
Где: Беларусь, Минск

Репутация: нет
Всего: 1



Эх, вот бы мне эту статейку полтора года назад встретить. - когда нужно было срочно разбираться с инишками, пришлось тратить время и экспериментить. А наткнулся бы сразу на эту статеку - 5 минут и хватило б. smile
--------------------
Бери от жизни всё.
PM MAIL WWW ICQ Skype   Вверх
MetalFan
Дата 11.3.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



все расжевано так, что даже самые одаренные поймут. хотя в справке и так все нормально и подробно написано, за исключением примеров


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
THandle
Дата 12.3.2008, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow

Репутация: 65
Всего: 372



Цитата(MetalFan @  11.3.2008,  20:48 Найти цитируемый пост)
все расжевано так, что даже самые одаренные поймут. хотя в справке и так все нормально и подробно написано, за исключением примеров


К сожалению все эти "самые одаренные" даже не слышали о справке, а если и слышали, то не юзают, так как на английском, и якобы не понятно smile
PM   Вверх
Saygak
Дата 17.7.2008, 16:32 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.5.2007

Репутация: 1
Всего: 1



В методе ReadSectionValues в примере нужно заменить 
Код

  Ini.ReadSectionValues(Memo1.Lines);

на 
Код

  Ini.ReadSectionValues('Section1', Memo1.Lines);

PM MAIL ICQ   Вверх
THandle
Дата 17.7.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow

Репутация: 65
Всего: 372



Интересно как такой пример вообще прошел в статью)) вроде бы все проверял...

Изменено.


Saygak, +1 в репу.
PM   Вверх
skeef
Дата 3.3.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.3.2010

Репутация: нет
Всего: нет



Перерыл пол-инета нигде не могу найти ответ на простейший вопрос:
формат комментариев в ini файлах Delphi.
Как правильно?
PM MAIL   Вверх
Heriz
Дата 21.3.2010, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 21.3.2010

Репутация: нет
Всего: нет



Вопрос: Как проверить параметр в ини файле и занести в программу?Используется параметр MainMenu1.Images:=imagesList1; и есть второй Imagelist2
 smile 
PM MAIL ICQ   Вверх
Alexeis
Дата 21.3.2010, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(skeef @  3.3.2010,  17:57 Найти цитируемый пост)
Перерыл пол-инета нигде не могу найти ответ на простейший вопрос:
формат комментариев в ini файлах Delphi.
Как правильно? 


через ";"
например 
;comment


Цитата(Heriz @  21.3.2010,  12:18 Найти цитируемый пост)
Вопрос: Как проверить параметр в ини файле и занести в программу?

Параметр в INI можно только прочитать. Если его нет, то будет подставлено значение по умолчанию.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RomanEEP
Дата 21.3.2010, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



Цитата(Alexeis @  21.3.2010,  13:44 Найти цитируемый пост)
Параметр в INI можно только прочитать. Если его нет, то будет подставлено значение по умолчанию.

Для проверки наличия параметра есть функция function ValueExists(const Section, Ident: string): Boolean;

При работе с Ini файлами в Delphi 2010 столкнулся с жесткими косяками в TMemIniFile:

1) Access Violation при открытии пустых файлов в строке 727 Inifiles.pas из-за кода
  SetLength(Buffer, Size);
  Stream.Read(Buffer[0], Size); проверить size на 0 нынче не модно...

2)Для быстрого поиска подстроки используются хешированные стринг-листы в которых обновление хеша сделано крайне неграмотно:
при любом изменении стринг листа хеш перестраивается заново!
то есть если в секции есть 100 строк, то добавление 101 строки вызовет пересчет хеш функции для всех 100 строк.
Благодаря этому файл в пару сотен строк пишется секунд 5!

Использовать ини файлы ушло всякое желание когда наткнулся на юнит NativeXml - который стал бесплатен. Имеет интуитивно понятный и небольшой набор функции, который быстро заменит сохранение в ини-файлы  + большая гибкость xml + высокая скорость работы.
Для примера: время чтения с диска и распарсивания файла размеров в 500Kb (около 50000 значений) занимает 0,2с на 1800MHz.
За собой тянет один единственный модуль размеров в 6000 строк
PM MAIL   Вверх
Alexeis
Дата 21.3.2010, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(RomanEEP @  21.3.2010,  14:34 Найти цитируемый пост)
При работе с Ini файлами в Delphi 2010 столкнулся с жесткими косяками в TMemIniFile:

А если воспользоваться старым добрым TIniFile ? Дело в том, что Ini файлы предназначены для хранения небольших объемов файлов. Тут нет оптимизации по скорости. Не подразумевается частое обращение. Простой способ сохранить уникальные данные.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RomanEEP
Дата 21.3.2010, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



Согласен? но TMemIniFiles создавался как оптимизированый вариант TIniFile и надо же было к 2010 году ембаркадеровцам соптимизировать так что сделали раз в 10 медленней оригинала!

ЗЫ: Еще в по поводу методов WriteFloat, ReadFloat во первых они записывают не натуральные, а действительные числа)))) а во вторых есть неприятная особенность, что если в системе сменится DecimalSeparator или IniFile будет читаться с другого компа, то эти значения просто напросту не считаются! Приходится придумывать велосипеды вроде смены разделителя при чтении из инишки или переопределения метода ReadFloat, WriteFloat
PM MAIL   Вверх
Alexeis
Дата 21.3.2010, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(RomanEEP @  21.3.2010,  17:48 Найти цитируемый пост)
Согласен? но TMemIniFiles создавался как оптимизированый вариант TIniFile и надо же было к 2010 году ембаркадеровцам соптимизировать так что сделали раз в 10 медленней оригинала!

  На самом деле косяки есть. Писалось все это (VCL) различными программистами. Некоторый код написан отлично, а второстепенные вещи отдавались на откуп программистам с меньшей квалификацией. Можешь лучше, перепиши и представь им свой код. Они не против замены неудачных  частей.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RomanEEP
Дата 21.3.2010, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



Целью моего поста было сказать, что с моей точки зрения Ini файлы несколько устарели и не очень удобны и есть отличный вариант для их замены - http://www.simdesign.nl/xml.html Написан отлично и не вижу смысла его переписывать!
PM MAIL   Вверх
Alexeis
Дата 21.3.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(RomanEEP @  21.3.2010,  19:18 Найти цитируемый пост)
Целью моего поста было сказать, что с моей точки зрения Ini файлы несколько устарели и не очень удобны и есть отличный вариант для их замены

  Ну если говорить о заменах, то в новых версиях делфи есть встроенная поддержка JSON.
TJSONObject модуль DBXJSON. Он удобен для хранения состояния объектов. Более специализированный и подходящий вариант чем XML.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 22.3.2010, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18484
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



PM MAIL   Вверх
kandiral
Дата 3.9.2019, 04:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 17.9.2015

Репутация: нет
Всего: 2



Я сделал более простой вариант работы с ini файлами, где каждый параметр является отдельным объектом и с ним можно работать из кода по имени.

https://kandiral.ru/delphi/primer_ispolzova...riniconfig.html

В моём случае также используется TIniFile, но косвенно(не напрямую)
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.3443 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.