Системный реестр Windows




Программа

Конечной целью программиста, работающего в Delphi, является создание программы - исполняемого файла, который может загружаться и выполняться под управлением 32-разрядной версии Windows. В этой главе рассматриваются вопросы, относящиеся к программе в целом. В ней, в частности, описываются многочисленные вспомогательные файлы, связанные с программой, доступные программе глобальные объекты, ее динамическая настройка с помощью файлов инициализации и/или системного реестра. В конце главы приводятся некоторые сведения о 32-разрядной версии Window s и механизмах взаимодействия программы с этой операционной системой.

Программные файлы

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

Файл проекта

Файл проекта имеет расширение DPR. Обычно он не виден в окне кода - чтобы его увидеть, следует воспользоваться командой Project ► View source среды Delphi. Если закрыть файл проекта с помощью команды File ► Close или клавиш Alt+F4, вместе с ним закроются и все остальные формы проекта. Чтобы этого не произошло, используйте клавиши Ctrl+F4 или команду Close Page контекстного меню файла проекта.

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

Зарезервированное слово program открывает файл проекта; оно может встретиться в программе лишь один раз.

В предложении uses перечисляются все (или лишь некоторые) связанные с проектом формы. Помимо стандартного модуля Forms, необходимого для создания главного окна программы, в нем указывается также модуль Unitl, связанный собственно с главным окном. Обратите внимание на использование зарезервированного слова in для указания файла с текстом модуля ('Unitl. pas') и комментария ({Forml }), который именует объект-окно, создаваемый модулем Unitl. Такого рода объявления Delphi автоматически создает для каждого включенного в проект модуля. Только перечисленные в этом предложении модули Delphi считает входящими в проект, и их алфавитный список появляется при выборе команды View ► Units; а при выборе команды View ► Forms отображается список всех перечисленных в комментариях объектов.

Следует учесть, что если вы хотите перенести проект в другую папку и при этом сохранить его работоспособность, нужно сначала с помощью команды File ► Save Project As скопировать в эту папку файл проекта, а затем с помощью команды File ► Save As перенести туда все связанные с проектом модули: только в этом случае Delphi сумеет внести необходимые корректировки в файл проекта. Но если все файлы хранятся в единственной папке, в предложении uses не указываются пути доступа, и вы можете безболезненно разом скопировать все файлы в другую папку.

ПРИМЕЧАНИЕ

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

В разделе исполняемых операторов формируются, как минимум, три оператора: вызовы методов Initialize, CreateForm и Run глобального объекта Application. Метод Initialize предусмотрен «на всякий случай» и по умолчанию, ничего не делает. Чтобы заставить его работать, следует поместить указатель на соответствующую процедуру без параметров в глобальную переменную InitProc. Это можно сделать в секции инициализации любого модуля (напомню, что код этих секций активизируется до начала работы основной программы) или непосредственно в теле главного проекта:

Разумеется, в этом последнем случае проще в первом операторе основной программы явно обратиться к процедуре Init. Вообще говоря, в подавляющем большинстве случаев оператор Application. Initialize можно удалить без каких-либо последствий для программы.

Следует учесть, что до оператора Application. Run можно вставить любые другие операторы Delphi. В приводимом ниже примере (он заимствован из справочной службы Delphi) в программе создается пять окон. В форме Form5 имеется компонент ProgressBar1, с помощью которого визуализируется процесс загрузки программы, точнее - процесс создания остальных окон.

С помощью метода Application.Run программа подключается к циклу обработки сообщений Windows. Выход из метода возможен лишь после закрытия главного окна программы.

Программист может показать диалоговое окно с запросом пароля и блокировать вызов метода Application. Run, если введенный пользователем пароль неверен. В следующем примере (листинг 22.1) в проекте используются две формы: стандартная форма InputQuery и обычная главная форма MainForm. Форма InputQuery создается при обращении к одноименной функции, определенной в модуле Dialogs. Она представляет собой небольшое диалоговое окно с однострочным текстовым полем TEdit и двумя кнопками - ОК и Cancel. В окне пользователь должен ввести пароль (Delphi) и нажать клавишу Enter (проект Chap_22\ Password\Password.dpr).

