IZONE- http://www.izcity.com/- бесплатный софт, вэб-сервисы, ресурсы для раскрутки, свежие номера журнала "Internet Zone".

Давид и Голиаф

Дмитрий Румянцев

Разработка приложений с помощью Delphi основывается на так называемой модели two-way programming (программирование двумя способами). Ни о чем подобном никогда не слыхали? А между тем все очень просто. Модель two-way предполагает, что вы можете скакать взад-вперед между инструментами визуального дизайна и стандартным редактированием кода, то бишь текста программы (вообще-то, это принцип работы всех визуальных сред кодирования/программирования начиная WYSIWYG-редакторами HTML-кода и заканчивая Visual Basic for Applications, входящего в стандартную поставку MS Office - прим. ред.).

Скажем, разместив на форме кнопку (компонент Button страницы Standard палитры компонентов), можно сразу же просмотреть файл (нажав Alt+F12), в котором в текстовом виде представлена эта самая форма (нажав снова Alt+F12, можно вернуться в режим визуального программирования). А можно вручную редактировать сгенерированный код на Object Pascal, не теряя живой связи со средой визуального программирования - проще говоря, имея возможность размещать компоненты на форме одним щелчком указательного пальца левой руки (звучит практически так же, как хлопок одной ладони - прим. ред.). И все же...

И все же общения с инспектором объектов (Object Inspector) вам никак не избежать, а посему давайте-ка быстренько проинспектируем этого надутого инспектора.

Начните новый проект (меню File > New Application). На странице Standard палитры компонентов выберите компонент Button (кнопка) и щелкните в любом месте формы, чтобы разместить на ней эту кнопку. Теперь посмотрите (но пока не трогайте) раскрывающийся список в инспекторе объектов. Увидели? Точно, в нем активен пункт "Button1: TButton". О чем нам говорит эта скромная запись? О том, что сейчас выбран компонент типа TButton (ткнопка, то есть, простите, кнопка), имеющий имя Button1. Delphi старается облегчить жизнь разработчика и сама дает имена размещаемым компонентам, однако разнообразием не балует, просто-напросто нумеруя все однотипные компоненты.

Например, если вы разместите на форме еще одну кнопку, то она получит название... Как вы догадались? Ну конечно, Button2. Вас это не устраивает? Вы хотели бы что-то более осмысленное, вроде CloseButton или ButtonAndMaslaKusok? Потерпите немного и вы будете вознаграждены за свою покладистость.

Итак, сейчас выбран компонент Button1 и, соответственно, все свойства, перечисленные на странице "Properties" инспектора объектов принадлежат компоненту Button1, ему одному и больше никому. А теперь щелкните по стрелке раскрывающегося списка, чтобы его раскрыть (а то зачем он называется раскрывающимся?) и выберите пункт "Form1: TForm" (пока в этом списке всего два пункта).

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

Пощелкайте немного то по кнопке, то по форме и полюбуйтесь, как меняется активный пункт в списке компонентов и содержимое страницы "Properties" инспектора объектов. (Только не переусердствуйте. Двойных щелчков не нужно. Что? Вы случайно щелкнули дважды и не знаете, где сейчас находитесь? Находитесь вы в редакторе кода и можете редактировать шаблон обработчика события OnClick. Но пока этого делать не нужно. Просто нажмите клавишу F12, чтобы вновь вернуться к форме.)

Сделайте активной кнопку (Button1). Щелкните по свойству Caption. Его значение пока так же равно Button1. Введите что-то более интересное, например, &Ok и нажмите Enter. Как видите, название кнопки изменилось. Однако в списке компонентов вы по прежнему видите "Button1: TButton". В чем дело? Дело в том, что свойство Caption отвечает за надпись, которая появляется на размещенном интерфейсном элементе. А за название компонента, который обеспечивает доступ к элементу, отвечает свойство Name. Найдите его в инспекторе. Видите, его значение по прежнему Button1. Погодите, не изменяйте его.

Описание формы
type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;

