Закрывая главное окно, мы тем самым закрываем все дочерние окна. Команда закрытия главного окна работает следующим образом.
1. После получения команды закрытия поочередно посылается аналогичная команда на все дочерние окна.
2. Если в дочерних окнах файл был изменен, происходит запрос на сохранение, в течении которого главное окно ждет.
3. Если пользователь ответил на запрос "Отмена", то одно из дочерних окон не закрывается и процесс закрытия главного окна прекращается. Текстовый файл по прежнему доступен для редактирования.
4. В случае успешного закрытия всех дочерних окон закрывается и главное окно приложения.
5. Программа после закрытия главного окна завершает работу.
Весь такой трудоемкий процесс закрытия происходит очень быстро и незаметно для пользователя, и что главное – полностью автоматически. Во-первых (как это не прискорбно для некоторых "любителей" Windows) благодаря свойствам операционной системы управления MDI-приложениями; во-вторых благодаря нам, мы этот случай рассматривали только при закрытии единственного дочернего окна и не подозревая, что применяем ко всему проекту. Все в программах, как и в этом мире взаимосвязано, особенно все, что касается дочерних процессов.
У нас в меню "Файл" остался один незадействованный пункт "Закрыть". Его применяют для закрытия активного дочернего окна (если пользователю лень нажать на крестик в правом верхнем углу). Мы этот пункт уже применили в меню "Окна", и поэтому его необходимость повторного существования отпадает. Его можно удалить или назначить соответствующее свойство из списка стандартных действий.
Для этого открываем редактор главного меню (MainMenu1) двойным щелчком мыши. Выбираем пункт меню "Закрыть" и в свойстве Action (Object Inspector на странице Properties) выбираем стандартное действие Close1. Тут, возможно, из-за различий в версиях delphi некоторые различия. Поступайте в таких случаях всегда "по смыслу", находя наиболее похожие или применимые значение для выбора, или в самых запущенных случаях обращайтесь к автору этого урока за помощью.
И наконец, самый последний пункт меню "О программе". Ведь каждый уважающий себя программист обязательно ставит свою подпись на каждом программном продукте. В таком окне еще обычно даются каналы связи технической поддержки, версия программы и дата изготовления. Можно написать еще много разной информации, чего сразу не припомнишь.
Изготавливаем новое окно для нашего проекта. Это окно будет модальным, т. е. пользователь ничего не сможет сделать с другими окнами, пока не закроет это. Модальное окно появляется поверх других окон, делая все остальные недоступными.
Выбираем из меню "File" главного окна delphi пункт "New Form". Появляется новая чистая форма. Сразу изменяем ее размер на более малый, ведь окно About никогда огромным не бывает, впрочем как вам угодно.
Дальше описываю все дальнейшие ваши шаги с пояснениями.
1. Изменяем свойство Name для этого нового окна из Form1 в About. Теперь доступ к нему из программы будет только по этому идентификатору.
2. Изменяем свойство Caption на "О программе". Заголовок окна содержит этот текст, понятный пользователю, куда он попал, и какая здесь содержится информация.
3. Выбираем пункт меню delphi "Save All" и сохраняем новое окно под именем AboutUnit.
4. Изменяем свойство Pisition на poScreenCenter. Это означает, что окно "О программе" будет изначально появляться ровно по центру экрана, независимо от текущего экранного разрешения.
5. Изменяем свойство BorderStyle на bsDialog. Это окно у нас служит в качестве диалогового, и значит пользователь не должен иметь возможность его свернуть или развернуть на весь экран.
6. Устанавливаем в форму кнопку TBitBtn
, находящейся на палитре компонентов на странице Additional. Располагаем эту кнопку в удобное для вашего взгляда положение. Например в правый нижний угол. Дальше изменяем свойство Kind для этой кнопки в bkOK. Кнопка сразу приобретет новое название OK и на ней появится рисунок зеленой галочки. Если пользователь выберет эту кнопку, то окно About закроется без написания каких-нибудь процедур с нашей стороны.
7. Располагаем в форме несколько компонентов TLabel
(сколько нужно), в которых в свойстве Caption пишите всю необходимую в таких случаях информацию. Шрифт можно изменить в свойстве Font.
8. Теперь непосредственно привяжем вызов этого окна выбором соответствующего пункта меню. Для этого выбираем пункт меню "О программе" в главном окне нашей программы MainForm и в процедуре OnClick, для этого пункта меню, пишем одну строчку.
procedure TMainForm. N15Click(Sender: TObject);
begin
About. ShowModal;
end;
Дальше выбираем пункт меню Use Unit из меню файл главного окна delphi и выбираем модуль AboutUnit. Мы только что подключили к главному модулю проекта модуль окна About. Если этого не сделать – ничего страшного. При запуске программы на исполнение delphi примет это за упущение со стороны программиста и сделает запрос на автоматическое подключение соответствующего модуля, после чего вам следует повторно запустить программу на выполнение.
Это вроде бы все. Можете запускать программу и любоваться своей работой. Как всегда, рассмотренный материал в виде примера можно скачать в конце урока здесь.
Эта программа совсем не сложная, хотя и содержит некоторые строки, непонятные для новичков. Но и без этого вы смогли убедиться, что писать программы в программной оболочке delphi не сложно.
В следующих уроках мы с вами будем начнем новый пример и будем постепенно продвигаться в азах программирования, приобретая новые знания.
С уважением, ведущий уроков Semen *****@***net
Урок14. Компонент TForm
Хотя компонент TForm отсутствует в палитре компонентов, но все же имеет присущи для него свойства, события.
Итак, компонент TForm это окно в оконном приложении. Оно может быть минимум одно, максимальное ограничение на количество не накладывается. Первое созданное окно в приложении автоматически становится главным. При закрытии главного окна приложение завершает свою работу и, занимаемая им память, освобождается.
Если необходимо, чтобы главное окно формы автоматически не появлялось на экране, то в событии OnCreate для этого окна, или в программе DPR до команды создания главного окна необходимо указать следующую строку:
Application. ShowMainForm:=false;
В этой команде указывается, что в этом приложении запрещено отображение главной формы (окна). В этом случае программисту нужно самостоятельно вызывать команду
Form1.Show;
для отображения этого окна. Здесь Form1 – главное окно приложения.
Данный метод может оказаться полезным для вывода запроса пароля на запуск программы. Именно это диалоговое окно нужно показать пользователю перед показом главного окна, но не делая его главным окном, т. е. при закрытии окна ввода пароля, приложение не завершает свою работу. И при вводе неверного пароля можно без проблем завершить работу программы командой
Form1.Close;
Или дать команду завуршения работы приложения.
Как уже говорилось в предыдущих уроках, каждый компонент в программе, как и сама форма, имеет уникальное имя, указанное в свойстве Name. Заголовок окна содержится в свойстве Caption. По заголовку окна пользователь узнает о функциональном назначении программы или текущего окна.
Кроме заголовка в верхней части окна находится иконка и кнопки управления состоянием. По умолчанию иконка такая же самая, как и иконка в проекте. Чтобы сменить иконку в текущем окне необходимо в инспекторе объектов выбрать свойство Icon в котором выбрать соответствующий файл-рисунок. Файл должен быть с расширением ICO.
Для того, чтобы сменить иконку в проекте, нужно войти в меню "Project", далее "Options...", на вкладке Application вы видите текущий рисунок файла проекта. Сменить его можно кнопкой "Load Icon...". Иконка проекта хранится в файле ресурсов с расширением RES.
Свойство BorderStyle
bsDialog – У окна нет иконки. Отображена только кнопка управления "Закрыть". Размер окна постоянный. Такой тип окон применяется чаще всего в диалоговых окнах, например окно запроса на сохранения проекта, если вы пытаетесь выйти из delphi не сделав сохранения.
bsNone – У окна нет иконки, кнопок управления, заголовка. Размер окна постоянный. Закрыть такое окно можно только программно или с помощью комбинации клавиш Alt+F4. Этот тип окон применяется в заставке при запуске программы. На окне расположен компонент TImage, который содержит рисунок.
bsSingle – В окне присутствует иконка, есть заголовок. Кнопки управления свернуть, развернуть (восстановить), закрыть. Размер окна постоянный.
bsSizeable – Тип окна по умолчанию. Имеет все элементы, указанные в предыдущем значении свойства плюс изменение размеров окна.
bsSizeToolWin – Этот тип окна установлен в окне инспектора объектов. Такое окно не имеет иконки, есть заголовок, кнопка управления "закрыть". Можно изменять размер окна.
bsToolWindow – Аналогичный предыдущему значению, за исключением того, что нельзя изменять размеры окна.
Все вышеописанные типы свойства BorderStyle устанавливаются только для работающего приложения, т. е. мы видим изменения в оформлении окна только после запуска программы.
Свойство BorderIcons
Это свойство является вложенным. Т. е. если вы в инспекторе объектов нажмете на знак +, то откроется еще несколько подсвойств. Свойство BorderIcons имеет смысл устанавливать только в соответствующих значениях свойства BorderStyle.
biSystemMemu – указывает, отображать или нет иконку и кнопки управления окном.
biMinimize – отображать или нет кнопку управления "свернуть".
biMaximize – отображать или нет кнопку "развернуть" ("восстановить").
biHelp – отображать или нет кнопку "помощь".
Возможны два значения для этих свойств: true (истинно) и false (ложно).
Свойство Position
poDefault – Windows само определяет размер и положение окна.
poDefaultPosOnly – произвольное положение окна.
poDefaultSizeOnly – только произвольный размер окна.
poDesigned – такой-же размер и положение, кокой был при разработке. Значение по умолчанию. Вам следует знать, что не на всех компьютерах установлено такое же экранное разрешение, какое есть у вас, и значит окна в программе будут находиться в совершенно другом месте.
poDesktopCenter – окно находится в центре экрана.
poScreenCenter – окно находится в центре экрана. Работает с многодисплейным режимом отображения.
Свойство WindowState
wsMaximized – Окно первоначально будет развернуто во весь экран.
wsMinimized – Окно первоначально будет свернуто в значок.
wsNormal – Окно имеет те же размеры, что и во время разработки. Значение по умолчанию.
Пример
Рассмотрим один очень полезный пример. Нам надо еще до запуска программы предложить пользователю ввести некий пароль. Если пароль введен верно, то отображается главное окно проекта и пользователь может работать. Если пароль введен неверно, то программа немедленно завершает свою работу.
Запускаем delphi и создаем новый проект. В новом проекте окно Form1 будет главным окном проекта.
Для события создания окна OnCreate пишем:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application. ShowMainForm:=false; //не отображать главное окно приложения
end;
Выбираем пункт меню "New Form" из меню "File". Появляется новое окно Form2. Его мы будем использовать в качестве ввода пароля. Оформляем его для этого надлежащим образом. Пример вы видите на рисунке.
- Уменьшаем окно так, чтобы оно по размерам было как у подобных окон. Свойство BorderStyle устанавливаем в bsSingle. При этом размер окна во время работы программы будет постоянен. Свойство BorderIcons. Подсвойства biMinimize и biMaximize устанавливаем в false. Это окончательно недопустит изменение состояния окна (свертывание, разворачивание на весь экран). В свойстве Caption пишите любую на ваше усмотрения понятную фразу, например "Введите пароль". Свойство Position в значение poDesktopCenter. При этом окно при любом экранном разрешение всегда изначально будет расположено посередине экрана. На странице палитры компонентов Standart выбираем и устанавливаем в форму компонент TPanel. Убираем у него значение Caption, придаем свойству Align значение alTop и окончательно изменяем его размер на четь больше половины окна. На странице Additional выбираем компонент TBitBtn и устанавливаем в форму две кнопки, ниже панели. Для первой кнопки свойство Kind в bkOk, для второй bkCancel. Для первой кнопки свойство Caption оставляем в для всех понятное значение Ok, для второй пишем "Отмена". На странице Standart выбираем и устанавливаем на компонент Panel компонент TEdit. Для компонента Edit1 меняем свойство PasswordChar на знак * (звездочка). Это принятый во всех программах символ ввода пароля. При наборе пароля вместо символов будет отображаться звездочки. Для компонента Edit1 убираем значение Caption. Для Form2 в свойстве Icon подбираете соответствующую иконку.
Мы только что оформили полностью готовое окно для ввода пароля. Я же могу предложить вашему внимание свой вариант, который более красочно оформлен.
Вы всегда можете оформлять свои приложения по своему. Не обязательно придерживаться каких-либо правил по оформлению программы, но тем не менее пользователь не должен теряться при виде ваших "фантазий" и должен четко представлять, что от него требуется.
Дальше делаем вызов окна ввода пароля на экран. Поскольку мы с вами убрали свойство вывода главного окна, то после запуска программы на экране не будет ничего. Нам же нужно вывести окно запроса пароля, и мы это делаем с помощью программы DPR. Вызываем ее на экран с помощью пункта меню "View Source" из меню "Project". В строке до *****n пишем:
Form2.Show;
Еще до запуска приложения, но после создания всех окон на экран выводится окно Form2.
Дальше переключаем редактор кода на модуль Unit2, вызываем проектируемое окно клавишей F12, в инспекторе объектов для компонента Form2 (проектируемая форма) создаем реакцию на событие закрытия окна OnClose и в самой процедуре пишем:
Procedure TForm2.FormClose (Sender: TObject; var Action: TCloseAction);
begin
If Form2.ModalResult=mrOk then //если пользователь нажал на кнопку Ok, то
If Edit1.Text='programming. *****' then //если набран необходимый пароль, то
begin
Form1.Show; //показать главное окно
Exit; //выйти из этой процедуры
end;
Application. Terminate; {если все вышеуказанные условия не выполняются, то остановить программу}
end;
Для кнопки BitBtn1 реакция на событие OnClick
procedure TForm2.BitBtn1Click(Sender: TObject);
Begin
Form2.ModalResult:=mrOk; //результат работы этого окна
Close; //закрыть это окно
end;
Для кнопки BitBtn2 событие OnClick
procedure TForm2.BitBtn2Click(Sender: TObject);
begin
Close; //закрыть это окно
end;
Поскольку мы окно Form2 вызываем командой Show, а не ShowModal, то присваивание результата работы окна не приведет к автоматическому закрытию и вызову процедуры OnClose. Поэтому после этой команды следует команда закрытия окна Close.
Кратко описание работы программы.
При создании главного окна, программа получает указание об отсутствии необходимости автоматического отображения главного окна после запуска.
Дальше, после создания всех окон (в нашем случае двух) становится видимым окно Form2. Если пользователь нажал на кнопку "Ok" или в поле ввода пароля нажал на клавишу Enter (!), то вызывается обработчик события OnClick, который занесет соответствующее значение в переменную результата работы этого окна и вызовет команду закрытия Close.
В процедуре обработки закрытия окна вначале идет проверка результата, правильности ввода пароля. Если одно и другое условие выполняется, то поступает команда Form1.Show, которая выведет главное окно, после которой команда Exit выведет обработчик события из процедуры, тем самым исключающая дальнейшее выполнение строк этой процедуры.
Если по каким либо причинам, все вышеуказанные условия не выполняются (пользователь закрыл окно кнопкой "Отмена", закрыл окно кнопкой "Закрыть" или нажал комбинацию клавиш Alt+F4, ввел неправильный пароль), то выполняется команда Termanate (терминатор, который убивает работающее приложение :).
В программе в качестве пароля вводится адрес нашего сайта. Если вы желаете указать другой пароль, можно изменить соответствующую строку в программе.
Скачать только что рассмотренный пример можно здесь.
С уважением, ведущий уроков Semen *****@***net
Урок15. Работа с файлами
В этом уроке рассмотрим очень важную тему в программировании - работа с файлами. Практически в любой программе нужно копировать, открывать, изменять, сохранять, иногда удалять файлы.
Как известно, файлы имеют различные форматы и к ним применяются различные программы для обработки. Например, файлы рисунков BMP, текстовые файлы TXT и т. п. Файлы имеют различные имена и определенное расширение, имеющее в среде MS-DOS максимально три символа. Если у файла расширение RAR, то пользователь и операционная система знает, что это архиватор, причем windows для обработки этого файла применяет средства, указанные в специальном разделе реестра.
Как открывать зарегистрированные файлы и исполняемые файлы, было рассказано в уроке 4
Копирование файлов
Для копирования файлов применяется функция CopyFile. Формат ее такой:
CopyFile(Исходный_файл, Записуемый_файл, Флаг_перезаписи);
где: Исходный_файл – полный путь и название файла, который копируется;
Записуемый_файл – полный путь и название файла, куда копируется исходный файл;
Флаг_перезаписи – будет или нет перезаписан файл, если таковой уже существует (true - не будет, false - будет перезаписан).
CopyFile является функцией, которая возвращает флаг успешной или нет операции копирования.
Например, следующая строка:
if not CopyFile('c:\','c:\1.com',true) then ShowMessage('Ошибка копирования');
скопирует файл в файл 1.com только в том случае, если последнего нет, в противном случае будет выдаваться сообщение об ошибке копирования.
Перемещение файлов
Для перемещения файлов применяется функция MoveFile. Она имеет следующий формат:
MoveFile(Исходный_файл, Записуемый_файл);
Ее параметры аналогичны вышерассмотренной команде за исключением отсутствия флага перезаписи.
Пример:
if not MoveFile('c:\1.com','c:\2.com') then ShowMessage('Ошибка перемещения');
Переименование файлов
Функция RenameFile
if not RenameFile('c:\2.com','c:\3.com') then ShowMessage('Ошибка переименования');
У всех вышесказанных командах параметры исходного и конечного файла имеет тип PChar. Это строковый тип с завершающимся нулем. Возможно, вы раньше слышали о таком формате строковых данных. В такую переменную можно занести строку очень большой длины. Ее размер ограничивается наличием нулевого байта в конце. Теоретически такая переменная может иметь бесконечный размер. На практике она ограничивается размерами выделяемой памяти для программы (2Гб).
Преобразование обычной строковой переменной, типа String в PChar производится функцией:
PChar(Строковая_переменная).
При этом, для команд файловых операций возможны объединение строк. Например:
procedure TForm1.Button1Click(Sender: TObject);
Var InDir, OutDir:String; // объявление строковых переменных
begin
InDir:='c:\1\'; // каталог исходных файлов
OutDir:='c:\2\'; // каталог записуемых файлов
CopyFile(PChar(InDir+'1.txt'),PChar(OutDir+'1.txt'),false);
CopyFile(PChar(InDir+'2.txt'),PChar(OutDir+'2.txt'),false);
end;
Здесь налицо операция соединения двух строковых переменных.
В итоге этой процедуры будет копирование файлов c:\1\1.txt и c:\1\2.txt в каталог c:\2. Файлы копируются под теми же именами.
Удаление файлов
Функция DeleteFile
if not DeleteFile('c:\3.com') then ShowMessage('Ошибка удаления');
Работа с текстовыми файлами. Чтение из текстового файла
На прошлых уроках мы рассматривали пример простейшего текстового редактора. В нем, в компоненте Memo процесс загрузки и записи текстового файла делался следующим образом:
Memo1.Lines. LoadFromFile(Имя_файла); // загрузка
Memo1.Lines. SaveToFile(Имя_файла); // сохранение
Все это благодаря свойству Lines, в котором хранятся строки.
Но на практике иногда необходимо прочитать только определенную строку или совершить операцию добавления строки в уже существующий файл.
Следующий пример обработки текстового файла очень похож на аналогичную на языке Pascal. Знающие люди могут ощутить разницу, поскольку есть некоторые отличия.
procedure TForm1.Button1Click(Sender: TObject);
Var f:TextFile; // объявление файловой переменной
st:String; // строковая переменная
begin
AssignFile(f,'c:\1.txt'); // привязка названия файла к файловой переменной
{$I-} // отключение контроля ошибок ввода-вывода
Reset(f); // открытие файла для чтения
{$I+} // включение контроля ошибок ввода-вывода
if IOResult<>0 then // если есть ошибка открытия, то
begin
ShowMessage('Ошибка открытия файла C:\1.TXT');
Exit; // выход из процедуры при ошибке открытия файла
end;
While not EOF(f) do // пока не конец файла делать цикл:
begin
ReadLn(f, st); // читать из файла строку
ShowMessage(st); // выводить строку пользователю
end;
CloseFile(f); // закрыть файл
end;
Прокомментирую некоторые строки этого примера.
Команда AssignFile осуществляет привязку строки пути файла к файловой переменной. Все дальнейшие операции с файловой переменной автоматически осуществляются с указанным файлом. Для избежания путаниц, указывайте полный путь к файлу.
{$I-} и {$I+} являются директивами компилятору, что в этом месту соответственно следует отключить и включить контроль ошибок ввода-вывода. В данном случае при неудачной попытке открытия файла c:\1.txt (файл отсутствует или открыт для записи другой программой) наша программа не выдаст аварийной ошибки и продолжит выполнение данной процедуры. Это свойство полезно для обработки всех возможных случаев в работе программы.
IOResult – переменная, которая хранит в себе код ошибки последней операции ввода-вывода. Если она равна нулю, то последняя операция была успешно выполнена.
EOF(Файл) – функция, возвращающая признак конца файла. Т. е. она показывает, достигнут или нет конец открытого файла.
ReadLn(Файл, Переменная) – процедура считывания переменной из файла. В отличие от команды Read производит считывание строки с завершающимся символом перевода строки под кодами 13 и 10 (клавиша Enter).
CloseFile(Файл) – процедура закрытия ранее открытого файла.
Работа с текстовыми файлами. Запись в текстовый файл
Рассмотрим пример:
procedure TForm1.Button1Click(Sender: TObject);
Var f:TextFile; // указатель на текстовый файл
begin
AssignFile(f,'c:\1.txt'); // привязка названия к переменной
{$I-}
Append(f); // открыть файл для добавления
if IOResult<>0 then // если ошибка открытия (напр. файла нет)
begin
{$I-}
Rewrite(f); // создать новый файл
{$I+}
if IOResult<>0 then // ошибка создания файла
begin
ShowMessage('Ошибка создания файла C:\1.TXT');
Exit;
end;
end;
WriteLn(f,'Привет'); // запись в файл строки с символами перевода строки
CloseFile(f); // закрыть файл
end;
Процедура Append(Файл) открывает файл для записи и устанавливает указатель записи в конец файла, т. е. все добавляемые к файлу строки будут записаны в конец файла.
В нашем случае в самом начале файла 1.txt может не оказаться на диске, поэтому команда открытия файла для добавления вызовет ошибку. В этом случае срабатывает наш собственный контроль ошибок и выполняется команда создания файла.
Запись и чтение из файла не текстовых данных
Рассмотрим пример, в котором программа при выходе сохраняет свои размеры и положение окна на экране в файл и при последующем запуске восстанавливает состояние, которое было при выходе. Программа состоит из двух процедур OnShow и OnClose для окна Form1 программы.
procedure TForm1.FormShow(Sender: TObject);
Var f:file of Integer; // файловая переменная, тип integer
i:Integer; // целочистенная переменная
begin
AssignFile(f,'pos. ini');
{$I-}
Reset(f);
{$I+}
if IOResult<>0 then Exit;
Read(f, i); //считать из файла значение
Form1.Top:=i; // верхнее положение окна
Read(f, i);
Form1.Left:=i; // левое положение окна
Read(f, i);
Form1.Width:=i; // ширина окна
Read(f, i);
Form1.Height:=i; // высота окна
CloseFile(f);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
Var f:file of Integer;
begin
AssignFile(f,'pos. ini');
{$I-}
Rewrite(f);
{$I+}
if IOResult<>0 then Exit;
Write(f, Form1.Top);
Write(f, Form1.Left);
Write(f, Form1.Width);
Write(f, Form1.Height);
CloseFile(f);
end;
Как вы наверное заметили, имя файла, в котором храним переменные состояния окна, мы указали без пути, просто pos. ini. В этом случае файл создается и открывается в текущем каталоге. По умолчанию это каталог, из которого была запущена программа.
С уважением, ведущий уроков Semen *****@***net
Урок16. Ini файлы
Для хранения некоторых данных, например параметров программы, как это было рассмотрено в предыдущем уроке, для последующего их использования можно применять реестр или ini файлы. Я имею в виду хранение установок программы во время бездействия программы, чтобы при последующем запуске, она восстанавливала свое состояние. В ini файлах можно также хранить и скрытые от пользователя данные, такие как серийный номер программы, срок истечения лицензии, закодированные пароли на запуск и пр. Такие данные естественно не защищены от постороннего вмешательства, но при умелом использовании кодирующих средств, можно исключить ручное редактирование этих параметров.
TIniFile является низкоуровневым 16-битным классом, совместимым с операционной системой windows 3.x файловой системы хранения параметров в INI файлах. Для хранения параметров в современных программах рекомендуется использовать реестр. Но, как правило, не так просто такую программу скопировать на другой компьютер с переносом всех настроек, а совместное копирование ini файла избавит вас от такой проблемы.
Класс TIniFile находится в модуле IniFiles, который надо указывать в разделе подключаемых модулей Uses.
Объявление переменной, в которую будем заносить (или читать) данные:
Var IniFile : TIniFile;
где: IniFile - любой идентификатор, который будет использоваться в программе. Можно, например, для сокращения просто i.
Дальше переменную необходимо создать:
IniFile := TIniFile. Create('Название_файла');
где: Название_файла - файл, в котором будут храниться данные. Если вы напишите, например project. ini без указания пути к файлу, то такой файл создастся или будет читаться из каталога WINDOWS. Для размещения ini файла в каталоге программы, или относительно его (например КАТАЛОГ_ПРОГРАММЫ\INI) указывайте вместе с названием файла текущий каталог программы.
В конце использования переменной ее необходимо уничтожить и освободить занимаемую память. Это делается одной командой:
IniFile. Free;
В промежутке между созданием и уничтожением переменной IniFile находятся команды чтения (записи) параметров.
Если мы заглянем в любой файл настроек, например win. ini, то можно увидеть следующую архитектуру файла:
[windows]
NullPort=None
ILOVEBUNNY32=1
ScreenSaveActive=1
[Desktop]
Wallpaper=(None)
TileWallpaper=0
WallpaperStyle=0
[Intl]
iCountry=380
Строка, заключенная в квадратные скобки [] называется заголовком секции, и все данные между двумя заголовками являются секцией. В одной секции может быть только один уникальный параметр, т. е. название параметров в секции не должны повторяться дважды. После названия параметра следует знак равенства, после которого сама хранимая величина.
Чтение параметров:
Все команды чтения параметров являются функциями, т. е. сами возвращают требуемые значения.
Для чтения параметра Integer (целочисленной величины):
ПЕРЕМЕННАЯ_Integer:=IniFile. ReadInteger(СЕКЦИЯ, ПАРАМЕТР, ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ);
где: СЕКЦИЯ и ПАРАМЕТР - строковые значения. На из месте можно писать как саму строковую величину, например 'MAINPARAM', так и подставлять строковую переменную.
Если не обнаружится данного ini файла, или не обнаружится указанной секции, или в секции не будет заданного параметра, то функция возвращает значение_по_умолчанию. Это свойство очень удобно для задания в программе начальных значений.
Далее список функций, которые можно применять при чтении данных из ini файла. Их структура аналогична вышерассмотренной команде за исключением двух: возвращает параметр определенного типа, значение по умолчанию имеет тот же тип.
ReadString - чтение строковой переменной
ReadBool - чтение логической переменной
ReadDate - чтение даты
ReadTime - чтение времени
ReadDateTime - чтение даты и времени в одном параметре
ReadFloat - чтение числа с плавающей точкой
Запись параметров:
Все команды записи параметров являются процедурами. Они не возвращают никаких параметров, и, в случае неудачной попытки записи, программа выдает сообщение об ошибке.
Для записи параметра Integer:
IniFile. WriteInteger(СЕКЦИЯ, ПАРАМЕТР, ЗАПИСЫВАЕМАЯ_ВЕЛИЧИНА);
Далее для записи других типов данных:
WriteString - запись строковой переменной
WriteBool - запись логической переменной
WriteDate - запись даты
WriteTime - запись времени
WriteDateTime - запись даты и времени в одном параметре
WriteFloat - запись числа с плавающей точкой
Рассмотрим пример.
Создаем новый проект, в форму Form1 помещаем компоненты Edit, ComboBox, два компонента CheckBox, две кнопки BitBtn.
Для компонента ComboBox1 изменяем свойство Style в csDropDownList и редактируем свойство Items, занося туда несколько произвольных строк. Дальше для BitBtn1 свойство Caption изменяем на Сохранить, а для кнопки BitBtn2 - Восстановить. Окно принимает вид, показанный на рисунке.
В процедуре события FormCreate для окна Form1 пишем команду
ReadParams;
В процедуре события FormClose для окна Form1 пишем команду
WriteParams;
В процедуре нажатия на кнопку "Сохранить" аналогично закрытию окна команда WriteParams, для кнопки "Восстановить" - ReadParams.
Дальше привожу текст модуля Unit1 обратите внимание на выделенные строки. Их следует прописать вручную.
// -----Начало модуля Unit
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, inifiles; // подключение модуля, позволяющего работать с ini файлами
type
TForm1 = class(TForm)
Edit1: TEdit;
ComboBox1: TComboBox;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure ReadParams; // процедура чтения параметров
procedure WriteParams; // процедура записи параметров
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ReadParams;
Var IniFile:TIniFile; // объявление переменной, через которую будут обрабатываться данные
begin
IniFile:=TIniFile. Create('project. ini'); // создаем переменную
Form1.Top:=IniFile. ReadInteger('FORM1','Form1Top',Form1.Top); // верхнее положение окна
Form1.Left:=IniFile. ReadInteger('FORM1','Form1Left',Form1.Left); // левое положение окна
Form1.Height:=IniFile. ReadInteger('FORM1','Form1Height',Form1.Height); // высота
Form1.Width:=IniFile. ReadInteger('FORM1','Form1Width',Form1.Width); // ширина
Edit1.Text:=IniFile. ReadString('FORM1','Edit1Text',Edit1.Text); // текст в Edit1
ComboBox1.ItemIndex:=IniFile. ReadInteger('FORM1','ComboBox1ItemIndex',ComboBox1.ItemIndex); // выбранный пункт
CheckBox1.Checked:=IniFile. ReadBool('FORM1','CheckBox1Checked',CheckBox1.Checked); // состояние CheckBox1
CheckBox2.Checked:=IniFile. ReadBool('FORM1','CheckBox2Checked',CheckBox2.Checked); // состояние CheckBox2
IniFile. Free; // если сами создаем, то сами уничтожаем.
end;
procedure TForm1.WriteParams;
Var IniFile:TIniFile;
begin
IniFile:=TIniFile. Create('project. ini');
IniFile. WriteInteger('FORM1','Form1Top',Form1.Top);
IniFile. WriteInteger('FORM1','Form1Left',Form1.Left);
IniFile. WriteInteger('FORM1','Form1Height',Form1.Height);
IniFile. WriteInteger('FORM1','Form1Width',Form1.Width);
IniFile. WriteString('FORM1','Edit1Text',Edit1.Text);
IniFile. WriteInteger('FORM1','ComboBox1ItemIndex',ComboBox1.ItemIndex);
IniFile. WriteBool('FORM1','CheckBox1Checked',CheckBox1.Checked);
IniFile. WriteBool('FORM1','CheckBox2Checked',CheckBox2.Checked);
IniFile. Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ReadParams;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WriteParams;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
WriteParams;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
ReadParams;
end;
end.
// -----Конец модуля Unit
Вышерассмотренный пример можно забрать по этой ссылке (2 Кб).
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 |


