    Последние штрихи 

    13 ГЛАВА 

    Итак, создание приложения RENTMAN в основном закончено. Оно вполне 
работоспособно, хотя, честно говоря, выглядит несколько скучновато. Что ж, 
теперь можно заняться наведением лоска и придать приложению солидный, 
внушительный вид. 
    Рецензирование завершенного приложения часто недооценивается на фоне 
других составных частей этапа разработки. Не будет большой ошибкой сказать, 
что рецензирование — одна из ключевых стадий этого этапа. Важность ее состоит 
в том, что именно при рецензировании вы впервые перестаете смотреть на систему 
как разработчик и начинаете воспринимать ее с точки зрения пользователя. Это 
помогает выявить общие проблемы, связанные с удобством применения приложения, 
которые могут быть важными для его потенциальных пользователей. Программисты, 
опробующие чужие приложения, часто бывают самыми привередливыми 
пользователями. Поэтому, если ваше приложение переживет рецензирование, 
выполненное вашими коллегами, то считайте, что восторг пользователей уже у вас 
в кармане. 
    Рецензирование важно также по той причине, что в его процесс вы получаете 
шанс придать приложению необходимый лоск. Когда все самые необходимые части 
приложения собраны в единое целое, можно немного отвлечься и добавить 
что-нибудь, оживляющее систему и делающее работу с ней не только удобной и 
интересной, но подчас и забавной. Это не только даст вам лишний повод 
гордиться хорошо выполненной работой, но и сделает процесс разработки 
программного обеспечения более веселым и увлекательным занятием. 
    Возвращаясь к системе RENTMAN, определим все то, что нужно сделать для 
придания ей завершенного вида стандартного приложения Windows. 
    Q Создать логотип приложения. 
    О Изменить заголовок и системную пиктограмму. 
    Q Создать справочную систему, в том числе и контекстно-зависимые разделы. 
    Q Добавить всплывающие подсказки. 
    О Включить панель состояния. 
    Q Создать и подключить диалоговое окно About. 
    D Добавить кнопку печати формы. 
    Q Добавить окна сообщений, появляющиеся при печати отчетов. 
    После внесения всех этих изменений, мы сравним завершенное приложение со 
спецификациями, сформулированными в предыдущих главах. Затем вы протестируете 
приложение на предмет соответствия его назначению, а также стабильности и 
удобства в работе. 

    Создание логотипа приложения 

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


    Глава 13. Последние штрихи 275 

Рис. 13.1. С помощью средства Image Editor Delphi можно создавать привлекательные изображения

Рис. 13.2. Помещение растрового изображения на форму улучшает внешний вид приложения


    276 Часть II. Учебный курс

    Однако прежде чем поместить картинку на форму, нужно сначала иметь эту 
картинку. Можно использовать какое-нибудь готовое изображение, поставляемое 
вместе с Delphi, Windows или любой другой системой. Альтернативный метод 
состоит в использовании средства Image Editor Delphi. Для того чтобы запустить 
Image Editor, нужно воспользоваться меню Tools Delphi или найти эту программу 
в папке, где находится сама система Delphi. На рис. 13.1 показано окно Image 
Editor с одним из всемирно известных рисунков автора. 
    Откройте проект RENTMAN, если вы еще не сделали этого, а затем откройте в 
окне конструктора форм главную форму fmRSYSMANO. Щелкните на панели paMiddle и 
поместите на нее компонент Image. Назовите объект изображения imSplash, а его 
свойство Alignment установите равным alClient. Щелкните дважды на свойстве 
picture, а затем щелкните на кнопке Load открывшегося диалогового окна. В окне 
Load picture выберите файл растрового изображения и щелкните на кнопке Open. 
Вернувшись в окно Picture editor, щелкните на кнопке ОК. 
    Если выбранное вами растровое изображение должно отображаться на форме с 
изменяемыми размерами (главная форма приложения RENTMAN относится к формам 
именно такого вида), нужно удостовериться, что размер изображения 
соответствует размеру максимизированной формы. Если компонент изображения 
находится на панели, как в нашем случае, то достаточно просто максимизировать 
форму, а потом посмотреть на значения свойств панели Height и Width в окне 
Object Inspector. Если в этом есть необходимость, то можно создать 
изображение, размеры которого точно соответствуют необходимым размерам. 
    Другой подход заключается в масштабировании растрового Изображения до 
необходимых размеров. Однако я не рекомендую использовать этот метод. Обычно 
это приводит к появлению на изображении зернистости или сильному его 
искажению. Для того чтобы изображение масштабировалось в соответствии с 
размерами выделенной для него области, установите его свойство Stretch в True. 
    Обратите внимание, что установка в True значения свойства Stretch 
компонента Image не приводит к пропорциональному изменению размеров 
изображения при уменьшении размеров формы. Это свойство можно использовать для 
обрезки растровых изображений. Поэтому самое главное, чтобы изображение 
выглядело хорошо при максимизированной форме. В случае формы fmRSYSMANO 
максимальный размер формы соответствует размеру растрового изображения. 
    Создав растровое изображение нужного размера и поместив его на форму, 
сохраните проект и запустите его на выполнение. На рис. 13.2 показано, как 
выглядит главная форма с размещенным на нем растровым изображением во время 
работы приложения. 


    Изменение заголовка и системной пиктограммы приложения 

    Создав логотип приложения RENTMAN, можно изменить и его системную 
пиктограмму, чтобы она соответствовала логотипу, а также заголовок приложения. 
По умолчанию Delphi назначает всем создаваемым приложениям одинаковую 
стандартную системную пиктограмму Delphi. Если вы создали несколько 
приложений, то на это можно посмотреть сквозь пальцы. Но с увеличением 
количества разработанных вами приложений одинаковые пиктограммы будут сбивать 
вас с толку. Системная пиктограмма должна давать возможность с одного взгляда 
отличать приложения. Поэтому нужно знать, как заменить системную пиктограмму, 
о чем мы сейчас и поговорим. 
    Начать снова нужно с подбора или создания соответствующего растрового 
изображения. В комплект поставки Windows, так же как и Delphi, входит немало 
файлов пиктограмм с такими изображениями. Если стандартные пиктограммы вас не 
устраивают, можете воспользоваться средством Image Editor и создать 
собственную. На рис. 13.3 показан еще один вклад автора в мировую сокровищницу 
изобразительного искусства. 
    Нарисовав или подобрав пиктограмму, подключите ее к приложению. Для этого 