Щелкните по форме и нажмите F12, чтобы попасть в редактор кода. Переместите курсор в начало файла и найдите текст, приведенный во врезке "Описание формы". Так описывается наша форма на языке Object Pascal. После строки TForm1 = class(TForm) вы видите уже знакомое Button1: TButton;. Если бы на форме было размещено множество компонентов, они все были бы перечислены в этой секции. Но нас сейчас интересует не список элементов формы, а то, каким образом быстро и, что самое главное, безболезненно изменить название любого элемента.

Tеоретически, положившись на разрекламированную модель two-way, мы можем, не долго думая, взять и заменить в редакторе кода имя компонента Button1 на любой другой, более соответствующий нашему вкусу, скажем, на ButtonOk. Но делать этого категорически нельзя!

Запомните: имена компонентов можно менять только путем изменения значения свойства Name этого компонента в инспекторе объектов! Причем делать это желательно сразу же, как только компонент размещен на форме.

Нажмите F12. Щелкните один раз по кнопке, чтобы сделать ее активной, а затем по свойству Name в инспекторе объектов. Введите любое имя, например, ButtonOk и нажмите Enter. Теперь щелкните по форме и снова нажмите F12. И, о чудо, там, где до этого вы видели текст Button1: TButton; теперь стоит: ButtonOk: TButton; Delphi автоматически изменила программный текст, учтя ваши манипуляции, сделанные со свойством Name в инспекторе объектов!

Изменение свойств одним щелчком

Теперь познакомимся с тем, как можно быстро изменять свойства компонентов. Вернитесь снова к форме (клавиша F12) и сделайте активной размещенную кнопку (вообще-то она должна остаться активной, если вы не щелкали по форме). Над свойством Caption вы видите свойство Cancel. Пока не столь важно, для чего нужно это свойство - нас интересует, как изменить его значение. Сейчас в нем стоит загадочное False. Это свойство относится к группе свойств-переключателей и может находиться всего в двух состояниях: True (да) или False (нет).

Изменять значение свойств этого типа (он называется булевским - boolean) можно двойным щелчком. (Вообще говоря, булевские переменные и свойства принимают значения "истина" и "ложь", а не "да" и "нет" - прим. ред.) У кнопки в эту группу входят свойства: Cancel, Default, Enabled, ParentFont, ParentShowHint, ShowHint, TabStop и Visible. В дальнейшем мы поближе познакомимся с ними.

Теперь найдите свойство Cursor и щелкните по нему. Вы видите, что справа появилась кнопка со стрелкой, намекающая, что все возможные значения этого свойства перечислены в раскрывающемся списке. Щелкните по стрелке и вы в самом деле увидите список возможных значений, которое может принимать свойство. Свойство Cursor определяет, как будет выглядеть курсор мыши, когда он находится над данным элементом. Для кнопки наиболее логичным представляется курсор в виде руки с вытянутым указательным пальцем: crHandPoint. (Напоминаем: точка зрения автора может не совпадать с точкой зрения редакции - прим. ред.)

Теперь найдите свойство Font и щелкните (один раз) по нему. Вы видите, что перед названием свойства стоит знак плюс, а справа от значения появилась кнопка с тремя точками, которые обычно намекают на то, что выбор этого элемента должен привести к появлению на экране какого-то диалогового окна. Щелкните по этой кнопке и - вуаля - на экране появляется диалог для выбора шрифта текста данного элемента (в нашем примере - кнопки). По умолчанию задан шрифт MS Sans Serif, размером 8 пунктов (это называется кегль).

Можете выбрать любой другой -например, Windings красного цвета и 12-го кегля) и закройте окно с помощью кнопки Ok. Теперь на кнопке размещены какие-то иероглифы (вы же сами выбрали Windings), а вот цвет остался прежним. Как же так, неужели разработчики Delphi чего-то недоработали?

На самом деле виноваты разработчики Windows (хотя, пожалуй, скорее их надо за это поблагодарить). Дело в том, что цвет некоторых элементов управления программно изменить нельзя - Windows будет настаивать на том, чтобы были восстановлены цвета по умолчанию (и сама же их автоматом восстановит). Так что свойство Color можно изменить далеко не для всех компонентов.

А теперь щелкните по плюсу, стоящему перед именем свойства Font. Ого! Появилось еще шесть подсвойств: Charset, Color, Height, Name, Pitch, Size и Style, причем перед именем последнего также стоит плюс, что свидетельствует о том, что его, в свою очередь, также можно раскрыть для доступа к дополнительной группе. Это альтернативный способ установки шрифта: гарнитуры, размера, цвета, шага (pitch), стиля.

Итак, плюс перед названием свойства указывает на то, что мы имеем дело с групповым названием коллекции подсвойств. Например, для самой формы таковыми, помимо Font, являются: BorderIcons (задает системные кнопки, см. ниже), HorzScrollBar (определяет горизонтальную полосу прокрутки) и VertScrollBar (вертикальная полоса прокрутки).

Последним типом свойств являются свойства, значения которых нужно вводить с клавиатуры. Нам уже известно свойство Caption, определяющее текст, размещенный на элементе. Сюда же относятся Left, Top, Height и Width, определяющие местоположение и размер элемента (иногда вводить значение более удобно, чем изменять элемент при помощи мыши).

Очень интересно свойство Hint, которое устанавливает текст подсказки, появляющейся в тот момент, когда рука пользователя, двигающая мышь, на миг остановится, и курсор замрет над элементом управления. Правда, чтобы это и в самом деле произошло, мало ввести текстовое значение свойства Hint - нужно еще установить свойство ShowHint в True.

Вот, собственно, и все, что можно сказать об установки значений свойств. Некоторые свойства вы будете изменять постоянно, к некоторым не притронетесь никогда. Если вам захочется получить более подробную информацию о том или ином свойстве, просто щелкните по нему и нажмите клавишу F1. В появившейся справке вы получите самую исчерпывающую (по меркам разработчиков из корпорации Borland) информацию о назначении этого свойства.

Уф-ф-ф... Все-таки насколько проще все показывать, чем описывать. Но ничего не поделаешь - когда еще появятся мультимедийные номера Upgrade?

Выхода нет

Какое удовольствие иметь компьютер в своем полном монопольном владении. Другое дело, когда компьютер использует кто-то другой и вечно норовит внести какие-нибудь изменения в системные настройки. Не сталкивались с этой проблемой? Вам повезло. А вот мне пришлось однажды крепко поразмыслить над тем, как не дать перезагрузить систему без моего на то особого разрешения.

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

И теперь, покидая свое рабочее место, мне уже не нужно, как раньше, делать строгое предупреждение домочадцам: "Компьютер ни в коем случае не выключать!". С помощью Delphi написать эту маленькую (просто даже в микроскоп почти не разглядишь) программу такое простое дело, что только одно удовольствие. Итак, приступим.

1. Начните новый проект.

2. Сразу же и сохраните его, изменив названия сохраняемых модулей следующим образом: вместо Unit1.pas - MainForm.pas, а вместо Project1.dpr - NoExit.dpr. Сохранили? Отлично!

3. Теперь выберите пункт "Option..." из меню "Project" (кстати, если название пункта оканчивается многоточием, то это означает, что выбор пункта приведет к открытию какого-нибудь диалогового окна - приучайтесь к хорошему стилю оформления).

4. В появившемся окне "Project Options" (авторы, которые не любят утруждать собственную голову поиском подходящего слова, вместо перевода слова Options обычно ставят незатейливую транскрипцию - "опции", но нам-то не лень заглянуть в словарь, а потому мы будем говорить о параметрах проекта) щелкните на закладке "Directories/Conditionals" (Каталоги/Условия).

5. В строке "Output directory" что-то записано (какой-нибудь замысловатый путь), очистите ее и нажмите "Ok". Тем самым вы добились того, что выполняемый файл (exe-файл) Delphi при компиляции будет помещать в тот же каталог, в котором хранятся и исходные тексты проекта (программы).

6. Для главной формы (а другой пока что у вас, собственно, и нету) установите следующие свойства:
Свойство Значение
BorderIcons.biMaximize False
BorderStyle BsSingle
Caption Блокиратор
Position poScreenCenter
WindowState wsMinimized

Групповое свойство BorderIcons отвечает за системные кнопки в заголовке окна. Установив подсвойство biMaximize в False, вы отключили кнопку максимизации (а заодно и соответствующий пункт системного меню). Свойство BorderStyle отвечает за тип рамки окна. Заголовок окна, как вы помните, задается через свойство Caption. Чтобы окно появлялось строго по центру экрана, свойство Position получило значение poScreenCenter.

Наконец, поскольку разрабатываемая программа нужна лишь для того, чтобы запретить выход из Windows, ее окно вовсе не обязательно должно торчать на экране весь сеанс работы, а потому в момент старта его лучше убрать на Панель задач, что и будет сделано системой, поскольку свойство WindowState установлено в wsMinimized.

7. Идем дальше. На вкладке "Standard" палитры компонентов щелкните компонент Edit (строка редактирования), а затем в то место на форме, где, по вашему мнению, эта строка должна быть размещена.

Строка размещена, но в ней стоит совершенно ненужный текст Edit1. Спокойствие, Delphi немного перестаралась и поместила его по собственному почину (она эта делает всегда для всех компонентов редактирования текстовой информации), но убрать этот текст очень легко (чуть дальше мы увидим, как).

8. На этой вкладке щелкните по компоненту Button (кнопка) и разместите его на форме.

9. Выберите компонент Edit1 (щелкните один раз по нему на форме) и очистите его свойство Text, убрав бессмысленный текст Edit1 из строки. В качестве значения свойства PasswordChar я бы посоветовал выбрать "звездочку" (ведь обычно именно этим символом забиваются символы при вводе пароля).

По умолчанию значение этого свойства равно #0, что приводит к тому, что вводимый в строке текст отображается обычным порядком, но нам нужна строка для ввода пароля! (- Пароля? Какого пароля? - Как какого пароля? Ведь должны же вы будете иметь возможность закрыть эту программу, когда сами захотите выключить или перезагрузить компьютер! А как программа отличит вас от других пользователей, если вы не введете заветное слово? Вот то-то...)

10. Теперь установим некоторые свойства кнопки (предварительно сделав ее активной простым щелчком)
Свойство Значение
Caption &Закрыть
Cursor crHandPoint
Default True
Enabled False

Свойство Cursor обеспечит изменение курсора мыши, когда он будет находиться над кнопкой. Чтобы сделать кнопку "умолчальной" (в любой момент реагирующую на нажатие клавиши Enter), свойство Default установлено в True. Поскольку разрешать использовать эту кнопку следует лишь в том случае, если в строку редактирования (Edit1) введен верный пароль, то первоначально ее следует сделать недоступной, что и обеспечивается свойством Enabled, когда его значение становится равным False.

А теперь перейдем к тому, ради чего, собственно, мы и взялись за увлекательный процесс создания очень маленькой, но очень самоуверенной программы.

11. Сделайте активной форму (щелкните по ней), после чего щелкните по закладке Events (события) инспектора объектов. Дважды щелкните по событию OnCloseQuery (если кому интересно узнать, почему выбрано именно это событие и что, собственно, мы сейчас делаем, - см. врезку "Сколько событий!"). Услужливая Delphi тотчас же создала шаблон обработчика этого события. Между парой begin и end введите следующий текст - CanClose := false;.

А теперь измените размер формы и расположение строки и кнопки, сохраните проект на диск (см. пункт 2) и слегка призадумайтесь о бренности всего сущего и о том, что иной раз булыжник, метко пущенный из пращи юным, пороху не нюхавшим Давидом, может надолго вывести из строя сверх меры накачанного бодибилдера Голиафа (который, может, книжек и не читал, больше занимаясь боксом и другими гимнастическими упражнениями на свежем воздухе).

Мда-а-а... Вот она - жизнь! Сколько чудо-программистов корпорации Microsoft трудилось без устали, ночами не спало, тратило тысячи человеко-часов на создание такого обер-супер-пупер-гиганта, победившего в тяжелейшей неравной борьбе IBM, Apple и без счета всякую мелкую мелюзгу вроде Netscape и тому подобных, а мы - р-р-раз... и вся хваленая мощь Windows оказывается просто беззащитной перед одной строкой текста на Object Pascal, помещенной в обработчик события OnCloseQuery.

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

12. Запустите программу (вы найдете ее на Панели задач в свернутом состоянии, но развернете одним щелчком) и попытайтесь завершить ее работу любым способом. Не получается? То-то! Хотя в целом окно этой программы (обратите внимание, что кнопка максимизации недоступна - см. пункт 6) ничем не отличается от любого другого: в строку можно даже ввести какой-нибудь текст (который появляется в виде звездочек). Кнопка "Закрыть", правда, пока также недоступна. Как же закончить работу этой программы?

13. Вернитесь к Delphi (вы ведь не думаете, что запущенная программа NoExit отключила возможность переключения между выполняющимися программами?) и нажмите клавиши Ctrl+F2. Это специальное сочетание, которая зарезервирована в Delphi специально для того, чтобы аварийно приземлять чересчур зарвавшиеся программы.

14. Перейдите в редактор кода (F2) и найдите описание формы в начале модуля. В секции private вместо строки комментария 
{ Private declarations } введите следующую строку - Password : string;.

Тем самым вы создали внутреннюю переменную, в которой будет храниться эталонный пароль, с которым программа будет сравнивать ту абракадабру, которую злоумышленник (или вы сами) будет вводить в строку ввода.

А откуда программа будет брать этот самый эталонный пароль? Это хороший вопрос, как говаривал Михаил Сергеевич Горбачев. Я предлагаю брать этот самый эталонный пароль из какого-нибудь системного файла самой Windows, например из win.ini. Возражений нет? Ну и хорошо.

15. Переместитесь на самый верх модуля. Найдите секцию uses, в которой через запятую перечислены все библиотечные модули, которые использует Delphi для данного проекта. Последним указан модуль Dialogs, после которого стоит точка запятой. После имени поставьте запятую и введите: IniFiles - имя модуля, который нам понадобится для обеспечения быстрого доступа к содержимому ini-файлов (точка с запятой по-прежнему должна завершать весь список).

16. Нажмите F2 , сделайте активной форму и на странице Events инспектора объектов дважды щелкните на событии OnCreate, которое происходит в момент создания окна. Обработчик этого события удобно использовать для инициализации (заполнение начальными значениями) вспомогательных переменных. Пару begin - end замените текстом, приведенным во врезке "Код программы".

Код программы
var
IniFile: TIniFile;
begin
try
IniFile := TIniFile.Create ( 'win.ini' );
Password := IniFile.ReadString ( 'colors', 'ButtonShadow', '04071965' );
finally
IniFile.Free;
end;
end;

В секции объявления переменных (var) объявляется переменная IniFile типа TIniFile - класс для доступа к данным в ini-файлах. В теле обработчика сначала создается объект этого класса путем вызова конструктора Create, ему в качестве параметра передается имя ini-файла, с которым будет производиться работа. Затем в переменную Password загружается некоторое значения с помощью метода ReadString. Метод ReadString имеет три параметра: имя секции в ini-файле; имя строки; значение по умолчанию, которое будет загружено в переменную, если указанная строка не будет найдена в данном ini-файле. По завершении объект TIniFile уничтожается.
Для обеспечения надежности использована конструкция try ... finally ... end. Секция finally ... end будет выполнена в любом случае - даже в случае аварийного завершения программы.

Для пароля лично я выбрал строку ButtonShadow из секции [colors] файла win.ini. В этой строке содержится информация о цвете тени кнопки стандартной панели Windows. Вы можете выбрать любую другую строку любого другого ini-файла (для удобства воспользуйтесь маленькой программой, создание которой описывалось в предыдущей серии - см. Upgrade #54).

17. Перейдите снова к форме (клавиша F2), выберите кнопку и дважды щелкните по ней. Delphi создала обработчик события OnClick, происходящего в тот момент, когда пользователь нажимает на кнопку. В шаблоне обработчика этого события введите короткую строку - Close;.

Эта строка обеспечит закрытие окна (завершение работы программы), когда пользователь нажмет на кнопку. Но ведь первоначально кнопка недоступна! Правильно, поэтому нам остается только написать небольшой обработчик события, происходящего при изменении содержимого строки ввода Edit1.

18. Вновь перейдите к форме, выберите строку ввода и на странице Events (события) инспектора объектов дважды щелкните на свойстве OnChange. Введите следующий текст в шаблоне обработчика - Button1.Enabled := 
( Sender AS TEdit ).Text = Password;.
Стандартный обработчик событий в Delphi всегда имеет хотя бы один параметр Sender, класса TObject - предка всех классов в Object Pascal.

Sender позволяет связывать событие с тем элементом, который его вызвал. Поскольку в данном случае речь идет о строке редактирования, то используется конструкция Sender AS TEdit, которую Delphi интерпретирует как "Объект Sender, который имеет тип TEdit" и позволит работать с этим объектом, как со строкой.

Вводимый в строке редактирования текст хранится в свойстве Text (кто бы мог подумать!). Сравнивая значение этого свойства со значением переменной Password (если вы не забыли, в ней хранится эталонный пароль), программа решает сложную дилемму: отпускать ли кнопку (Button1) на свободу (т. е. установить значение его свойства Enabled равным True) или пока подождать.

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

19. Перейдите к шаблону формы (F2), сделайте активной саму форму (щелкните по ней) и перейдите к обработчику события OnCloseQuery (дважды щелкнув по соответствующей строке на странице События (Events) инспектора объектов). Сейчас там стоит CanClose := False;. Но ведь программу нужно завершить, если введен верный пароль, поэтому измените эту строку на следующую - CanClose := Edit1.Text = Password;.

20. Сохраните проект на диске. Откомпилируйте его (комбинация клавиш Ctrl+F9). 

Сколько событий!
Центральный процессор (камень, кремень, кристалл и как там его еще?) обрабатывает сотни миллионов, а то и миллиардов операций в секунду. Элементарная операция - это инструкция, указывающая процессору, что нужно сделать в следующую долю секунды (например, считать число из памяти, переслать число в память, сложить, вычесть и т. д.).

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

Чуть позже был изобретен ассемблер, и те же самые машинные коды стали записывать в мнемоническом, то есть легком для запоминания виде - в виде команд (MOV, ADD, SUB и т. д.), но программы по-прежнему разрабатывать было очень и очень непросто. Еще чуть позже появились так называемые языки высокого уровня, каждый оператор которых мог при компиляции (переводе с языка высокого уровня) порождать десятки, а то и сотни машинных команд. Но и эти программы - точно так же, как и самые первые - выполнялись линейно, команда за командой - сначала выполнялась первая команда, потом вторая, потом третья и т. д.

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

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

Например, щелкнул пользователь машинально левой кнопкой мыши, а для Windows - это уже целое событие, которое порождает сообщение о нажатии левой кнопки мыши. (В хит-параде Windows - это одно из самых популярных сообщений wm_LButtonDown, которое вместе с сообщением о перемещении мыши wm_MouseMove из месяца в месяц, из года в год возглавляет все национальные чарты.) Ядро получает это сообщение и определяет, какой именно из запущенных в данный момент программ это сообщение предназначается. Определив, ядро посылает сообщение программе.

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

(Представляете, что делается с ядром Windows, когда запущена чудо-программа "Меч империи II" (или аналогичная стратегия), где главнокомандующий практически ничем иным не занимается, как только щелканьем левой кнопкой мыши с частотой, приближающийся к частоте работы самого процессора?)

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

Событие OnCloseQuery возникает в тот момент, когда программа собирается завершить свою работу. Для этого в обработчик события передается логический параметр CanClose. Если в теле обработчика этот параметр становится равным True, то все в порядке - программа завершит свою работу. Но если этот параметр примет значение False, программа свою работу не завершит.

Уф-ф! Это все!
Итак, вы создали самую настоящую маленькую программу, которая не побоится вступить в единоборство c Оконным Голиафом и, что немаловажно, выйти победителем из схватки. Создайте пункт в группе "Автозагрузка" главного меню Windows, связав его с программой noexit.exe (или вы дали другое название?), чтобы обеспечить ее автоматическую загрузку в момент старта системы. Этот файл вы найдете в том же каталоге, в котором хранятся исходные файлы проекта (см. п. 5).

Источник: http://www.computery.ru/upgrade/

 


Copyright © "Internet Zone", http://www.izcity.com/, info@izcity.com