Таким же способом можно создавать пробные версии программ, которые будут функционировать только до определенной даты или до исчерпания заданного количества запусков (см. проект Chap_22\Registery\Trialdpr).

С проектом может быть не связано ни одного видимого окна. Такие программы называются консольными. Они используются для проведения работ, не требующих диалога с пользователем и соответствующих средств ввода-вывода информации. Например, они могут пассивно ждать наступления определенного часа (обычно ночью), чтобы провести резервное копирование базы данных.

Консольные программы не вызывают методы CreateForm и Run объекта Application. Вместо этого в раздел исполняемых операторов файла проекта помещается код, который реализует необходимые действия.

Для создания консольного приложения нужно выбрать значок Console Application на вкладке New окна хранилища объектов. В ответ Delphi создаст файл проекта следующего вида:

Директива {$APPTYPE CONSOLE} дает в распоряжение программы «консольные» средства ввода-вывода. В этом случае программа автоматически исполняется в окне MS - DOS, и с помощью операторов ReadLn, WriteLn программист может ввести что-то с клавиатуры и вывести на экран так, как если бы программа работала под управлением MS - DOS. Если программе не нужны даже такие средства общения с внешним миром, эту директиву следует удалить.

Несмотря на полное отсутствие видимых окон или их замену окном MS-DOS, консольная программа остается полноценным 32-разрядным приложением и после ссылки на нужные модули ей доступны глобальные объекты, средства типа InputQuery, ShowMessage и т. п.

Файлы модулей

Файлы с текстами модулей имеют расширения PAS. После компиляции для каждого такого файла создается одноименный файл машинного кода с расширением DCU. Если модуль содержит объект-окно, на этапе конструирования создается и автоматически изменяется файл описания формы с расширением DFM (файл будет реально создан после сохранения модуля на диске). Файлы PAS и DFM жизненно важны для проекта: удаление любого из них приведет к невозможности повторной компиляции проекта.

В ранних версиях Delphi файл DFM был двоичным, то есть он описывал форму на языке, понятном только компилятору. В версиях 5...7 он может быть текстовым.

Например:

В таком формате программист может вручную отредактировать файл описания формы. Если, например, в предыдущем примере вместо типа TButton написать TLabel, после загрузки проекта в среду Delphi на месте кнопки окажется метка. Выбор формата файла описания формы осуществляется с помощью флажка New forms as text на вкладке Designer диалогового окна настройки параметров среды (открывается командой Tools ►Environment Options). Поскольку, как уже говорилось, файл описания формы жизненно важен для функционирования проекта, ручное его изменение может привести к ошибкам. В этом случае восстановить его можно, удалив из него все внесенные вами изменения, либо воспользовавшись его резервной копией, имеющей расширение ~DF.

В версии 7 помимо файлов с расширениями PAS и DFM создается также DDP -файл, в котором сохраняются сведения обо всех созданных для окна диаграммах.

Файлы ресурсов

Файл проекта содержит директиву компилятора {$R *. RES}, с помощью которой на этапе компоновки к исполняемому файлу присоединяется файл ресурсов. Последний имеет имя, совпадающее с именем проекта, и расширение RES. Он создается автоматически для каждого проекта. В него Delphi помещает значок программы, номер ее версии и тому подобные данные. В этом файле не следует размещать никаких дополнительных ресурсов (указателей, строк, значков и т. п.), так как при каждой компиляции файл ресурсов создается заново. Если в программу необходимо ввести дополнительные ресурсы, их нужно разместить в отдельном файле и вставить в файл проекта соответствующую директиву (пример создания дополнительного ресурса описан в разделе «Указатели мыши» главы 14).

Файлы настройки