щелкните на команде Project^Options, а затем в открывшемся окне — на вкладке 
Application. В строке Title введите название RENTMAN System, после чего 
щелкните на кнопке Load Icon и укажите файл, содержащий новую системную 
пиктограмму (рис. 13.4). 
    Имя, которое вы указали в строке Title, будет использоваться для 
отображения на кнопке панели задач Windows. Пиктограмма же, которая с этого 
момента стала системной пиктограммой приложения, будет применяться Windows 
всегда, когда системе нужно будет указать на связь того или иного объекта с 
вашим приложением. Несмотря на то, что изначально пиктограмма хранилась в 
отдельном файле, после компиляции приложения растровое изображение будет 
встроено в выполняемый файл. Таким образом, назначенная вами системная 
пиктограмма не изменится даже после установки готового приложения на 
компьютерах пользователей. 


    Глава 13. Последние штрихи 277 

    Рис. 13.3. С помощью средства Image Editor Delphi можно рисовать 
пиктограммы, которые будут использоваться в приложении 

    Рис. 13.4. С помощью диалогового окна Project Options можно связать 
пиктограмму с приложением 

    Создание справочной системы 

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

    Утилиты для создания файла справки 

    Прежде всего я хотел бы отметить, что существует немало по-настоящему 
хороших утилит создания файлов справки Windows. Из всего разнообразия могу 
выделить две — ForeHelp и RoboHelp. Если вы всерьез намереваетесь заняться 
разработкой файлов справочной системы, то настоятельно рекомендую ознакомиться 
с этими утилитами — они избавят вас от многих часов тяжелого и кропотливого 
труда. Однако поскольку я не могу рассчитывать на то, что эти утилиты у вас 
под рукой, я расскажу о создании справочной системы для Windows стандартным 
способом, который, честно говоря, уже сильно устарел. 


    278 Часть II. Учебный курс 

    Основные принципы создания файлов справки 

    Для того чтобы создавать файлы справочной системы для Windows, нужно 
хорошо понимать их структуру и назначение. Каждый файл справки создается из 
трех физических файлов: файла проекта справки (HPJ), файла содержания справки 
(CNT) и файла форматированного текста (RTF), который и содержит собственно 
текст справочной системы. Файлы типа HPJ и CNT — это обычные текстовые файлы. 
Файлы типа RTF — это файлы в формате Rich-Text Format, поддерживаемом 
большинством современных текстовых процессоров, включая Microsoft Word. При 
создании файла справки эти три файла (а, при необходимости также, другие 
файлы), соединяются в один файл, генерируемый с помощью компилятора файлов 
справки Windows. 

    На заметку 

    Стандартная утилита Windows WordPad, также поддерживает формат RTF, однако 
не в состоянии использовать все многообразие средств форматирования, которые 
могут понадобиться при создании файлов справки Windows. Поскольку в ней нет 
даже таких возможностей, как создание сносок или сокрытие текста, утилиту 
WordPad нельзя назвать хорошим выбором в качестве редактора текста справки. 
Так как компонент Delphi TRichEdit использует те же самые внутренние средства 
Windows, что и утилита WordPad, то все вышесказанное распространяется и на него. 

    Каждый из вышеуказанных файлов содержит специальные инструкции, которые 
определяют вид и поведение генерируемых справочных систем. До появления 
Windows 95 приходилось редактировать файлы проекта и содержания справки 
вручную, если в вашем распоряжении не было какой-либо утилиты создания справки 
независимых производителей. Начиная с Windows 95, Microsoft улучшила поддержку 
средств работы с файлами справки. Созданная для этих целей утилита Microsoft 
Help Workshop входит в комплект поставки Delphi. 
    Однако до создания файлов проекта и содержания справки еще далеко — 
сначала нужно написать собственно текст справочной системы. Этот текст пишется 
в свободном формате с использованием специальных символов и других атрибутов 
форматирования, которые определяют темы справки и связи между ними. 
    Текст разделяется на разделы, каждый раздел помещается на отдельной 
странице. В каждом разделе используются специальные символы, обозначающие 
тему, номер раздела, последовательность его просмотра, а также ключевые слова. 
С помощью специальных атрибутов определяются связи между разными разделами. В 
табл. 13.1 приведено описание таких специальных символов и атрибутов. 

    Таблица 13.1. Специальные символы и атрибуты, используемые для 
форматирования раздела справки Windows 

    Символ или атрибут 	Назначение 

    	#		Обозначает идентификатор раздела, используемый для ссылок на него 
    	$ 		Определяет тему раздела 
    	K 		Определяет ключевое слово или набор ключевых слов 
    	+		Определяет порядок следования раздела при просмотре справки 
    	А 		Определяет ключевое слово для ссылки 
    	! 		Определяет макрокоманду 
    	* 		Определяет дескриптор для условного включения или исключения отдельных разделов 
    	> 		Определяет тип окна 
    	@ 		Указывает на начало комментария в разделе 
    Двойное подчеркивание 	Указывает на ссылку на другой раздел 
    Скрытый текст            	Указывает идентификатор раздела, на который можно перейти из данного раздела 

    Из всех этих символов и атрибутов обязательным является только первый, 
обозначающий идентификатор раздела (его называют также контекстной строкой). 
На практике чаще всего используются первые четыре (#, $, К и +). 


    Глава 13. Последние штрихи 279 

    Создание текста справки 

    Ознакомившись со всеми этими символами, давайте попробуем использовать их 
в работе. Создайте новый файл с помощью какого-нибудь текстового процессора 
для Windows. Можно использовать любой текстовый процессор, который 
поддерживает формат RTF, сноски, двойное подчеркивание и скрытый текст Чаще 
всего для этих целей используется Microsoft Word, хотя можно, как я уже 
сказал, применить и любой другой текстовый процессор, соответствующий 
приведенным выше требованиям. 
    Давайте создадим три раздела справочной системы приложения RENTMAN, а 
также содержание, а потом установим связи между этими разделами и определим 
ключевые слова по каждому из них
    Для начала введите следующий текст, предназначенный для описания пункта 
меню Log a call. 

    Log a call 
    Select this option to enter a maintenance call. You'll be asked to specify 
the property that the call concerns. 

    Создание контекстной строки 

    Установите курсор перед словом Log и вставьте символ сноски #. Эти вы 
обозначите идентификатор или контекстную строку, раздела справки. В качестве 
текста сноски введите LogCall. Другие разделы справки при ссылке на данный 
раздел будут использовать эту контекстную строку. Этот же идентификатор 
используется в системе Help Workshop — ему назначается константа, с помощью 
которой приложение может открыть тот или иной раздел справки. 

    Создание темы 

    Снова поместите курсор перед словом Log и вставьте еще одну сноску, но на 
этот раз укажите $ в качестве символа сноски. Такая сноска будет впоследствии 
преобразована в тему справки. Введите в качестве названия Log a call. Система 
Windows поддерживает поиск разделов по их темам, поэтому определение темы даст 
пользователям вашей справочной системы дополнительные возможности. Тема, 
которую вы только что ввели, будет отражаться в списке ранее использовавшихся 
тем программы WinHelp, в списке диалогового окна поиска и т.д. Обычно тема 
соответствует тексту, указанному в первой строке раздела справки. 
Отформатируйте первую строку раздела, как это вы делаете с заголовками в 
обычных докумен тах — используйте шрифт более крупного размера, выделите его 
название полужирным шрифтом и т.д. 

    Создание ключевых слов 

    Теперь, создав контекстную строку и тему раздела, давайте определим 
ключевые слова этого раздела. Вставьте еще одну сноску перед словом Log, 
использовав символ К, и введите в качестве текста сноски следующую строку: Log 
a Call; Calls, logging; Calls, entering; Calls, adding. Все эти выражения 
будут преобразованы в ключевые слова предметного указателя справки, с помощью 
которых пользователи смогут найти интересующие их разделы. 
    Вставьте символ разрыва страницы после текста раздела. Каждый раздел 
справки должен заканчиваться разрывом страницы (в Microsoft Word для вставки 
разрыва страницы нужно нажать <Ctrl+Enter>). На рис. 13.5 показан вид 
завершенного раздела. Обратите внимание на то, что я удалил лишние строки, 
которые Word вставляет после каждой сноски. Это объясняется тем, что такие 
строки мешают работе компилятора файлов справки. Поскольку в их использовании 
нет никакой необходимости, я рекомендую вам поступать так же. 
    Теперь можно создать следующий раздел, property, который будет 
использоваться в качестве справи для меню Tables. 
    Введите следующий текст раздела property: 

    Property 
    Select this option to enter or update property records. If you are needing 
to log a maintenance call, see the Log Calls help topic. 

    Создайте сноски для контекстной строки, темы и ключевых слов раздела. При 
вводе ключевых ело) используйте тот же принцип, что и для раздела LogCall. Не 
забудьте применить такой же стиль формата рования к заголовку раздела 
Property, как для раздела LogCall. 

    Создание связи между двумя разделами 

    Теперь у нас есть все, чтобы связать два только что созданных раздела. 
Установите курсор справа (без  пробела) от слов Log Calls в тексте раздела Property. 
Введите LogCall, затем выделите это слово с по мощью мыши и сделайте текст 
скрытым с помощью установки атрибута Hidden в True (флажок Hidden (Скрытый) 
диалогового окна Font (Шрифт) в Word 7.0). Затем выделите строку Log Calls и 
установите ат-


    280 Часть II. Учебный курс 

    рибут двойного подчеркивания (в Word 7.0 — снова с помощью диалогового 
окна Font). После выполнения этих операций строка Log Calls станет ссылкой на 
другой раздел справки (вы не раз видели такие ссылки в справочной системе 
Windows, выделяемые по умолчанию линиями подчеркивания зеленого цвета). Когда 
пользователь щелкнет на этой ссылке, откроется раздел LogCall. 

    Рис. 13.5. Завершенный раздел справки LogCall 


    На заметку 
    Ссылки не всегда идентифицируются зелеными линиями подчеркивания. 
Разработчик может отключить, как цвет, так и сам эффект подчеркивания. Для 
того чтобы увидеть все ссылки в текущем разделе справки, нажмите и удерживайте 
<Ctrl+Tab>. Все ссылки буду показаны в инверсном изображении. 

    Вставьте разрыв страницы после созданного раздела. Не забывайте, что все 
разделы должны заканчиваться разрывом страницы. На рис. 13.6 показан 
завершенный раздел Property. 
    Осталось определить раздел Work Order Print, который будет использоваться 
в меню Reports. Введите следующий текст раздела: 

    Work Order Print 

    This option allows you to select and print a work order. A work order 
lists the work to be done on a rental property due to a call from a tenant. 
See the Property and Log Calls topics for more information. 
    Создайте все необходимые атрибуты раздела, как это вы делали для двух 
предыдущих разделов. 
    Теперь можно установить связи между тремя разделами. Сначала создадим 
всплывающую справку для ссылки на раздел Property. На экране ссылка на другой 
раздел отличается от ссылки на всплывающую справку только тем, что во втором 
случае используется не двойное, а одинарное подчеркивание. 
    Установите курсор справа (без пробелов) от слова Property. Введите еще 
одно слово Property, затем выделите его с помощью мыши и сделайте это слово 
скрытым, как в предыдущем примере. Выделите первое слово Property и примените 
к нему эффект подчеркивания (<Ctrl+U> в Microsoft Word). 
    Теперь установите курсор справа от слов Log Calls. Введите слово LogCall, 
выделите его, а затем также сделайте скрытым. Наконец, выделите слова Log 
Calls и примените к ним эффект подчеркивания. На рис. 13.7 показан вид 
завершенного раздела. 
    Теперь нам осталось создать раздел содержания справки. 

    Глава 13. Последние штрихи 281 

Рис. 13.6. Завершенный раздел Property

Рис. 13.7. Законченный раздел справки I/fork Order Print

282 Часть II. Учебный курс


    Раздел содержания 

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

    RENTMAN System Contents 
    Log a call 
    Add or update property 
    Print work orders 

    После этого создайте сноски трех основных типов, используя в качестве темы 
раздела слово Contents. 
    После создания сносок нужно настроить ссылки на другие темы. Установите 
курсор справа от строки Log a call и введите LogCall. Выделите слово LogCall и 
скройте его, как вы это делали в предыдущих примерах. Затем выделите слова Log 
a call и присвойте им атрибут двойного подчеркивания. 
    Затем поместите курсор справа от слов Add or update property и введите 
слово Property. Выделите введенное слово и сделайте его скрытым, а затем 
выделите слова Add or update property и присвойте им атрибут двойного 
подчеркивания. Повторите эти же действия для слов Print work orders, указав в 
качестве названия темы ссылки слово WorkOrderPrint. 

    На рис. 13.8 показан исходный текст законченного раздела Contents. 
    
    Рис. 13.8. Законченный исходный текст раздела содержания 

    Однако прежде чем перейти к созданию файлов проекта и содержания справки, 
нужно задать порядок просмотра разделов. Просмотр выполняется с помощью кнопок 
просмотра программы WinHelp, что указывается при использовании утилиты Help 
Workshop. Хотя можно определить сколь угодно много последовательностей 
просмотра, мы остановимся на самом простом случае и определим только одну. 
    Установите курсор слева от заголовка раздела Contents и вставьте символ 
сноски +. В качестве текста сноски введите auto. Повторите эти действия для 
всех остальных разделов. Данное ключевое слово говорит компилятору о том, что 
соответствующему разделу нужно присвоить очередной номер из последовательности 
номеров порядка просмотра. Номер можно указать явно, однако использование 
слова auto является более универсальным и гибким методом, так как в этом 
случае при вставке дополнительных разделов не нужно проводить перенумерацию 
ранее созданных. 


    Глава 13. Последние штрихи 283 

    На этом создание исходного текста файла справки закончено. Сохранив файл в 
формате Rich Text Format в каталоге RENTMAN под именем rentman.rtf, можете 
перейти к созданию файлов проекта и содержания справки. 

    Создание файла содержания 

    До появления Windows 95 разработчикам приходилось вручную создавать файлы 
содержания справочной системы, если только в их распоряжении не было 
каких-нибудь утилит независимых производителей. Затем файл содержания и файл 
проекта объединялись с соответствующим файлом формата RTF с помощью 
компилятора файла справочной системы, разработанного компанией Microsoft для DOS. 
    После выхода Windows 95 компания Microsoft выпустила графический редактор 
Microsoft Help Workshop, с помощью которого можно создавать файлы обоих 
вышеуказанных типов. С помощью этой программы можно выполнить компиляцию и 
тестирование файла справочной системы. Программа Microsoft Help Workshop 
включена в поставку Delphi, ее можно найти в каталоге prograr. 
Files\Borlanr4\nelphi 3\Help\Tools. Выполняемый файл программы называется 
HCW.EXE. Найдите эту программу на своем компьютере и запустите ее. 

    Команда Help Author 

    Первое, что я вам рекомендую сделать, — включить режим Help Author с 
помощью соответствующей команды из меню File. В этом режиме вы сможете 
получить дополнительную информацию о создаваемом файле справки (например, 
номер каждого раздела). Кроме того, в этом режиме можно перемещаться по 
разделам, независимо от того, используете ли вы кнопки просмотра, с помощью 
нажатия <Ctrl+Shift+<-> и <Ctrl+Shift+—>>. Для перемещения на первый и 
последний разделы нужно использовать, соответственно, комбинации 
<Ctrl+Shift+Home> и <Ctrl+Shift+End>. 
    Выберите команду File^New, а затем дважды щелкните на элементе Help Contents. 
    В строке Default filename появившегося окна введите имя файла . 
\rentman.hlp. В строке Default title введите имя системы — RENTMAN System. 
Щелкните на кнопке Add Above и введите в строке Title открывшегося окна 
RENTMAN System Contents, а в строке Topic ID — название темы Contents. 
Щелкните на кнопке ОК, чтобы сохранить введенные данные и закрыть окно. 
    Щелкните на кнопке Add Below и в появившемся окне Edit Contents Tab Entry 
введите Log a call. Повторите те же действия для всех остальных разделов справки. 
    Добавив в список все разделы, сохраните файл содержания в каталоге RENTMAN 
с именем rentman. cnt. В листинге 13.) приведен пример такого файла в 
текстовом виде. 

    Листинг 13.1. Текстовый файл содержания, сгенерированный программой Help Workshop 

    :Base .\rentman.hip 
    :Title RENTMAN System 
    1 RENTMAN System Contents=Contents 
    1 Log a call=LogCall 
    1 Property=Property 
    1 Print a work order=WorkOrderPrint 


    Создание файла проекта 

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

    На заметку 
    Хотя, как я уже сказал, файлы содержания и проекта являются текстовыми 
файлами, которые можно отредактировать с помощью любого текстового редактора, 
я рекомендую вам не делать этого, а использовать для их создания и модификации 
Help Workshop. Это вызвано тем, что несоблюдение правил оформления исходного 
текста этих файлов может привести к неправильной работе Help Workshop при 
компиляции файла справки. Программа Help Workshop предупреждает вас о 
возможности такой ситуации, поэтому я присоединяюсь к этому предупреждению. 

    284 Часть II. Учебный курс 

    Выберите команду File^New и щелкните дважды на элементе Help Project. 
Первое, что программа Help Workshop попросит вас указать, это имя файла 
проекта. Перейдите в каталог системы RENTMAN и введите имя rentman, а затем 
щелкните на кнопке Save. Расширение HPJ к имени файла будет добавлено автоматически. 

    Добавление в проект файлов RTF и CNT 

    Щелкните на кнопке Options, в строке Default topic введите Contents, а в 
строке Help title — RENTMAN System. Щелкните на вкладке Compression и выберите 
переключатель Maximum. Затем щелкните на вкладке Files и в строке Rich Text 
Format (RTF) files введите rentman. rtf, а в строке Contents file— rentmant. 
cnt. После этого щелкните на кнопке OK, чтобы закрыть диалоговое окно Options. 

    Добавление кнопок просмотра 

    Щелкните на кнопке Windows, в открывшемся диалоговом окне щелкните на 
кнопке Add, а затем в диалоговом окне Add a New Type Window введите main. 
Возвратившись в диалоговое окно Window Properties, щелкните на вкладке Buttons 
и установите флажок Browse группы параметров Buttons. Теперь в окне программы 
WinHelp при отображении разрабатываемого файла справочной системы будут 
использоваться кнопки просмотра, с помощью которых можно перемещаться от 
раздела к разделу, используя ранее определенный порядок просмотра. Если вы 
откроете вкладку Macros этого же диалогового окна, то увидите, что программа 
Help Workshop добавила в список глобальных макросов файла справки макрос 
BrowseButtonsQ. Именно с помощью этого макроса и организуется отображение и 
работа кнопок просмотра. Щелкните на кнопке ОК, чтобы закрыть окно и сохранить 
внесенные изменения. 

    Назначение номеров контекстной справки контекстным строкам 

    Вернувшись в главное окно программы Help Workshop, щелкните на кнопке Map. 
В открывшемся диалоговом окне щелкните на кнопке Add, введите в строке Topic 
ID слово Contents, а в строке Mapped numeric value — значение о. Это значение 
будет использоваться теми элементами приложения RENTMAN, для которых 
установлено получение справки, в качестве номера раздела контекстно-зависимой 
справки. Щелкните на кнопке ОК, чтобы закрыть диалоговое окно. 
    Снова щелкните на кнопке Add и в введите в открывшемся окне название 
раздела LogCall и значение 100. Такая разница между номерами разделов позволит 
впоследствии добавлять новые разделы без необходимости внесения изменений в 
ранее назначенные номера. Сделайте то же самое для разделов Property и 
WorkOrderPrint, указав, соответственно, значения 200 и 300. С помощью этих 
номеров программные элементы приложения RENTMAN будут связываться со 
справочной системой. Для того чтобы подключить тот или иной объект к нужному 
разделу, определив таким образом данный раздел в качестве 
контекстно-зависимого раздела, достаточно присвоить свойству HelpContext 
объекта приложения соответствующее значение. Закончив назначение номеров 
контекстной справки, щелкните на кнопке ОК для закрытия окна. 
    Теперь можно сохранить и откомпилировать файл проекта справки. Щелкните на 
кнопках Save и Compile, находящихся в левом верхнем углу окна. 
    Если все было сделано правильно, то компиляция завершится без ошибок, 
после чего можно перейти к тестированию. 

    Тестирование справочной системы 

    С помощью программы Help Workshop можно не только создавать, но и 
тестировать файлы справки. Выберите команду File'=>Run WinHelp или щелкните на 
кнопке панели инструментов, на пиктограмме которой изображен вопросительный 
знак. В списке Mapped Topic IDs появившегося диалогового окна View Help File 
выберите элемент Contents. С помощью этого раскрывающегося списка эмулируется 
передача в программу WinHelp кода контекстно-зависимой справки. Можно также 
выбрать любой другой из ранее определенных разделов. 
    Щелкните на кнопке View Help, чтобы открыть созданный файл справки. На 
экране должен появится раздел содержания, как показано на рис. 13.9. 
    Щелкните на ссылке Log a call. Должен открыться соответствующий раздел, 
как показано на рис. 13.10. 
    Щелкните на кнопке возврата («), а затем в разделе Contents щелкните на 
ссылке Add or update property. Снова вернитесь к разделу Contents и щелкните 
на ссылке Print work orders. Данный раздел, как и все предыдущие, будет открыт 
в окне программы WinHelp, как показано на рис. 13.11. 
    Наконец, щелкните на кнопке Contents (Содержание), чтобы убедиться в том, 
что раздел содержания также открывается корректно. 

    Глава 13. Последние штрихи 285 

    Рис. 13.9. Раздел содержания созданного файла справки 

    Рис. 13.10. Раздел LogCall, открытый при тестировании файла справки 

    Рис. 13.11. Раздел WorkOrderPrint, открытый при тестировании файла справки 
    

    286 Часть II. Учебный курс 

    Подключение файла справки к приложению 

    Последний и, пожалуй, самый важный этап в создании справочной системы, 
состоит в подключении файла справки к приложению и корректной настройке 
номеров контекстной справки. 
    Выйдите из программы Help Workshop и вернитесь в Delphi. Перед выходом из 
Help Workshop, если нужно, отключите режим Help Author и перекомпилируйте файл 
справки. Вернувшись в Delphi, выберите команду Project^Options и в открывшемся 
окне перейдите на вкладку Application. Введите в строке Help file имя файла 
rentman. hip и щелкните на кнопке ОК. 
    Затем откройте форму fmRSYSMANO в окне конструктора форм и дважды щелкните 
на компоненте MainMenu, чтобы открыть окно конструктора меню. Выберите из меню 
File пункт Log a call и нажмите <F11>, чтобы перейти в окно Object Inspector. 
Найдите среди свойств элемента меню свойство HelpContext и измените его 
значение на 100, в соответствии со значением, которое вы назначили ранее в 
качестве номера контекстной справки для соответствующего раздела справочной 
системы. Проделайте то же самое для всех пунктов меню, которые нужно связать с 
разделами Property и WorkOrderPrint, используя значения свойства HelpContext 
200 и 300, соответственно. 
    Теперь осталось настроить пункт Contents меню Help приложения. Щелкните 
дважды на компоненте MainMenu, а затем — на пункте Contents. В открывшемся 
окне редактирования введите следующий оператор. 

    Application.HelpContext(0); 

    HelpContext — это метод, с помощью которого встроенный объект Application 
вызывает программу WinHelp, передавая ей указанный в качестве параметра метода 
номер контекстной справки. В данном случае передается значение 0, что 
соответствует разделу Contents. 
    Закончив настройку меню, щелкните на кнопке Help панели инструментов 
RENTMAN, а затем нажмите <F11>, чтобы перейти в окно Object Inspector. 
Откройте вкладку Events и в качестве значения обработчика события OnClick 
укажите ссылку на обработчик события Contentsldick, который будет вызываться 
при выборе пользователем команды меню Help^>Contents. Теперь щелчок на кнопке 
Help будет приводить к открытию того же раздела справки — содержания. 
Сохраните проект и запустите его на выполнение. Если все было сделано 
правильно, то при щелчке на кнопке Help панели инструментов или выборе пункта 
меню Help'=!>Contents будет открываться раздел Contents только что созданной 
справочной системы. При выборе пункта меню Log a call, Property или Work Order 
print и нажатии <F1> также должен открываться соответствующий раздел справки. 

    Добавление контекстно-зависимой справки 

    Хотя концепция контекстно-зависимой справки уже была реализована 
достаточно давно в различных приложениях, в Windows она появилась лишь начиная 
с версии Windows 95. В пользовательском интерфейсе приложений для Windows 95 
средство получения контекстно-зависимой справки имеет вид кнопки системного 
меню диалоговых окон, на пиктограмме которой изображен вопросительный знак. 
Для того чтобы использовать справку такого типа в приложениях, создаваемых с 
помощью Delphi, нужно, вопервых, установить подсвойство biHelp свойства 
Borderlcons формы, а во-вторых, создать в исходном тексте справки 
соответствующий раздел. 
    Так как у нас уже есть несколько разделов, мы просто воспользуемся одним 
из них, чтобы проиллюстрировать процесс создания контекстно-зависимой справки 
в приложениях с помощью Delphi. 
    Поскольку мы не будем создавать новых разделов для контекстно-зависимой 
справки, то сразу перейдем к настройке формы. Итак, нужно установить 
подсвойство biHelp свойства Borderlcons одной из форм, а затем присвоить 
свойству HelpContext этой же формы номер соответствующего раздела справочной 
системы. Рассмотрим как это делается на примере формы fmPROCGRDO, 
предназначенной для работы с таблицей PROPERTY. Откройте форму в окне 
конструктора форм и установите подсвойство biHelp свойства Borderlcons этой 
формы, присвоив ему значение True. Кроме того, чтобы кнопка с изображением 
вопросительного знака появилась среди системных кнопок диалогового окна, нужно 
сбросить подсвойства 'biMinimaze и biMaximize этого свойства. Затем щелкните 
на компоненте DBCtrlGrid формы и установите значение его свойства HelpContext 
равным 200, т.е. значению номера контекстной справки. Это приведет к тому, что 
все компоненты, помещенные на управляющую сетку, у которых свойство 
HelpContext до этого момента равнялось 0, также будут при получении 
контекстно-зависимой справки открывать раздел, соответствующий значению 200. 
Завершив настройку, запустите приложение на выполнение. Когда система 
загрузится, откройте форму PROPERTY, щелкните на кнопке с изображением 
вопросительного знака и выберите любой компонент управляющей сетки. На экране 
появится всплывающее окно с текстом раздела Property, как показано на рис. 13.12. 

    Глава 13. Последние штрихи 287 

    На заметку 
    Отключение подсвойств biMinimaze и biMaximize с целью отображения кнопки 
получения контекстнозависимой справки — это требование Windows, а не Delphi. 
По-видимому, разработчики Windows посчитали, что такая справка нужна только в 
модальных диалоговых окнах, которые обычное не имеют кнопок минимизации и максимизации. 

    Рис. 13.12. Раздел справки, представленный в виде всплывающего окна 
контекстно-зависимой справки 


    Добавление всплывающих подсказок 

    Закончив создание справочной системы, можно перейти к настройке 
всплывающих подсказок. Для того чтобы использовать это средство в приложении 
нужно, во-первых, установить в True свойство ShowHint формы, а во-вторых, 
определить текст таких подсказок для всех компонентов формы. 
    Если приложение RENTMAN еще работает, закройте его и вернитесь в Delphi. 
Откройте главную форму приложения, fmRSYSMANO, в окне конструктора форм и 
установите ее свойство ShowHint в True. Затем введите какой-нибудь краткий 
описательный текст в качестве значений свойства Hint всех кнопок панели 
инструментов формы. Например, кнопка sbLogCall может иметь в качестве 
всплывающей подсказки следующий текст: Click here to log a maintenance call. 
    Создав и настроив таким образом несколько всплывающих подсказок, запустите 
приложение. Теперь, когда вы поместите указатель мыши на компонент, для 
которого определена всплывающая подсказка, она появится над компонентом. 
    Обратите внимание на то, что вы можете Изменить, если нужно, логику работы 
всплывающих подсказок. Например, можно перенаправить всплывающие подсказки 
таким образом, чтобы соответствующий им текст появлялся в строке состояния 
приложения. Для этого нужно написать процедуру, а затем присвоить ссылку на 
нее в качестве значения обработчика события OnShowHint объекта Application. 
Заголовок такой процедуры должен иметь следующий вид. 

    procedure(var HintStr: string; var CanShow: Boolean; var Hintlnfo: 
THintInfo) of object; 

    Вот пример такой процедуры, перенаправляющей вывод текста всплывающих 
подсказок формы в ее строку состояния 

    procedure TfmRSYSMANO.RMShowHint(var HintStr: string; var CanShow: 
Boolean; var Hintlnfo: THintInfo); 
    begin 
       stRENTMAN.Panels.Items[0].Text:=HintStr; 
       CanShow ^Falser
    end; 

    Кроме того, процедуру нужно объявить как метод класса TfmRSYSMANO. 

    public 
    { Public declarations } 
    procedure RMShowHint(var HintStr: string; var CanShow: Boolean; var Hintlnfo: 
    THintInfo) ; 

    Теперь осталось лишь назначить ссылку на нее в качестве значения 
обработчика события OnShowHint. 

    procedure TfmRSYSMANO.FormCreate(Sender: TObject); 
    begin 
    inherited; 
    Applicat ion.OnShowHint:=RMShowHintProc; 
    end; 

    288 Часть II. Учебный курс 

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

    Настройка строки состояния 

    Еще одним улучшением пользовательского интерфейса приложения RENTMAN 
является настройка строки состояния. Как вы, должно быть, помните, с тех пор, 
как мы добавили в форму fmRSYSMANO строку состояния, она оставалась 
ненастроенной и никак не использовалась приложением. 
    Созданная ранее строка состояния должна отображать три типа сообщений: 
сообщения о состоянии приложения, имя текущего пользователя и версию 
программы. Вся эта информация достаточно полезна, поэтому должна быть на 
экране постоянно. Если пользователь позвонит вам, чтобы сообщить о какой-то 
проблеме с приложением, вы сразу же сможете узнать у него, какой версией он 
пользуется и какое имя пользователя он ввел, регистрируясь на сервере базы данных. 
    Создать механизм вывода сообщений первого типа — очень просто. Для этого 
необходимо только обновить строку сообщения до и после какого-либо события. 
Давайте, например, добавим операторы вывода сообщения в обработчик события, 
вызываемый при выборе пользователем пункта File^Log a call. Изначально 
исходный текст этого обработчика события имеет следующий вид. 

    procedure TfmRSYSMANO.LogaCalllClick(Sender: TObject); 
    begin 
      inherited; 
      dmRENTMAN.taCALL.Insert; 
      fmRCALEDTO.Show; 
    end; 

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

    procedure TfmRSYSMANO.LogaCalllClick(Sender: TObject); 
    begin 
      inherited; 
         try 
           stRENTMAN.Panels.Items[0].Text:='Add a maintenance call'; 
           dmRENTMAN.taCALL.Insert; 
            fmRCALEDTO.Show; 
        finally 
          stRENTMAN.Panels.Items[0].Text:='' ; 
       end; 
    end; 

    Добавить вывод текущего имени пользователя также не сложно. Эту информацию 
можно получить с помощью вызова всего одной функции API Windows. Щелкните 
дважды на значении обработчика события OnShow главной формы и введите 
следующие операторы. 

    MaxUserName:=30; 
    SetLength(UserName,MaxUserName) ; 
    GetUserNarne(PChar(UserName), MaxUserName) ; 
    SetLength(UserName,Pred(MaxUserName)); 
    stRENTMAN.Panels.Items[1].Text:='User: '+UserName; 
    He забудьте добавить следующие объявления в начале модуля RSYSMANO. 
    UserName : String; 
    MaxUserName : Integer; 

    В приведенном выше программном фрагменте для получения имени пользователя 
применяется функция Windows GetUserName. Имя, возвращаемое пользователем, 
будет отображаться в соответствующей части строки состояния. 

    Глава 13. Последние штрихи                                               289 

    10 Delphi 3 и системы клиент/сервер 

    Наконец, последнее, что нужно вывести в строке состояния, — версия 
приложения. В Delphi имеется прямая поддержка ресурса Windows VERSIONINFO, 
поэтому вы можете указать всю информацию, относящуюся к текущей версии 
разрабатываемого приложения непосредственно в среде Delphi. Как показано на 
рис. 13.13, для этого достаточно воспользоваться вкладкой Versionlnfo 
диалогового окна Project Options. 

    Рис. 13.13. Система Delphi обладает средствами прямой поддержки ресурса 
VERSIONINFO Windows 

    Давайте реализуем механизм получения этой информации из приложения и 
отображения ее в строке состояния. Найдите в окне Object Inspector обработчик 
события OnCreate и дважды щелкните на его значении. В окне редактирования 
должны появится операторы, которые вы добавили раньше для вывода в строке 
состояния имени пользователя. Введите под ними операторы, приведенные в 
листинге 13.2, с помощью которых в строке состояния будет отображаться номер 
текущей версии. 

    Листинг 13.2. Операторы, предназначенные для получения и отображения 
номера текущей версии 

    VersionSize:=GetFileVersionInfoSize(PChar(Application.ExeName),Dummy) ; 
    If (VersionSizeoO) then begin 
      SetLength(VersionBuffer,VersionSize) ; 
      SetLength(Version,VersionSize) ; 
       If (GetFileVersionInfo(PChar(Application.ExeName), Dummy, VersionSize, 
          PChar(VersionBuffer))) and (VerQueryValue(PChar(VersionBuffer), 
          '\StringFileInfo\040904E4\ProductVersion', Pointer(Version), VersionSize)) then 
          stRENTMAN.Panels.Items[2].Text:= 'Version: '-(-Version; 
    end; 
   
    He забудьте добавить в начале процедуры обработчика события FormCreate 
следующие объявления переменных. 

    var 
    VersionBuffer, Version : String; 
    VersionSize : Integer; 
    Dummy : Integer; 

    В приведенном в листинге 13.2 программном фрагменте для получения 
информации о версии приложения используются три функции API Windows — 
GetFileVersionInfoSize, GetFileVersionInfo И VerQueryValue. Полученная 
информация отображается в правой секции строки состояния. 

    290 Часть II. Учебный курс 

    На заметку 
    Обратите внимание на одну специфическую особенность функций 
GetFileVersionlnfoSize и GetFile Versioninfo— передаваемые им параметры типа 
PChar не должны находиться в области приложения, доступной только для чтения. 
Передача константы (т.е. строки, которая находится в доступной только для 
чтения области выполняемого файла), приведет к возникновению ошибки нарушения 
доступа. Повидимому, данные функции при поиске ресурса производят над 
переданными в качестве параметра значениями какие-то манипуляции. 

    Для того чтобы увидеть как другие программы используют ресурс VERSIONINFO 
приложения, закройте приложение RENTMAN и запустите Explorer (Проводник) 
Windows. Найдите каталог системы RENTMAN, щелкните правой кнопкой мыши на 
файле RENTMAN . ЕХЕ и из появившегося всплывающего меню выберите пункт 
Properties (Свойства). Вы увидите, что кроме вкладки General (Общие) в окне 
свойств имеется и вкладка Version (Версия). Щелкнув на ней, можно просмотреть 
всю информацию о версии приложения, определенную ранее с помощью Delphi. 
    Возможность создания ресурсов VERSIONINFO с помощью среды Delphi — далеко 
не единственный пример широкой поддержки Delphi программного интерфейса 
Windows. Практически нет такого уголка API Windows, который был бы недоступен 
программисту, работающему в Delphi. 

    Добавление диалогового окна About 

    Следующим пунктом в списке задач, который мы определили в начале этой 
главы, является добавление в приложение диалогового окна About. Такое окно 
должно быть во всех профессионально выполненных приложениях для Windows. Окно 
About предназначено для вывода пользователю самой общей информации о 
приложении: имени его автора, номера версии, номера телефона для технической 
поддержки и т.п. Иногда некоторые шутники-разработчики помещают в этом окне 
скрытые сообщения или изображения. Например, в диалоговом окне About Delphi 
1.0 скрыто изображение Андерса Хейлсберга (Anders Heilsberg), ведущего 
разработчика Delphi. 

    Совет 
    Для того чтобы увидеть, 4Tq скрывается в диалоговом окне Delphi, нажмите 
клавишу <Alt> и, не отпуская ее, введите любое из следующих слов: DEVELOPERS, 
ТЕШ и QUALITY. В окне появится список людей, благодаря усилиям которых вы 
можете пользоваться Delphi. 

    Вернитесь в Delphi и создайте новую форму на основании элемента About, 
находящегося в хранилище объектов. Назовите объект формуы fmRABTBOXO, а в 
качестве ее заголовка укажите About RENTMAN. Щелкните дважды на форме и 
создайте обработчик события, операторы которого приведены в листинге 13.3. 

    Листинг 13.3. С помощью данного обработчика события FormCreate диалоговое 
окно About наполняется информацией 

    procedure TfmRABTBOXO.FormCreate(Sender: TObject); 
    var 
    VersionBuffer, VersionNoText, ProductNameText, LegalCopyrightText, 
CompanyText : String; 
    VersionSize : Integer; 
    Dummy : Integer; 
    begin 
    inherited; 
    VersionSize:=GetFileVersionInfoSize(PChar(Application.ExeName),Dummy) 
    if  (VersionSizeOO) then begin 
       SetLength(VersionBuffer,VersionSize); 
       SetLength(VersionNoText,VersionSize); 
       SetLength(ProductNameText,VersionSize); 
       SetLength(LegalCopyrightText,VersionSize); 
       SetLength(CompanyText,VersionSize) ; 
       if (GetFileVersionInfo(PChar(Application.ExeName),Dummy, VersionSize, 
           PChar(VersionBuffer))) and 

    Глава 13. Последние штрихи 291 

    (VerQueryValue(PChar(VersionBuffer), 
    '\StringFileInfo\040904E4\ProductVersion', 
    Pointer(VersionNoText), VersionSize)) and 
    (VerQueryValue(PChar(VersionBuffer), 
    '\StringFileInfo\040904E4\ProductName', 
    Pointer(ProductNameText), VersionSize)) and 
    (VerQueryValue(PChar(VersionBuffer), 
    '\StringFileInfo\040904E4\LegalCopyright', 
    Pointer(LegalCopyrightText), VersionSize)) and 
    (VerQueryValue(PChar(VersionBuffer), 
    '\StringFileInfo\040904E4\CompanyName', Pointer(CompanyText), 
     VersionSize)) then begin 
        Version.Caption:=VersionNoText; 
        ProductName.Caption:=ProductNameText; 
        Copyright.Caption:"LegalCopyrightText; 
        Comments.Caption:=CompanyText; 
    end; 
    end; 
    end; 

    Как и в предыдущем примере, в котором выводился номер версии приложения 
RENTMAN, в данном программном фрагменте для получения информации о приложении 
интенсивно используется ресурс VERSIONINFO. Вся эта информация затем выводится 
в окне About приложения RENTMAN. 
    Для того чтобы подключить созданное диалоговое окно к главной форме 
приложения RENTMAN, создайте обработчик события щелчка на пункте About подменю 
Help формы fmRSYSMANO и добавьте в его исходный текст следующий оператор: 

    fmRABTBOXO.ShowModal ; 


    Рис. 13.14. Диалоговое окно About также использует информацию о версии приложения 

    Создав обработчик, выберите команду File^Use Unit и добавьте модуль 
RABTBOXO в оператор uses главной формы приложения. Запустите приложение и 
щелкните на пункте About. На рис. 13.14 показан вид окна About RENTMAN, 
которое должно появиться на экране. 

    292 Часть II. Учебный курс 

    Добавление кнопки печати формы 

    Следующее, что мы собирались сделать — это добавить кнопку печати формы. 
Если бы не возможность визуального наследования, имеющаяся у компонентов 
Delphi, то решение такой задачи потребовало бы большой работы. Однако, 
поскольку Delphi поддерживает средства создания форм на основе других форм, то 
вы потратите на добавление кнопки во все созданные формы не более 5 минут. 
Вернитесь в Delphi и откройте в окне конструктора форм форму класса fmDat 
abase Form. Поместите на нее компонент BitBtn, разместив его примерно на один 
сантиметр правее компонента DBNavigator. Присвойте новому объекту имя 
bbPrintForm, а в качестве заголовка укажите Print Form. Свойству Glyph кнопки 
присвойте в качестве значения файл Print, bmp, который находится в подкаталоге 
Images \Buttons главного каталога Delphi. Затем дважды щелкните на кнопке и 
введите следующий оператор. 

    Print; 

    Создав обработчик события, откройте в окне конструктора форм форму 
fmRWORMDEO. Вы увидите, что на ней теперь имеются две кнопки печати — одна 
называется Print, а другая — Print Form. Так как одна из кнопок лишняя, одну 
из них нужно сделать невидимой. В данном случае, чтобы снова не возиться с 
настройкой, лучше отключить кнопку Print Form, которую форма унаследовала от 
класса-предка DatabaseForm. Щелкните на кнопке Print Form формы fmRWORMDEO и 
установите свойство Visible равным False. Унаследованные компоненты нельзя 
удалить, но можно сделать невидимыми. 
    Закончив, запустите приложение RENTMAN. Как вы убедитесь, на всех. формах 
теперь будет присутствовать кнопка печати формы. 

    Добавление окон сообщения 

    Наконец, последним пунктом в нашем списке является добавление окон 
сообщения, которые должны появляться при печати отчетов. В настоящее время при 
выборе пользователем соответствующего пункта меню или нажатия его 
клавиатурного эквивалента отчет начинает печататься без какого-либо сообщения 
или предупреждения. Если пользователь сделал это по ошибке, то ему придется 
ждать, пока печать отчета не завершится. 
    Хотя игнорирование этого факта позволило упростить исходный текст, 
профессионально выполненные приложения не должны допускать таких ситуаций. Все 
действия, на выполнение которых может потребоваться длительное время или 
которые могут иметь какие-то разрушительные последствия, должны 
санкционироваться пользователем. 
    Для добавления в исходный текст приложения соответствующих диалоговых окон 
не потребуется каких-либо сложных действий. Откройте форму fmRSYSMANO в окне 
конструктора форм и щелкните на пункте Task List подменю Reports. В 
открывшемся окне редактирования исходного текста обработчика события OnClik 
введите следующий оператор. 

    If (MessageDIg('Print the Task List report?', 
    mtConfirmation, mbYesNoCancel,0)omrYes) then Exit; 

    В данном операторе вызывается встроенная функция создания диалогового окна 
сообщения MessageDIg, которая выводит окно с запросом на подтверждение печати 
отчета. Первый параметр функции представляет строку, которая отображается в 
диалоговом окне. Второй — тип диалогового окна (в данном случае это окно 
запроса на подтверждение). Третий параметр сообщает функции, какие кнопки 
нужно отобразить в этом окне — в рассматриваемом примере это кнопки Yes, No и 
Cancel. Последний параметр — номер раздела контекстной справки. В данном 
случае он равен 0, но, если хотите, вы можете создать отдельный раздел для 
каждого такого диалогового окна. 
    Сохраните приложение, запустите его на выполнение и проверьте, как 
работает диалоговое окно запроса на подтверждение. 
    Точно также можно создать диалоговое окно сообщения о завершении печати 
отчета. Для этого нужно в окне редактирования исходного текста обработчика 
события TaskListlClick в блоке finally поместить между операторами Cursor 
:=crDefault; и end; следующий оператор. 

    MessageDIg("Task List Report Finished', mtlnformation, [mbOK],0) ; 

    Глава 13. Последние штрихи 293 

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

    Резюме 

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

    Что дальше... 

    В следующей главе, завершающей часть II, "Учебный курс", мы рассмотрим ряд 
вопросов, возникающих после завершения разработки приложения RENTMAN. Вы 
узнаете, что нужно делать на этапе тестирования приложения, а также коснетесь 
такой темы, как совершенствование приложения и подготовка его к использованию. 
В главе 14, "Тестирование", вы найдете ответы на многие вопросы, с которыми 
сталкивается разработчик после завершения создания приложения архитектуры клиент/сервер. 

    294 Часть II. Учебный курс 
