Отправляет email-рассылки с помощью сервиса Sendsay

Web-Мастеринг - с нуля до профи

  Все выпуски  

нет.


Информационный Канал Subscribe.Ru

Познавательное программирование



Выпуск 12


Здравствуйте, Уважаемые подписчики!

Образование - лучшее вложение денег.
- Билл Гейтс (ушедший из Гарварда в 1975, так и незакончив).


Наши друзья:

rest.interesting.znakomstvonew - Рассылка "Как познакомиться?" - обсуждаются различные проблемы взаимоотношений, имеется клуб знакомств и дискуссии с психологом.



Раньше я публиковал здесь свою статью как самому читать данные из INI-файла.
Теперь мне подвернулась очень хорошая статья Гусева Сергея о том, как это делать в Delphi с помощью стандартных средств.

Синий, синий INI`й...

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

Вся информация о настройках, естественно, должна где-то храниться. Именно для этих целей и были придуманы файлы инициализации .ini и реестр. Хотя сразу хочу оговориться, что реестр, как централизованная система хранения настроек с унифицированным доступом, был задуман с той целью, чтобы раз и навсегда избавиться от файлов инициализации. Но тут возникла одна весьма банальная проблема: если переустановить операционную систему все ранее сохраненные параметры просто будут потеряны. Вот поэтому использование файлов инициализации все еще широко применятся на практике.

Файл инициализации представляет собой обычный текстовый файл, который содержит в себе некоторые разделы - секции. Имя каждого раздела заключается в квадратные скобки. В каждом разделе располагаются один или несколько параметров, которым соответствуют некоторое значение. Число таких параметров в файле не ограничено.

Работа с файлами инициализации представляет собой работу с обычными текстовыми файлами. То есть в программе объявляется файловая переменная, которая связывается с физическим файлом на диске. Для работы с инициализационными файлами в Delphi служит класс TIniFile. И для того чтобы нам можно было работать с файлами инициализации нужно в раздел Uses модуля подключить модуль IniFiles.

Вот примерно так выглядит ini-файл:

    [Application] ; Имя раздела - секции.
    String=Строка ; Имена параметров и их значения.
    Integer=0
    Float=10,1
    Date=23.11.03
    Time=16:09:42
    BoolTrue=1
    BoolFalse=0

Ну, а теперь приступим к рассмотрению того, как работать с ini-файлами из своей программы. После того как мы подключили модуль IniFiles в раздел Uses нашего модуля нам необходимо объявить специальную переменную. Мы так и назовем ее IniFile.

    Var Inifile: TIniFile;

Перед любыми действиями с инициализационным файлом следует создать объект типа TIniFile, для чего используют метод Create. Этот метод создает в приложении экземпляр класса TIniFile, связывая его с файлом инициализации. Если файл инициализации на диске отсутствует, то он создается заново. Сохраняется он автоматически в системный каталог Windows. Чтобы это избежать, нужно применить один хитрый шаг, см. ниже.

А теперь перейдем к практике. Создадим новый проект и положим на форму две кнопки. В обработчик нажатия первой кнопки btnWriteIniFile мы запишем код для записи информации в файл инициализации. Мы запишем строку, целое и дробное число, дату, время и логические значения.

procedure TForm1.btnWriteIniFileClick(Sender: TObject);
begin
  // Создаем ini-файл в текущей директории
  iniFile:=TIniFile.Create(ExtractFilePath(Application.ExeName) + 'IniFile.ini');
  // Записываем строку
  IniFile.WriteString('Application', 'String', 'Строка');
  // Записываем целое число
  IniFile.WriteInteger('Application', 'Integer', 0);
  // Записываем дробное число
  IniFile.WriteFloat('Application', 'Float', 10.10);
  // Записываем текущую дату
  IniFile.WriteDate('Application', 'Date', Date);
  // Записываем текущее время
  IniFile.WriteTime('Application', 'Time', Time);
  // Записываем логическое True
  IniFile.WriteBool('Application', 'BoolTrue', True);
  // Записываем логическое False
  IniFile.WriteBool('Application', 'BoolFalse', False);
end;

В обработчик нажатия второй кнопки btnReadIniFile мы запишем код для считывания информации из файла инициализации. Мы попробуем считать все, что только что записали. Обратите внимание на то, как производиться чтение и преобразование типов.

procedure TForm1.btnReadIniFileClick(Sender: TObject);
begin
  // Открываем ini-файл в текущей директории
  iniFile:=TIniFile.Create(ExtractFilePath(Application.ExeName) + 'IniFile.ini');
  // Считываем строку
  Edit1.Text:=IniFile.ReadString('Application', 'String', 'Строка');
  // Считываем целое число
  Edit2.Text:=IntToStr(IniFile.ReadInteger('Application', 'Integer', 0));
  // Считываем дробное число
  Edit3.Text:=FloatToStr(IniFile.ReadFloat('Application', 'Float', 10.10));
  // Считываем дату
  Edit4.Text:=DateToStr(IniFile.ReadDate('Application', 'Date', Date));
  // Считываем время
  Edit5.Text:=TimeToStr(IniFile.ReadTime('Application', 'Time', Time));
  // Считываем логическое True
  If IniFile.ReadBool('Application', 'BoolTrue', True) = True Then Edit7.Text:='True';
  // Считываем логическое False
  If IniFile.ReadBool('Application', 'BoolFalse', False) = False Then Edit8.Text:='False';
end;

И так же аналогичным образом можно записывать в ini-файл некоторые параметры в зависимости от внесенных изменений пользователем. Например, при выборе переключателя "Автосохранение положения формы" записать его соответствующий признак и на основании этого признака записывать при выходе из программы координаты формы, ее длину и ширину. А при запуске программы их заново считать и присвоить координатам формы. И как пример, хочу предложить Вашему вниманию сохранение и восстановление положения формы двумя различными способами.

// Сохраняем положение и размеры формы.
procedure TForml.FormDestroy(Sender: TObject);
Var iniFile : TIniFile;
begin
   iniFile:=TiniFile.Create(ExtractFilePath(Application.ExeName) + 'IniFile.ini');
   iniFile.WriteInteger('Position', 'Top', Top);
   iniFile.WriteInteger('Position', 'Left', Left);
   iniFile.WriteInteger('Position', 'Height', Height);
   iniFile.WriteInteger('Position', 'Width', Width);
   iniFile.Free;
end;

// Восстанавливаем положение и размеры формы первым способом.
procedure TForml.FormCreate(Sender: TObject);
Var iniFile : TIniFile;
begin
   iniFile:=TIniFile.Create(ExtractFilePath(Application.ExeName) + 'IniFile.ini');
   // Проверяем нет ли пустых значений.
   If (iniFile.ReadString('Position', 'Top', IntToStr(Forml.Top)) = '')
     OR (iniFile.ReadString('Position', 'Left', IntToStr(Forml.Left)) = '')
       OR (iniFile.ReadString('Position', 'Height', IntToStr(Forml.Height)) = '')
         OR (iniFile.ReadString('Position', 'Width', IntToStr(Forml.Width)) = '')
   Then WindowState:=wsMaximized
      Else
         Begin
            WindowState:=wsNormal;
            Top:=StrToInt(iniFile.ReadString('Position', 'Top', IntToStr(Forml.Top)));
            Left:=StrToInt(iniFile.ReadString('Position', 'Left', IntToStr(Forml.Left)));
            Height:=StrToInt(iniFile.ReadString('Position', 'Height', IntToStr(Forml.Height)));
            Width:=StrToInt(iniFile.ReadString('Position', 'Width', IntToStr(Forml.Width)));
        End;
end;

// Восстанавливаем положение и размеры формы вторым способом.
procedure TForm1.FormCreate(Sender: TObject);
Const NoFind = -1000;
Var iniFile : TIniFile;
      Not_Left, Not_Top : Integer;
      Not_Height, Not_Width : Integer;
begin
   iniFile:=TIniFile.Create(ExtractFilePath(Application.Exename) + 'IniFile.ini');

   // Проверяем нет ли пустых значений.
   Not_Left:=iniFile.ReadInteger('Position', 'Left', NoFind);
   Not_Top:=iniFile.ReadInteger('Position', 'Top', NoFind);
   Not_Height:=iniFile.ReadInteger('Position', 'Height', NoFind);
   Not_Width:=iniFile.ReadInteger('Position', 'Width', NoFind);

   If (Not_Left = NoFind) OR (Not_Top = NoFind)
      OR (Not_Height = NoFind) OR (Not_Width = NoFind)
     Then Form1.Position:=poScreenCenter;
        Else
           Begin
              Left:=iniFile.ReadInteger('Position', 'Left', Left);
              Top:=iniFile.ReadInteger('Position', 'Top', Top);
              Height:=iniFile.ReadInteger('Position', 'Height', Height);
              Width:=iniFile.ReadInteger('Position', 'Width', Width);
           End;
   iniFile.Free;
end;

Таким образом, перед тем как задать только что считанные значения, из файла инициализации, координатам формы, делаем проверку, нет ли пустых значений. Если пустые значения существуют, то это означает, что координаты формы не были сохранены ранее, либо удалены умышленно. Тогда "принудительно" заставляем развернуться форму, в первом примере, в полный экран, и центрироваться, во втором примере.


Любые комментарии, жалобы, пожелания и сообщения об ошибках настоятельная просьба присылать на e-mail.

Гусев Сергей.
e-mail: satanzone@yandex.ru
site: http://icops.narod.ru



Все вопросы и пожелания ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru
Все статьи публикуются здесь только с разрешения (или рекомендации) автора.
В случае, если вы будете использовать приведённые в этой рассылке материалы, не забудьте сделать ссылку.

Ведущий рассылки:
Набатников Иван
urisff@inbox.ru
http://newff.narod.ru/



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное