МИНОБРНАУКИ РОССИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ имени академика С.П.КОРОЛЕВА (НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ)» (СГАУ)
Факультет заочного обучения
Контрольная работа №2
по курсу
«Операционные системы»
Вариант 16
Выполнил:
студент группы 9637 Б358
Мельник Д.В.
Проверил:
Агафонова С.Е.
Самара, 2016
Задание:
Опишите класс TRegistry модуля Registry.pas. Создайте приложение, которое хранит свои настройки в реестре. В качестве настроек должны быть целочисленные, текстовые, булевые данные. Включите в настройки также положение и размеры формы окна приложения.
Описание класса TRegistry
Прежде чем рассмотреть пример использования свойств и методов класса TRegistry, кратко перечислю их.
В следующей таблице перечислены свойства класса TRegistry.
Свойство
|
Описание
|
CurrentKey
|
Позволяет узнать текущую подсекцию, в которой проводятся операции по чтению и записи. Для изменения подсекции следует использовать методы OpenKey и OpenKeyReadOnly
|
CurrentPath
|
Позволяет узнать полное название текущей подсекции
|
LazyWrite
|
Задает способ обновления информации в реестре – непосредственно или после вызова метода CloseKey.
|
RootKey
|
Задает корневую секцию в реестре. По умолчанию установлено значение HKEY_CURRENT_USER
|
В следующей таблице перечислены методы класса TRegistry.
Метод
|
Описание
|
CloseKey
|
Записывает внесенные изменения и закрывает текущую подсекцию
|
Create
|
Создает экземпляр класса TRegistry и задает значение корневой секции - HKEY_CURRENT_USER
|
CreateKey
|
Создает подсекцию
|
DeleteKey
|
Удаляет подсекцию
|
DeleteValue
|
Удаляет значение элемента
|
Destroy
|
Уничтожает ранее созданный экземпляр класса TRegistry
|
GetDataInfo
|
Возвращает тип данных для указанного элемента
|
GetDataSize
|
Возвращает размер данных для указанного элемента
|
GetDataType
|
Возвращает тип данных для указанного элемента
|
GetKeyInfo
|
Возвращает информацию о текущем элементе
|
GetKeyNames
|
Возвращает имена подсекций для указанной секции
|
GetValueNames
|
Возвращает названия элементов для указанной подсекции
|
HasSubKeys
|
Позволяет узнать, имеются ли подсекции для указанной секции
|
KeyExists
|
Позволяет узнать, существует ли элемент
|
LoadKey
|
Создает новую подсекцию и загружает в нее информацию из указанного файла
|
MoveKey
|
Перемещает указанную подсекцию и все вложенные подсекции в заданное место
|
OpenKey
|
Открывает подсекцию
|
OpenKeyReadOnly
|
Открывает подсекцию только для чтения
|
ReadBinaryData
|
Считывает данные в бинарном формате
|
ReadBool
|
Считывает данные в булевом формате
|
ReadCurrency
|
Считывает данные в формате валюты
|
ReadDate
|
Считывает данные в формате даты
|
ReadDateTime
|
Считывает данные в формате “дата/время”
|
ReadFloat
|
Считывает данные в формате с плавающей точкой
|
ReadInteger
|
Считывает данные в целочисленном формате
|
ReadString
|
Считывает данные в строчном формате
|
ReadTime
|
Считывает данные в формате времени
|
RegistryConnect
|
Устанавливает соединение с реестром на другом компьютере
|
RenameValue
|
Переименовывает элемент
|
ReplaceKey
|
Замещает значение элемента значениями из файла
|
RestoreKey
|
Восстанавливает значение элемента из файла
|
SaveKey
|
Сохраняет значение элемента в файле
|
UnLoadKey
|
Удаляет подсекцию, загруженную методом LoadKey
|
ValueExists
|
Позволяет узнать, существует ли значение у элемента
|
WriteBinaryData
|
Записывает данные в бинарном формате
|
WriteBool
|
Записывает данные в булевом формате
|
WriteCurrency
|
Записывает данные в формате валюты
|
WriteDate
|
Записывает данные в формате даты
|
WriteDateTime
|
Записывает данные в формате “дата/время”
|
WriteExpandString
|
Записывает данные в формате "расширенно" строки
|
WriteFloat
|
Записывает данные в формате с плавающей точкой
|
WriteInteger
|
Записывает данные в целочисленном формате
|
WriteString
|
Записывает данные в строчном формате
|
WriteTime
|
Записывает данные в формате времени
|
После того как я кратко познакомил со свойствами и методами класса TRegistry, давайте рассмотрим несколько примеров их использования.
Инициализация
Перед использованием свойств и методов класса TRegistry, необходимо создать экземпляр этого класса. Например:
Code:
var
R: TRegistry;
R := TRegistry.Create;
Задание корневой секции
Если вы собираетесь работать с секцией, отличной от HKEY_CURRENT_USER (это значение задается по умолчанию), то после инициализации вы должны изменить значение свойства RootKey. Возможны следующие значения:
Code:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_PERFORMANCE_DATA
HKEY_CURRENT_CONFIG
HKEY_DYN_DATA
Разработка программы
Реестр - это центральное хранилище информации о параметрах системы и установленных программах. В версиях Windows до Windows 95 программисты сохраняли параметры программ либо в INI-файлах WIN.INI и SYSTEM.INI, либо в дополнительных INI-файлах. Хотя использование INI-файлов поддерживается и в Win32, Microsoft настоятельно рекомендует для хранения необходимых в работе программы параметров пользоваться реестром. Реестр представляет собой иерархическую базу данных, cостоящую из секций, подсекций и элементов. Каждая секция имеет свое назначение. Хранить данные о пользовательских программах Microsoft рекомендует в секции HKEY_CURRENT_USER и подсекции Software. В этой подсекции вы создаете подсекцию, идентифицирующую вашу программу или фирму, и уже внутри нее располагаете данные.
Модуль Registry
Для упрощения работы с регистратором в состав Delphi (начиная с версии 2.0) входит модуль REGISTRY, содержащий реализацию трех классов, - TRegistry, TRegistryIniFile и TRegIniFile.
Внимание! Чтобы использовать свойства и методы классов TRegistry, TRegistryIniFile и TRegIniFile, необходимо включить в список uses модуль Registry.
TRegIniFile
Собственно говоря, задача класса TRegIniFile - упростить перенос 16-битных программ в среду Windows 95. Методы этого класса эквивалентны методам класса TIniFile в 16-битной версии Delphi. Класс TRegIniFile позволяет обращаться к секции HKEY_CURRENT_USER, считывать и записывать строки (методы ReadString и WriteString), целочисленные значения (методы ReadInteger и WriteInteger), логические значения (методы ReadBool и WriteBool), секции (методы ReadSection, ReadSections и ReadSectionValues), удалять секции (метод EraseSection) и элементы (метод DeleteKey). Рассмотрим на примерах, как используются функции этого класса.
Microsoft рекомендует записывать данные, относящиеся к вашей программе, в подсекции секции HKEY_CURRENT_USER_Software. Предположим (не особенно фантазируя на эту тему), что ваша программа называется RegDemo, и данные для нее располагаются в секции Software\RegDemo. Ниже мы покажем, как поместить в регистратор строчные, целочисленные и логические данные, а затем считать их, - этих операций будет достаточно для того, чтобы сохранить в регистраторе параметры нашей программы, а затем считать их.
Прежде чем записать данные в определенную секцию, ее необходимо создать. Это происходит при вызове конструктора объекта TRegIniFile. В качестве параметра вы указываете название секции, и если таковой не существует, она создается:
RegFile := TRegIniFile.Create(SubKey);
После того как файл регистратора открыт (и создана определенная секция), мы можем записать данные. Поддерживаются три типа данных: целочисленные, логические и строчные данные. Для записи этих данных существуют методы WriteInteger, WriteBool и WriteString. В качестве параметров указываются:
- название подсекции;
- название элемента;
- записываемые данные.
Так, чтобы записать значение элемента MyIntVal в подсекции IntKey, следует выполнить код
RegFile.WriteInteger(IntKey, 'Int_Val', 32000);
а для того чтобы прочесть значение, необходимо вызвать метод ReadInteger (в качестве параметров указываются название подсекции, название элемента и значение по умолчанию):
RegFile.ReadInteger(IntKey, 'Int_Val', 0));
Для чтения логических и строчных данных используются соответственно методы ReadBool и ReadStr, а для их записи – методы WriteBool и WriteString.
Текст программы
unit Unit1;//Заголовок программы
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, Registry;//Подключаемые библиотеки
type
TForm1 = class(TForm)
mm1: TMainMenu;
N1: TMenuItem;
btn1: TButton;
edt1: TEdit;
lbl1: TLabel;
lbl2: TLabel;
edt2: TEdit;
lbl3: TLabel;
lbl4: TLabel;
edt3: TEdit;
edt4: TEdit;
lbl5: TLabel;
lbl6: TLabel;
chk1: TCheckBox;
edt5: TEdit;
procedure N1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure chk1Click(Sender: TObject);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
procedure MyCreateRegistr();//Процедура создания ключей в регистре
procedure MyReadRegistr();//Процедура считывания ключей в регистре
implementation
{$R *.dfm}
procedure MyReadRegistr();// процедура считывания ключей из регистра
var Registry: TRegistry;// описание переменной регистр
begin
Registry := TRegistry.Create;//Инициализация переменной регистр
Registry.RootKey := HKEY_CURRENT_USER;//Определяем каталог считывания
Registry.OpenKey('software\1MyKey',true);//включаем доступ к подкаталогу
Form1.edt1.Text:=IntToStr(Registry.ReadInteger('S1'));//считываем ключ из регистра
Form1.edt2.Text:=IntToStr(Registry.ReadInteger('S2')); //считываем ключ из регистра
Form1.edt3.Text:=IntToStr(Registry.ReadInteger('S3')); //считываем ключ из регистра
Form1.edt4.Text:=IntToStr(Registry.ReadInteger('S4')); //считываем ключ из регистра
Form1.edt5.Text:=Registry.ReadString('Caption'); //считываем ключ из регистра
Form1.chk1.Checked:=Registry.ReadBool('S5'); //считываем ключ из регистра
Registry.CloseKey;//Закрывает право доступа
Registry.Free;//Очищаем переменную
end;//Конец процедуры
procedure MyCreateRegistr();//Процедура создания ключей в регистре
var Registry: TRegistry;// описание переменной регистр
begin
Registry := TRegistry.Create;// инициализация переменной
Registry.OpenKey('software\1MyKey',true);//открытие подкаталога для записи
Registry.WriteString('Caption',Form1.edt5.Text);// запись переменной в ключ
Registry.WriteInteger('S1',StrToInt(Form1.edt1.Text)); // запись переменной в ключ
Registry.WriteInteger('S2',StrToInt(Form1.edt2.Text)); // запись переменной в ключ
Registry.WriteInteger('S3',StrToInt(Form1.edt3.Text)); // запись переменной в ключ
Registry.WriteInteger('S4',StrToInt(Form1.edt4.Text)); // запись переменной в ключ
Registry.WriteBool('S5',Form1.chk1.Checked); // запись переменной в ключ
Registry.CloseKey;//Закрытие доступа редактирования
Registry.Free;//Уничтожение переменной регистр
end;//конец процедуры
procedure TForm1.N1Click(Sender: TObject);//Реализация кнопки выход
begin
Form1.Close();//Выход
end;
procedure TForm1.FormCreate(Sender: TObject);// Инициализация приложения
var Registry: TRegistry;//описание переменной регистр
begin
Registry := TRegistry.Create;// инициализация переменной регистр
If Registry.KeyExists('software\1MyKey') then MyReadRegistr() else MyCreateRegistr();// определяем существует ли каталог, если нет то создаем его из первоначальных настроек, если да то считываем настройки
end;
procedure TForm1.chk1Click(Sender: TObject);//запрет/разрешение записи настроек
begin
if Form1.chk1.Checked then
begin
Form1.btn1.Enabled:=False;//запрещаем редактирование
end
else
begin
Form1.btn1.Enabled:=True;//разрешаем редактирование
end;
end;
procedure TForm1.btn1Click(Sender: TObject);//процедура записи ключей
begin
MyCreateRegistr();//Запись ключей в регистр
end;
end.//Конец программы
Работа программы.
|