DevProg: Блог для программистов

Секреты программирования. Примеры разработки. Обзоры программёрского софта, блогов и форумов и просто полезные советы!

Archive for Июль 2010

Урок Delphi – Учимся подключать .INI файлы в свои Delphi-приложения.

Posted by devprog на Июль 25, 2010

Сегодня мы рассмотрим, как подключать инициализационные файлы в свои приложения на Delphi. Инициализационные .INI файлы представляют собой, обычные текстовые файлы, которые вы могли наблюдать обычно в папках с программами на вашем компьютере. Они используются для хранения пользовательских настроек и параметров и обычно открываются любыми текстовыми редакторами и имеют такой формат:

<название параметра> = < его значение>

Работать с .INI файлами в Delphi очень просто. Основной базовый класс для работы с ними это TIniFile, который позволяет производить над ними все операции записи и считывания, перезаписи пользовательских настроек.  Есть еще класс TMemIniFile, который  отличается и первого TIniFile, тем, что все данные записываются в оперативную память компьютера, и сохраняются на диске только в момент вызова UpdateFile метода. Оба этих класса содержаться в модуле IniFile и для того, чтобы мы смогли использовать  .INI файлы и работать с этими классами в ваших приложениях, вы должны добавить  модуль IniFiles в секцию Uses.

Создать  объект класса TIniFile или TMemIniFile очень просто, для этого нужно передать конструктору имя .INI файла. В случае, если данного файла не существует, он создается автоматически. Для чтения/записи  из/в .INI файл пользовательских значений программно существуют методы

ReadSrting/WriteString;

ReadDate/WriteDate;

ReadInteger/WriteInteger;

ReadBool/WriteBool;

Довольно теории, теперь попробуем попрактиковаться и написать небольшое приложение, наглядно демонстрирующее работу с инициализационными файлами в Delphi и классом TIniFile. Наше приложение после запуска считает из .INI файла информацию о положении и размерах окна, а так же содержимого поля ввода типа Edit, а когда мы  закроем приложение оно вновь запишет в .INI файл свои новые( если мы поменяли размер окна или что-то написали в поле ввода) данные, с которыми оно откроется в следующий раз.

Открываем Delphi,  помещаем на форму компоненты Edit(поле ввода) и Button(обычная кнопка). Будем обрабатывать события компонента Form, главной формы  при создании OnCreate и закрытии OnClose, а  также события нажатия на кнопку Button OnClick.

Добавляем в секцию подключаемых модулей Uses модуль IniFile, в котором содержится класс TIniFile, с которым наше приложение будет работать.

В самом начале работы программы (в теле обработчика события создания формы OnCreate) мы попробуем прочитать данные из .INI файла. Чтобы это реализовать, создадим объект класса TIniFile, вызвав его конструктор, с именем нужного файла.  Имя файла мы получим из имени исполняемого файла приложения Application.ExeName, изменив его расширение на “ini” с помощью функции ChangeFileExt.

Извлекать из .INI файла отдельные значения мы будем с помощью методов: ReadInteger, ReadString и ReadBool. Эти функции имеют 3 аргумента

  1. Read/Write*(имя типа данных Integer, String или Bool)*  ( 1N , 2N, 3N ) ;
  2. 1N  — первый аргумент, имя секции, в нашем случае это будет Form
  3. 2N —  второй аргумент, имя параметра (Top, Left, Text и т.п.)
  4. 3N – третий аргумент, указывает значение по умолчанию(100, 200, 300 и т.п.) если используется Read* чтение, в случае Write* записи, это будет записываемое значение.

Извлечь значения из .INI файла нам возможно и не удастся  не только в аварийном случае, но и по нескольким из причин, например, отсутствие  инициализационного файла, или секции. Поэтому, для обработки подобных или еще более серьезных  ошибок мы будем использовать защищенный блок tryfinally.

procedure TForm1.FormCreate(Sender: TObject);
var
IniSoub: TIniFile;
begin
Caption := ‘*.INI’;
Button1.Caption := ‘&Сохранить»
Edit1.Text := »;
//создаем объект класса TIniFile
IniSoub := TIniFile.Create(ChangeFileExt(Application.ExeName, ‘.ini’));
try // пробуем прочитать данные
Edit1.Text := IniSoub.ReadString(‘Edit’, ‘Text’, »);
Top := IniSoub.ReadInteger(‘Form’, ‘Top’, 100);
Left := IniSoub.ReadInteger(‘Form’, ‘Left’, 100);
Height := IniSoub.ReadInteger(‘Form’, ‘Height’, 100);
Width := IniSoub.ReadInteger(‘Form’, ‘Wedth’, 147);
IF IniSoub.ReadBool(‘Form’, ‘Maximized’, false) then
WindowState := wsMaximized
else
WindowState := wsNormal;
finally
IniSoub.Free; //освобождаем память
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;

Когда мы закрываем программу, событие закрытия формы OnClose обработается и запишет текущие значения (высота, размер окна, и т.п.) в инициализационный файл с помощью методов класса  TIniFile :

WriteString()
WriteInteger()
WriteBool()

Мы их рассмотрели выше, в Write* все тоже,  что и в Read*, кроме последнего 3 аргумента, который записывает  .INI файл какое-то числовое значение.

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
IniSoub: TIniFile;
begin
//создаем обьект класса TIniFile
IniSoub := TIniFile.Create(ChangeFileExt(Application.ExeName, ‘.ini’));
try // пытаемся записать данные в наш .INI файл
IniSoub.WriteString(‘Edit’, ‘Text’, Edit1.Text);
IniSoub.WriteInteger(‘Form’, ‘Top’, Top);
IniSoub.WriteInteger(‘Form’, ‘Left’, Left);
IniSoub.WriteInteger(‘Form’, ‘Height’, Height);
IniSoub.WriteInteger(‘Form’, ‘Width’, Width);
IniSoub.WriteBool(‘Form’, ‘Maximized’, WindowState = wsMaximized);
finally
IniSoub.Free; // освободим память
end;
end;

Теперь скомпилируйте приложение и сохраните его куда-нибудь в папку или на рабочий стол.  Откройте его и попробуйте поменять, например, размер его окна, его расположение на вашем мониторе и нажмите кнопку ”Сохранить”. Теперь откройте его заново и можете убедиться, что размер окна, и  остальное что вы меняли, отображается с тем же размером. Все эти данные находятся в .INI файле, вы можете его открыть и отредактировать, поменяв тем самым какие-то значения, с которым приложение отобразиться, как вы его откроете.

Вот его листинг

[Edit]

Text= Привет

[Form]

Top=100

Left=100

Height=200

Width=440

Не забывайте при редактировании .INI файла вручную указывать имена секций в квадратные скобки  [….], а все остальные строки файла, должны иметь формат <переменная>=<значение>

Если хотите предусмотреть возможность редактирования .INI файлов через саму программу, можно использовать компонент ValueListEditor, находящийся на вкладке Additional.

На сегодня урок закончен. Все вопросы можете задавать в комментариях, с удовольствием на них отвечу, и если что-то не понятно, всегда помогу вам разобраться!

Реклама

Posted in Delphi, Новичку | Отмечено: | Leave a Comment »

Пишем алгоритм простого шифрования текста на Delphi

Posted by devprog на Июль 21, 2010

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

Что собственно приложение будет делать? Оно будет шифровать текст, который вы будите набирать в поле ввода, моментально отображая этот текст в зашифрованном по заданному нами алгоритму виде, а так же расшифровывать его при нажатии на кнопку и обратно.

Шифровать будем элементарным алгоритмом. Каждый символ будет заменятся на следующий за ним в таблице ASCII значений.

В дельфи выбираете следующие компоненты и перетаскиваете их на форму мышкой.

  1. Edit
  2. Button
  3. Label

Нам потребуется, обрабатывать следующие события вышеперечисленных компонентов :

  • Form1: OnCreate
  • Edit1: OnKeyPress
  • Button1: OnClick

Немного расскажу о наших событиях. Когда вы нажимаете на символьной клавише на клавиатуре, генерируется событие OnKeyPress, и когда это событие произошло в атрибуты этого события заноситься ASCII-код символа  нажатой клавиши. И таким образом, если мы перехватим это событие, еще до его завершения, то мы сможем заменить и код символа этой клавиши на наш, который и отобразиться у нас в поле ввода.

Итак напишем код , для выполнения его  нашими обработчиками событий,  примерно вот что у нас должно получиться :

procedure  TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin

//Заменяем перехваченный символ на следующий по порядку
Key := Chr(Ord(Key) + 1)
end;

procedure TForm1.Button1Click( Sender: TObject);
var

Ret: AnsiString; //Тип данных  — ANSI строка(массив символов)
I: Integer; // Тип данные — целые числа
begin
//копируем то что находиться в поле ввода во вспомогательную строку
//и заменяем каждый символ в строке на предыдущий по таблице ASCII

Ret := Edit1.Text;
for I := 1 to Length(Ret) do
Ret[I] := Chr(Ord(Ret[I]) — 1)
//копируем результат обратно в поле ввода по нажатию на кнопку
Edit1.Text := Ret;
end;

После чего скомпилируем нажав (Run |>) и можете протестировать :)

Если что-то не получается пишите  в комментарии, всегда буду рад вам помочь разобраться ! :)

Posted in 5минутные утилиты, Delphi, Новичку | Отмечено: | 9 комментариев »