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

Поиск:

Добавить материал
 

TIniFile. Работа с Ini-файлами в Delphi.
THandle
Репутация: 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


Комментарии посетителей:


Дата 26.2.2008, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
SneG0K ***   Репутация: 1  Всего: 54 
Молоток=)))  smile 
PM WWW   Вверх

Дата 26.2.2008, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
Ofer **   Репутация: 1  Всего: 5 
А для работы с реестром статейка будет? ))
PM MAIL ICQ   Вверх

Дата 26.2.2008, 07:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата
THandle Group Icon   Репутация: 65  Всего: 372 
Ofer, да, наверное. smile 

ЗЫ: Если найдете ошибки, опечатки, неточности и тд., пожалуйста, напишите об этом в PM, исправлю. smile 
PM WWW   Вверх

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

Дата 26.2.2008, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
ksili ****   Репутация: нет  Всего: 17 
А у меня и из папки программы (а не Windows) нормально открывается ini-файл. Вот так открываю файл, с тем же именем, что и exe-шник, но расширением ini:
Код

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

PM MAIL   Вверх

Дата 26.2.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
Alexeis Group Icon   Репутация: 109  Всего: 459 
Цитата(ksili @  26.2.2008,  08:16 Найти цитируемый пост)
А у меня и из папки программы (а не Windows) нормально открывается ini-файл.

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

Дата 26.2.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
Poseidon ****   Репутация: 53  Всего: 133 
Цитата(Alexeis @  26.2.2008,  10:20 Найти цитируемый пост)
Можно куда угодно его сувать.
Это точно! Есть у меня знакомый, так он ini с настройками в ресурсы dll пихает (ну у него там в этой dll картинки, формы. Он туда и настройки сует) smile

PM MAIL ICQ   Вверх

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


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

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

Дата 26.2.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
THandle Group Icon   Репутация: 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 WWW   Вверх

Дата 26.2.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
ksili ****   Репутация: нет  Всего: 17 
а-а-а, я понял в чём прикол: в Application->ExeName из моего примера входит полный путь до exe-шника
PM MAIL   Вверх

Дата 26.2.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
THandle Group Icon   Репутация: 65  Всего: 372 
Цитата(ksili @  26.2.2008,  13:12 Найти цитируемый пост)
а-а-а, я понял в чём прикол: в Application->ExeName из моего примера входит полный путь до exe-шника 

Угу.  smile 
PM WWW   Вверх

Дата 26.2.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
lukas **   Репутация: 3  Всего: 15 
Нужно еще заметить, что ИНИ-файл в win98 не может превышать размер 64 кб, и естественно если мы не указываем полный путь, то ини-файл сохраняется в папке windows, думаю это не очень красиво...  smile просто безобразие)))... Можно было еще бы упомянуть про TMemIniFile...  smile  Я сам придерживаюсь ини-файлов, да ну этот реестр... терпеть не могу когда люди там хранят например параметры окна и еще всякую... *** 
PM MAIL WWW   Вверх

Дата 26.2.2008, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
THandle Group Icon   Репутация: 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 WWW   Вверх

Дата 26.2.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
JackYF ****   Репутация: нет  Всего: 162 
Зашёл поглядеть, толковая статья вышла smile
PM MAIL   Вверх

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

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

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

PM MAIL   Вверх

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

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

Дата 26.2.2008, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
Alexeis Group Icon   Репутация: 109  Всего: 459 
Цитата(bems @  26.2.2008,  17:35 Найти цитируемый пост)
а ПРАВИЛЬНО - в каталоге юзера

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

Дата 27.2.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
bems ****   Репутация: 31  Всего: 88 
Цитата(Alexeis @  26.2.2008,  20:27 Найти цитируемый пост)
По современным требованиям это вообще должен быть либо реестр либо папка Aplication Data текущего юзера. 
и я о том же. Если рееестр, то в кусте пользователя.

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

PM MAIL   Вверх

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

Дата 11.3.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
MetalFan ****   Репутация: 62  Всего: 128 
все расжевано так, что даже самые одаренные поймут. хотя в справке и так все нормально и подробно написано, за исключением примеров
PM MAIL   Вверх

Дата 12.3.2008, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
THandle Group Icon   Репутация: 65  Всего: 372 
Цитата(MetalFan @  11.3.2008,  20:48 Найти цитируемый пост)
все расжевано так, что даже самые одаренные поймут. хотя в справке и так все нормально и подробно написано, за исключением примеров


К сожалению все эти "самые одаренные" даже не слышали о справке, а если и слышали, то не юзают, так как на английском, и якобы не понятно smile
PM WWW   Вверх

Дата 17.7.2008, 16:32 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата
Saygak   Репутация: 1  Всего: 1 
В методе ReadSectionValues в примере нужно заменить 
Код

  Ini.ReadSectionValues(Memo1.Lines);

на 
Код

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

PM MAIL ICQ   Вверх

Дата 17.7.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
THandle Group Icon   Репутация: 65  Всего: 372 
Интересно как такой пример вообще прошел в статью)) вроде бы все проверял...

Изменено.


Saygak, +1 в репу.
PM WWW   Вверх

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

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

Дата 21.3.2010, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
Alexeis Group Icon   Репутация: 109  Всего: 459 
Цитата(skeef @  3.3.2010,  17:57 Найти цитируемый пост)
Перерыл пол-инета нигде не могу найти ответ на простейший вопрос:
формат комментариев в ini файлах Delphi.
Как правильно? 


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


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

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

Дата 21.3.2010, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
RomanEEP **   Репутация: 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   Вверх

Дата 21.3.2010, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
Alexeis Group Icon   Репутация: 109  Всего: 459 
Цитата(RomanEEP @  21.3.2010,  14:34 Найти цитируемый пост)
При работе с Ini файлами в Delphi 2010 столкнулся с жесткими косяками в TMemIniFile:

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

PM ICQ   Вверх

Дата 21.3.2010, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
RomanEEP **   Репутация: 5  Всего: 8 
Согласен? но TMemIniFiles создавался как оптимизированый вариант TIniFile и надо же было к 2010 году ембаркадеровцам соптимизировать так что сделали раз в 10 медленней оригинала!

ЗЫ: Еще в по поводу методов WriteFloat, ReadFloat во первых они записывают не натуральные, а действительные числа)))) а во вторых есть неприятная особенность, что если в системе сменится DecimalSeparator или IniFile будет читаться с другого компа, то эти значения просто напросту не считаются! Приходится придумывать велосипеды вроде смены разделителя при чтении из инишки или переопределения метода ReadFloat, WriteFloat
PM MAIL   Вверх

Дата 21.3.2010, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
Alexeis Group Icon   Репутация: 109  Всего: 459 
Цитата(RomanEEP @  21.3.2010,  17:48 Найти цитируемый пост)
Согласен? но TMemIniFiles создавался как оптимизированый вариант TIniFile и надо же было к 2010 году ембаркадеровцам соптимизировать так что сделали раз в 10 медленней оригинала!

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

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

Дата 21.3.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
Alexeis Group Icon   Репутация: 109  Всего: 459 
Цитата(RomanEEP @  21.3.2010,  19:18 Найти цитируемый пост)
Целью моего поста было сказать, что с моей точки зрения Ini файлы несколько устарели и не очень удобны и есть отличный вариант для их замены

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

Дата 22.3.2010, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
Akella ****   Репутация: 36  Всего: 329 
PM MAIL   Вверх

Дата 3.9.2019, 04:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата
kandiral   Репутация: нет  Всего: 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.1835 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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