Для проекта создаются также три вспомогательных текстовых файла, в которых сохраняются параметры настройки компилятора (CFG), проекта (DOF) и среды (DSK). Хотя все они текстовые, их ручное редактирование нежелательно, так как при внесении в них неправильных изменений компиляция проекта может сопровождаться сообщением «Программа выполнила недопустимую операцию и будет закрыта», после чего Delphi выгружается из памяти. В такого рода случаях следует просто удалить все три настроечных файла и повторить компиляцию - Delphi создаст новые настроечные файлы с параметрами настройки по умолчанию.

Файлы резервных копий

При внесении в проект изменений Delphi обычно создает резервные копии измененных файлов. Эти копии имеют расширения, начинающиеся символом тильда (~). Они создаются «на всякий случай» и содержат состояние проекта и/или модулей до внесения изменений. От создания резервных копий можно отказаться, если снять флажок Createbackupfile на вкладке Display диалогового окна EditorOptions (открывается командой Tools ► Editor Options).

Глобальные объекты

С любой запущенной программой автоматически связываются от двух до пяти глобальных объектов: Application (Программа), Screen (Экран), Printer (Принтер), Session (Сеанс) и Clipboard (Буфер обмена). Все они объявлены как глобальные переменные в наиболее часто используемых модулях: Application и Screen - в модуле Forms, Printer - в модуле Printers, Session - в модуле DBTables и, наконец, Clipboard - в модуле Clipbrd. Создание этих объектов реализуется в секциях инициализации соответствующих модулей, так что к моменту начала исполнения первого оператора файла проекта они уже готовы к работе.

Application

Объект Application относится к классу TApplication и инкапсулирует важнейшие свойства и методы программы как таковой. Он создается автоматически и доступен любой программе1. Объекта Application нет в палитре компонентов, поэтому его свойства недоступны на этапе конструирования, но становятся доступными при прогоне программы2.

Объект Application является посредником между программой и операционной системой Windows. В частности, с его помощью осуществляется диспетчеризация сообщений Windows, реализуется контекстная справочная служба, он обрабатывает клавиши быстрого доступа, исключительные ситуации и т. д. Свойства класса TApplication перечислены в табл. 22.1.


Методы класса TApplication перечислены в табл. 22.2.

 

 


 

С помощью методов HandleException и ProcessMessages программа может временно приостановить свою работу до тех пор, пока не будут обработаны все предназначенные ей сообщения Windows. Это бывает необходимо для обновления видимых компонентов в процессе отображения длительного по времени цикла работы. Если, например, программа изменит текст метки (компонента TLacel) или состояние индикатора процесса (компонента TProgressBar), сообщение об этом поступит в очередь сообщений и останется в ней, пока не закончится текущая работа. Вызов метода HandleException или ProcessMessages в этом случае позволит метке или индикатору немедленно обновить свой вид и отобразить новую фазу процесса. Разница между методами HandleException и ProcessMessages состоит в том, что первый после очистки очереди сообщений вызывает обработчик фонового события On Idle, а второй не делает этого (о назначении события Onldle см. ниже).

Функция MessageBox дает удобное средство вывода на экран небольшого сообщения. Параметр Flags может быть произвольной комбинацией следующих значений:

* mb_AbortRetryIgnore - в окно вставляются кнопки Abort, Retry, Ignore;

* mb_ApplModal - пользователь должен закрыть это окно перед тем, как продолжить работу с окном, его породившим; однако он может переходить в другие окна и работать с ними (этот признак устанавливается по умолчанию, если не определены ни mb_SystemModal, ни mb_TaskModal);

mb_DefButtonl - кнопкой по умолчанию является кнопка 1;

mb_DefButton2 - кнопкой по умолчанию является кнопка 2;

I mb_Def Button3 - кнопкой по умолчанию является кнопка 3;

mb_DefButton4 - кнопкой по умолчанию является кнопка 4;

mb_Help - в окно вставляется кнопка Help;

mb_IconAsterisk - в окно вставляется значок в виде строчной буквы i в кружке;

mb_IconExclamation - в окно вставляется значок в виде восклицательного знака;

mb_IconHand - в окно вставляется значок в виде знака Стоп;

mb_lconlnf ormation - то же, что и mb_IconAsterisk;

mb_IconQuestion - в окно вставляется значок в виде знака вопроса;

mb_IconStop -тоже, что и mb_IconHand;

mb_Ok - в окно вставляется кнопка ОК;

mb_OkCancel - в окно вставляются кнопки ОК и Cancel;

mb_RetryCancel - в окно вставляются кнопки Retry и Cancel;

mb_SystemModal - все программы приостанавливают свою работу, пока пользователь не закроет окно;

mb_TaskModal -приостанавливается работа во всех окнах данной программы до тех пор, пока пользователь не закроет окно;

mb_YesNo - в окно вставляются кнопки Yes, No;

mb_YesNoCancel - в окно вставляются кнопки Yes, No, Cancel.

Пример:

Функция MessageBox возвращает следующие значения:

idAbort - была нажата кнопка Abopt;

idCancel - была нажата кнопка Cancel;

idlgnore - была нажата кнопка Ignore;

idOk - была нажата кнопка ОК;

idNo - была нажата кнопка No;

ldRetry - была нажата кнопка Retry;

idYes - была нажата кнопка Yes.

Альтернативой функции MessageBox является глобальная функция Message - Dlg, объявленная в модуле Dialogs:

function MessageDlg(const Msg: String; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: Longint): Word;

Эта функция имеет параметр HelpCtx, с помощью которого создаваемое ею окно можно легко связать со справочной службой. В отличие от окна MessageBox, заголовок oKHaMessageDlg не может изменяться программистом - он определяется типом окна, задаваемым параметром АТуре со следующими возможными значениями:

mtWarning - значок в виде восклицательного знака, заголовок Warning;

mtError - значок в виде знака Стоп, заголовок Error; :

mtlnformation - значок в виде буквы г, заголовок Information;

mtConf irmation - значок в виде вопросительного знака, заголовок Confirm;

mtCus t om - нет значка, заголовок содержит имя исполняемого файла программы.

Набор кнопок задается в виде конструктора множества и может включать:

mbYes - кнопка Yes (результат, возвращаемый функцией при щелчке на этой

кнопке - mrYes);

mhNo - кнопкаNo (mrNo);

mbOk - кнопка OK (mrOk);

mbCancel - кнопка Cancel (mrCancel);

mbHelp - кнопка Help (после щелчка на этой кнопке окно не закрывается);

mbAbort - кнопка Abort (mrAbort);

mblgnore - кнопка Ignore (mrlgnore);

mbAll - кнопка All (mrAll).

В отличие от окна MessageBox, раскрытие окна MessageDlg не сопровожда­ется системным звуком.

События класса TApplication представлены в табл. 22.3.

Событие OnIdie возникает всякий раз, когда программа обнаруживает, что ее очередь сообщений пуста. Обработчик этого события может незаметно для пользователя выполнить вспомогательную работу, например, проверить орфографическую правильность только что введенного слова или собрать и обработать статистические данные. Важно помнить, что выполняемая в обработчике работа не может занимать много времени, иначе программа перестанет реагировать на запросы пользователя. Если фоновая работа отнимает много времени, ее следует разбить на сравнительно небольшие фрагменты или периодически вызывать в ней метод HandleMessage. Обработчик в параметре Done сообщает о необходимости продолжить фоновую работу (Done = False) или о ее завершении (Done = True). В первом случае программа просмотрит очередь сообщений и после ее очистки вернет управление обработчику Onldle. Во втором случае программа будет ожидать поступления новых сообщений.

Cовет

Событие Onldle введено в Delphi для совместимости с платформой Windows 3.x, в которой не поддерживается многопоточность. Если вы работаете с, 32-разрядной версией Windows и вам действительно нужно проделать некоторую фоновую работу, имеет смысл поручить ее выполнение отдельному потоку команд (см. ниже подраздел «Процессы и потоки» в разделе «Программа и Windows »).

Screen

Объект Screen класса TScreen инкапсулирует свойства и методы, упрощающие работу с дисплеем компьютера, в том числе с его помощью оперативно изменяется вид используемого программой указателя мыши. Как правило, программа устанавливает указатель в виде песочных часов перед началом длинной по времени работы и восстанавливает заданную по умолчанию форму указателя после ее завершения. Для этого используется свойство Cursor объекта Screen:

Наиболее важные свойства объекта Screen перечислены в табл. 22.4.

Программа с помощью API -функции ActivateKeyboardLayout может изменить раскладку клавиатуры. Свойство DefaultKbLayout позволяет восстановить прежнюю раскладку. Следующая программа всегда запускается с русскоязычной раскладкой клавиатуры:

При работе под управлением Windows2000/XP программа может работать одновременно с множеством мониторов, которые в совокупности образуют первичный монитор, составленный из остальных слева направо и сверху вниз. Ряд свойств DesktopXXX определяют положение и размеры текущего монитора в координатах первичного. Если программа работает с единственным монитором, значения этих свойств и свойств XXX (Height, Left, Top, Width) совпадают. Свойство MonitorCount содержит общее количество обслуживаемых мониторов; с помощью свойства Monitors можно указать конкретный монитор в рамках первичного.

Свойство Fonts содержит список всех зарегистрированных в системе экранных шрифтов. Этот список можно связать с раскрывающимся списком, чтобы пользователь мог выбрать нужный шрифт:

С объектом Screen связаны два события:

property OnActiveControlChange: TNotifyEvent; - возникает при переходе фокуса ввода от одного элемента к другому;

property OnActiveFormChange: TNotifyEvent; - возникает при переходе фокуса ввода от одной формы к другой.

Printer

Объект Printer автоматически создается, если в программе указана ссылка на модуль Printers. Этот объект предоставляет программисту все необходимое для того, чтобы заставить программу выводить данные на один из подключенных к компьютеру принтеров.

Вывод на принтер в Windows ничем не отличается от вывода на экран: в распоряжение программиста предоставляется свойство Canvas объекта Printer, содержащее набор графических инструментов и методы, свойственные классу TCanvas (подробнее см. раздел «Графический инструментарий» в главе 13). Размер листа бумаги в пикселах принтера определяют свойства Не ight и Width, а набор принтерных шрифтов - свойство Fonts.

Свойства объекта Printer перечислены в табл. 22.5.

Методы объекта Printer перечислены в табл. 22.6.

Существует множество способов печати текста на принтере. Прежде всего следует упомянуть о глобальной процедуре AssignPrn (она определена в модуле Printers), позволяющей использовать принтер как текстовый файл и печатать текстовые строки с помощью процедуры WriteLn. В листинге 22.2 приведен полный текст модуля, на форме которого расположено многострочное текстовое поле Memo 1 и 4 кнопки: для выбора текстового файла и ввода его содержимого в поле, для выбора нужного шрифта отображения/печати документа, для инициирования процесса печати и для завершения работы программы (проект Chap_22\Print of Text (AssignPrn)\PrintText.dpr).

Листинг 22.2 Печать с помощью процедуры AssiqnPrn


 

 

 

Такой способ печати - самый примитивный. С его помощью невозможно вывести линии, разделяющие колонки или строки, трудно форматировать текст, вставлять заголовки, номера страниц и т.п.

Значительно более гибкие средства обеспечивает свойство Printer. Canvas. В листинге 22.3 показано, как с его помощью можно напечатать текст, содержащийся в поле Memol (проект Chap_22\Print of Text(Canvas)\PrintText.dpr).

Как видим, прямое обращение к графическим инструментам свойства Canvas требует от программиста значительно больших усилий, но зато предоставляет ему полный контроль над печатным изображением.

Наконец, очень хороших результатов можно достичь, используя специализированные средства просмотра/печати документов, такие как текстовый процессор MS Word.

Печать изображений может показаться очень сложным делом, однако свойство Printer. Canvas содержит метод, который легко справляется с этой задачей:

При обращении к этому методу первым параметром указывается прямоугольная область, отводимая на поверхности листа для распечатки изображения, вторым - объект класса TGraphic, в котором хранится изображение.

Например:

Не следует забывать также о том, что любая форма, являющаяся потомком базового класса TCustomForm, получает метод Print, с помощью которого на принтере печатается клиентская часть формы (без заголовка и рамки).

Clipboard

В Windows широко используется буфер обмена ( clipboard ). Если в программе Delphi сослаться на модуль Clipbrd, для нее становится доступным автоматически созданный объект Clipboard, инкапсулирующий свойства (табл. 22.7) и методы (табл. 22.8) для работы с буфером обмена.


Большая часть компонентов, предназначенных для хранения текста и/или изображений, имеют собственные методы для работы с буфером обмена. Например, текстовые поля TEdit, TMemo, TRichEdit имеют методы CopyToClipboard (Копировать в буфер), CutToClipboard (Вырезать и поместить в буфер), Paste-FromClipboard (Вставить из буфера); компонент TImage имеет свойство Picrture класса TPicture, которое инкапсулирует методы LoadFromClip-boardFormat, SaveToClipboardFormat и RegisterClipboardFormat - с помощью этих методов компонент обменивается с буфером изображениями определенного формата и может зарегистрировать в нем новый формат изображения. Тем не менее эти и другие компоненты для работы с буфером обмена могут использовать свойство AsText объекта Clipboard и его методы Assign, GetTextBuffer, SetTextBuf f er. Например, чтобы поместить в буфер обмена изображение, хранящееся в объекте Imagel, можно обратиться к методу Assign буфера:

А для копирования изображения и.ч буфера обмена можно обратиться к метолу

Picture.Assign компонента Imagel:

Метка не имеет средств работы с буфером обмена, но программа может прочитать в нее текст из буфера:

Можно также поместить в буфер обмена содержимое свойства Caption метки:

Настройка программы

Удобным средством хранения индивидуальных параметров программы являются широко используемые в Windows 3.x файлы инициализации (файлы с расширением INI). Для 32-разрядных версий Windows индивидуальная настройка программ чаще всего реализуется с помощью системного реестра. В этом разделе рассматриваются оба способа, так как даже если вы работаете с 32-разрядной версией Windows, перенос программ на другие компьютеры и их настройку проще реализовать с помощью файлов инициализации.

Файлы инициализации

Файлы инициализации в Delphi связаны с объектами класса TIniFile. Эти объекты не являются глобальными и создаются программно по мере надобности. С каждой программой можно связать сколько угодно файлов инициализации.

Физически файл инициализации представляет собой обычный текстовый файл, который сохраняется либо в каталоге запуска программы (локальный файл инициализации), либо в каталоге запуска Windows (глобальный файл инициализации). Файл содержит ряд секций, каждая из которых имеет заголовок и следующие за ним параметры. Заголовок - это произвольный английский текст, заключенный в квадратные скобки. Каждый параметр представлен строкой вида:

В этом примере в секции Location файла инициализации представлены два параметра с именами DataBase и Graphics. Объекты класса TIniFile предоставляют удобные средства чтения/записи параметров по именам параметров и секций.

В объекте имеется

единственное свойство FileName: String, содержащее имя файла инициализации с возможным путем поиска.

Методы класса TIniFile перечислены в табл. 22.9.


 

ПРИМЕЧАНИЕ

В функциях ReadXXXX (ReadBool, ReadData ит. п.) используется параметр Default того же типа, что и тип возвращаемого результата. Если функция не найдет указанной секции или нужного параметра, а также если значение параметра окажется не ожидаемого типа, она возвращает значение Default.

ПРИМЕЧАНИЕ

Если при обращении к процедуре WriteXXXX (WriteBool, WriteData и т. п.) не существует указанной секции и/или параметра, они будут созданы.

В листинге 22.4 представлен модуль, иллюстрирующий приемы работы с файлом инициализации, а на рис. 22.1 показано создаваемое им окно (проект Chap_22\IniFile\IniFHe.dpr).

 

 


Отмечу, что если путь доступа к файлу инициализации не указан (как в нашем примере), считается, что он располагается в системном каталоге (обычно C:\Windows).

Системный реестр Windows

Системный реестр Windows - это общедоступная база данных, хранящая индивидуальную для каждого компьютера настроечную информацию, используемую программным обеспечением. Данные в реестре упорядочены в древовидные структуры, состоящие из узлов, которые в терминологии Windows называются ключами. Каждый ключ имеет один родительский ключ, один или несколько дочерних ключей и ноль или несколько пар типа имя_параметра=значение. Исключение представляют корневые ключи, (они не имеют родителей) и дочерние ключи низшего уровня (они не имеют дочерних ключей). По умолчанию несистемное программное обеспечение регистрирует свою информацию в корневом ключе с именем HKEY_CURRENT_USER. Для просмотра/коррекции системного реестра используется утилита REGEDIT.EXE.

Системному реестру Windows соответствует объект класса TRegistry, свойства которого представлены в табл. 22.10.

Перечень флагов для свойства Access: s KEY_QUERY_VALUE - разрешает запрос значений дочерних ключей;

ш KEY_ENUMERATE_SUB_KEYS - разрешает получение списка всех дочерних ключей;

Ш KEY_NOTIFY - разрешает получение извещения об изменении ключа;

KEY_SET_VALUE - разрешает изменение значений дочерних ключей;

KEY_CREATE_SUB_KEY - разреогает создание дочерних ключей;

ш KEY_CREATE_LINK - разрешает создание строковой ссылки;

KEY_EXECUTE - определяет доступ к ключу в режиме «только для чтения».

Ш KEY_ALL_ACCESS - комбинация флагов KEY_READ, KEY_WRITE и KEY_CREATE_LINK;

KEY_READ - комбинация флагов KEY_QUERY_VALUE, KEY_ENUMERATE_

SUB_KEYS И KEY_NOTIFY;

KEY WRITE — комбинация флагов KEY_SET_VALUE ИKEY_CRF.ATF._SUB_KEY, Методы класса TRegistry перечислены в табл. 22.11.


 


Системный реестр - удобное место для размещения некоторых «секретных» данных, которые не должны быть на виду у пользователей. Например, при первом запуске пробных версий программ в него помещается дата запуска или максимальное количество запусков. Перед очередным прогоном эта информация проверяется, в результате после некоторого количества запусков или по истечении установленного времени пробная версия программы перестает нормально работать.

В листинге 22.5 представлен файл проекта, в котором пробная версия програм­мы может запускаться не более 5 раз (см. проект Chap_22\Registry\Trial.dpr).

Небольшой комментарий. Двумя обращениями к функции TRegistry. OpenKey создается и/или открывается узел HKEY_CURRENT_USER\Software\ TrialProg системного реестра. Функция TRegistry. ValueExists возвращает значение True, если в этом узле есть параметр с именем MaxRun и для него определено значение. При первом запуске программы это не так, поэтому процедурой Writelnteger создается параметр и для него указывается начальное значение 5 (максимальное количество прогонов программы). При каждом следующем запуске этот параметр уменьшается на 1, и в момент, когда он становится равным нулю, программа блокирует создание и вызов главного окна.

Delphi создает надстройку над классом TRegistry для того, чтобы манипуляция с системным реестром Windows была подобна манипуляциям с файлами инициализации. Эта на



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: