Иллюстрированный самоучитель по Kylix

         

Три расположенных рядом дочерних окна внутри главной формы



Рисунок 10.4. Три расположенных рядом дочерних окна внутри главной формы


Запустите эту форму и попробуйте создать новые дочерние окна с помощью пункта меню File/New или нажатия на соответствующую пиктограмму панели инструментов. Вы можете создать несколько файлов и располагать их каскадом, рядом и другими способами, с помощью нажатия на соответствующие пиктограммы панели инструментов (Рисунок 10.4).

Для поддержания всей этой функциональности Kylix создал специальный код, который размещен в модуле clxmain (листинг 10.6).



Пиктограмма Console Application



Рисунок 10.5. Пиктограмма Console Application


Kylix создаст файл проекта для консольного приложения и покажет окно редактора кода с текстом, приведенным в листинге 10.7.



Форма приложения



Рисунок 13.1. Форма приложения


Напишем в обработчике события OnPaint формы Form1 следующий код (листинг 13.1):




Информационное окно извещающее об обновлении формы



Рисунок 13.2. Информационное окно, извещающее об обновлении формы


Если вы используете компонент TImage для отображения графики на форме, вам не нужно будет заботиться об обновлении графического изображения, содержащегося в этом компоненте. Обновление будет произведено автоматически. Свойство Picture компонента TImage определяет текущий графический образ, рисунок или другую графику, которую отображает компонент.

Назад
Содержание
Вперед


Форма с диагональными линиями



Рисунок 13.3. Форма с диагональными линиями


Для рисования ломаных линий можно воспользоваться специальным методом Polyline.

Параметрами данного метода являются элементы массива Points. Приведем пример рисования ломаной линии:

Form1.Canvas.Polyline([Point(0, 0), Point(12,14), Point(50,30), Point (130, 120), Point(210,132)]);

Данный пример чертит ломаную линию, состоящую из прямых линий (Рисунок 13.4).



Ломаная линия



Рисунок 13.4. Ломаная линия


Рисование линий с помощью метода Polyline аналогично рисованию нескольких линий с помощью методов MoveTo и LinеТо. Ниже приведен пример (листинг 13.10), который строит такую же ломаную, как и предыдущий пример.



Эллипс вписанный в прямоугольник



Рисунок 13.5. Эллипс, вписанный в прямоугольник


Нижеприведенный пример (листинг 13.12) рисует прямоугольник со скругленными углами, которые скруглены по шаблону окружности, с диаметром 10 точек (Рисунок 13.6).



Прямоугольник со скругленными углами



Рисунок 13.6. Прямоугольник со скругленными углами


Для рисования многоугольников с любым количеством углов и сторон вы можете использовать метод Polygon.

Метод Polygon содержит в качестве параметров массив точек Points, которые определяют координаты вершин многоугольника. После рисований текущим пером линий многоугольника метод Polygon закрашивает текущим цветим кисти область внутри многоугольника.

Примечание
Данный метод аналогичен методу Polyline, только первая и последняя точки ломаной линии соединяются.

Назад
Содержание
Вперед


Обработка события OnMouseDown



Рисунок 13.7. Обработка события OnMouseDown


Еще один пример (листинг 13.26) устанавливает текущую позицию пера в координаты, в которых пользователь щелкнул мышью.



Пример рисования линий



Рисунок 13.8. Пример рисования линий


Обработка события OnMouseMove

Данное событие происходит периодически во время перемещения мыши. Для обработки этого события нужно написать программу-обработчик.

Нижеприведенный пример (листинг 13.28) показывает, как можно использовать событие OnMouseMove для немедленного рисования линий (Рисунок 13.9).



Обработка события OnMouseMove



Рисунок 13.9. Обработка события OnMouseMove


Назад
Содержание
Вперед


Формазаготовка для игровой программы



Рисунок 13.10. Форма-заготовка для игровой программы




Поле для игры



Рисунок 13.11. Поле для игры


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



Программа в процессе работы



Рисунок 13.12. Программа в процессе работы


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

Назад
Содержание


Добавление объекта потока в проект с помощью диалогового окна New Items



Рисунок 14.1. Добавление объекта потока в проект с помощью диалогового окна New Items


В появившемся диалоговом окне напишите имя для вашего нового объекта потока. После всего этого Kylix создаст новый модуль и в окне редактора кода появится новая закладка.

Примечание

В отличие от большинства диалоговых окон IDE Kylix, которые требуют ввода имени класса, диалоговое окно создания нового объекта потока не добавляет автоматически букву "T" перед названием нового класса потока Поэтому желательно самостоятельно правильно называть новые потоки, например TMyThread.

Если вы проделали все вышеописанное и назвали новый объект потока TMyThread, то в новом модуле, сгенерированном Kylix, вы можете увидеть код — заготовку для вашего нового объекта потока (листинг 14.2).



Форма приложения



Рисунок 14.2. Форма приложения


Далее запишем в метод Execute объекта TMyThread1 код, который должен выполняться в потоке. Пусть это будет код, который генерирует случайные числа и присваивает их глобальной переменной count. Для того чтобы генераций случайных чисел была бесконечной, зациклим ее с помощью так называемого "бесконечного цикла". В итоге модуль Unit2 должен выглядеть так, как показано на листинге 14.4.



Результат работы многопоточного приложения



Рисунок 14.3. Результат работы многопоточного приложения


Назад
Содержание
Вперед


Основные типы баз данных



Рисунок 15.1. Основные типы баз данных


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

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

Содержание
Вперед


Схема приложения базы данных



Рисунок 15.2. Схема приложения базы данных


Рассмотрим все четыре части приложения баз данных:

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

Среда Kylix обеспечивает поддержку двух типов наборов данных:

клиентский набор данных — хранит данные в памяти, благодаря чему пе-ремещение по данным осуществляется просто и эффективно. Клиентский набор данных обеспечивает простой метод фильтрации записей и объединения данных. Так как данные кэшируются в памяти, этот набор данных может содержать ограниченное число записей. Имеется два типа клиентских наборов данных: общий клиентский набор данных и клиентский набор данных, использующий SQL. Первый обеспечивает доступ к данным, работая напрямую с файлами, расположенными на локальных дисках, соединяясь с другими наборами данных в одном и том же модуле данных или соединяясь с сервером баз данных. Второй может или использовать файлы, расположенные на локальных дисках, или соединяться с сервером базы данных;
однонаправленный набор данных — может читать данные, описанные в запросе SQL или возвращаемые хранимой на сервере процедурой. Этот вид набора данных не хранит данные в памяти и является менее гибким в использовании по сравнению с клиентским набором данных. Единственным направлением перемещения по записям в однонаправленном наборе данных является направление, указанное в SQL-запросе команды ORDER BY. Вы не можете использовать однонаправленный набор данных для обновления данных. Однако этот вид набора данных обеспечивает быстрый доступ к информации, хранящейся на сервере базы данных, и может предоставлять значительно больший объем информации по сравнению с клиентским набором данных.

В дополнение к вышеописанным наборам данных вы можете создать собственный набор данных. Для этого вам придется использовать класс TDataSet в качестве предка.

Назад
Содержание
Вперед


Структура таблицы базы данных



Рисунок 15.3. Структура таблицы базы данных


Любая таблица реляционной базы данных состоит из столбцов (полей) и строк (записей). Каждое поле таблицы должно иметь свое уникальное имя.

Примечание

Название поля должно быть уникальным только в пределах данной таблицы. Различные таблицы одной базы данных могут иметь одинаковые имена.



Форма приложения базы данных



Рисунок 15.4. Форма приложения базы данных


Мы не будем вдаваться в подробности пользовательского интерфейса этого приложения. Рассмотрим лишь те особенности, которые относятся к работе с таблицей базы данных.

Итак, на форме располагаются компоненты DataSource1 и ClientDataSet1. Первый компонент обеспечивает взаимосвязь между компонентом ClientDataSet1 и компонентами, отображающими данные. Компонент ClientDataSet1 нужен для указания имени файла таблицы, из которой будут браться записи. Для отображения данных, находящихся в таблице, применяются компоненты DBImage1, DBText1, DBText2, DBMemo1 и DBGrid1.

Компонент DBImage1 будет отображать картинки, содержащиеся в таблице. Для этого в его свойство DataField помещено значение Graphic, обозначающее, что будет отображаться содержимое поля с именем Graphic. Компоненты DBText1 и DBText2 служат для отображения текста (длиной не более одной строки). В их свойства DataField помещено значение CommonName, также обозначающее название поля таблицы, значение которого будет отображать компоненты. Компонент DBMemo1 предназначен для отображения нескольких строк текста и может содержать горизонтальные и вертикальные полосы прокрутки. Данные берутся из поля Notes таблицы, т. к. именно это значение указано в свойстве DataField этого компонента. Наконец, компонент DBGrid1 — самый важный компонент в данном приложении. Он отображает полную запись таблицы и с помощью него происходит перемещение по записям. Запустим приложение. В результате появится форма с заполненными компонентами (Рисунок 15.5).



Приложение в работе



Рисунок 15.5. Приложение в работе


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

Назад
Содержание


Окно эксперта компонентов



Рисунок 19.1. Окно эксперта компонентов



Заполненное окно эксперта компонентов



Рисунок 19.2. Заполненное окно эксперта компонентов


После заполнения полей данного окна нажимаем кнопку ОК, и Kylix автоматически создаст заготовку модуля вашего компонента. Модуль заготовки для нашего примера представлен в листинге 19.1.



Результат обработки события OnMouseDown



Рисунок 19.7. Результат обработки события OnMouseDown


Пример создания нового события компонента

Попробуем теперь создать собственное событие. Для этого нужно сначала убедиться, что такого события нет в CLX Kylix. Предположим, возникла необходимость создания события, которое генерируется каждые 30 секунд. Естественно, для такого случая можно воспользоваться компонентом Timer, который расположен на вкладке System палитры компонентов Kylix. Но допустим, что наш компонент должен иметь такое событие для удобства работы с ним. Код для создания такого события представлен в листинге 19.14.



Результат регистрации компонента



Рисунок 19.8. Результат регистрации компонента


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

Создайте значок для вашего компонента размером 24x24 пиксела. Данное изображение сохраните в файле формата DCR. Имя файла — это имя вашего компонента, в котором все буквы — заглавные. Например, для компонента TMyButton имя файла картинки будет TMYBUTTON.DCR. Затем поместите файл картинки в ту папку, в которой находится файл с модулем компонента. Перекомпилируйте модуль, и ваш компонент будет изображаться в палитре компонентов вашим рисунком.

Назад
Содержание


Вкладка Packages диалогового окна Project Options



Рисунок 20.1. Вкладка Packages диалогового окна Project Options




Окно добавления пакета в проект



Рисунок 20.2. Окно добавления пакета в проект


Примечание
При изменении пути поиска (Search path) в диалоговом окне добавления пакета (см. Рисунок 20.2) вы измените глобальные настройки путей к библиотекам Kylix

При вводе имени пакета с клавиатуры (в поле для редактирования без применения кнопки Add) вам не потребуется вводить расширение пакета. Обратите внимание, что названия пакетов записываются через точку с запятой:

baseclx; visualclx; visualdbclx; dataclx

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

Примечание
Вся информация об используемых приложением пакетах будет сохранена только для данного приложения. Если вы хотите, чтобы настройки сохранялись для других приложений, установите флажок Default, находящийся в нижней части диалогового окна Project Options.

Очень важно помнить, что даже если вы используете в своем приложении пакеты, вы все равно должны прописывать имена модулей среды Kylix в блоке uses:

unit MainForm;
interface
uses
SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs;

Хотя все из вышеперечисленных модулей входят в один пакет bplclx, если убрать их описание из блока uses, компилятор сгенерирует ошибку.

Назад
Содержание
Вперед


Окно просмотра компонентов входящих в пакет



Рисунок 20.3. Окно просмотра компонентов, входящих в пакет


Назад
Содержание
Вперед


Пиктограмма Package диалогового окна New Items



Рисунок 20.4. Пиктограмма Package диалогового окна New Items


Редактор пакета включает в себя два раздела: содержания (Contains) и требований (Requires). Для добавления нового модуля в раздел содержания выберите раздел Contains щелчком мыши, затем щелкните на кнопке Add редактора пакета. Появится диалоговое окно Add (Рисунок 20.6).



Редактор пакета



Рисунок 20.5. Редактор пакета




Вкладка Add Unit диалогового окна Add



Рисунок 20.6. Вкладка Add Unit диалогового окна Add


На вкладке Add Unit диалогового окна Add запишите в поле имени файла модуля имя файла pas, который вы хотите включить в пакет, либо воспользуйтесь кнопкой Browse для непосредственного указания файла. В результате выбранный файл модуля будет добавлен в раздел Contains вашего пакета.

Можете повторить вышеперечисленные действия для добавления дополнительных модулей в пакет.

3. Для добавления пакетов в раздел Requires выберите этот раздел щелчком мыши, затем нажмите кнопку Add редактора пакета.



Диалоговое окно Add



Рисунок 20.7. Диалоговое окно Add


4. В появившемся диалоговом окне (Рисунок 20.7) в поле имени пакета (Package name) введите имя файла пакета (dcp), требуемого для работы вашего пакета. Вы также можете использовать кнопку Browse для непосредственного указания файла пакета. Повторяя данный шаг, вы можете добавить несколько файлов пакетов в раздел Requires вашего пакета.

5. Для выбора типа создаваемого пакета (runtime или design-time) щелкните на кнопке Options редактора пакета (см. Рисунок 20.5). Откроется диалоговое окно Project Options (Рисунок 20.8).

6. Теперь выберите нужный тип приложения с помощью переключателя в разделе Usage options.

7. Последний шаг — компиляция созданного пакета. Нажмите кнопку Compile редактора пакета.



Диалоговое окно Project Options



Рисунок 20.8. Диалоговое окно Project Options


Редактировать уже существующий файл пакета можно по-разному:

выбрать пункт главного меню Kylix File/Open и в нем уже — файл пакета, который необходимо редактировать;
выбрать пункт главного меню Kylix Component/Install Component, выбрать нужный пакет в списке пакетов и нажать кнопку Edit;
в открытом редакторе пакета выбрать в разделе Requires нужный пакет, щелкнуть на нем правой кнопкой мыши для появления контекстного меню, где выбрать пункт Open.

Кроме того, вы можете редактировать файл пакета точно так же, как и файл проекта — вручную, как текстовый файл. Файл пакета содержит в себе три раздела:

название пакета (в разделе Package);
раздел требуемых файлов для данного пакета (раздел Requires);
раздел, содержащий названия файлов модулей, входящих в данный пакет (раздел Contains).

Приведем в качестве примера содержимое файла пакета user:

Package user;

Requires baseclx, vcl, visualclx;

Contains QMyButton, Week in 'home/kylix/lib';

end.

Назад
Содержание
Вперед


Схема обработки события



Рисунок 8.16. Схема обработки события

Рассмотрим основные события, которые может обрабатывать компилятор Kylix. Для начала перечислим эти события:

OnChange
OnClick
OnDblClick
OnDragDrop
OnDragOver
OnKeyPress OnKeyUpOnMouseDownOnMouseMoveOnPainOnEndDragOnEnter OnExitOnKeyDownOnProgressOnStartDragOnMouseUp

Рассмотрим каждое событие более подробно.

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

• при выборе пользователем путем нажатия клавиш управления курсором элемента в сетке (Grid), дереве (Trее), списке (List) или выпадающем списке (DropDown List);

• при нажатии пользователем клавиши < Пробел> или <Enter> в тот момент, когда компонент (например, кнопка) был в фокусе (Component. Focused = True);

• при нажатии пользователем клавиши <Enter> в случае, если активная форма имеет кнопку по умолчанию;

• при нажатии пользователем клавиши <Esc> в случае, если активная форма имеет кнопку прерывания;

• при нажатии пользователем комбинации клавиш быстрого доступа ("горячих" клавиш) для доступа к кнопке или пункту меню. Например, в свойстве Caption кнопки формы записано &Пуск, при этом надпись на кнопке имеет вид Пуск. В этом случае, если пользователь нажимает комбинацию клавиш <Alt>+<П>, происходит событие OnClick;

• при установке приложением свойства Сhecked переключателя RadioButton в true;

• при изменении приложением свойства Checked индикатора CheckBox;

• при вызове метода Click элемента меню приложения.

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

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

Событие OnStartDrag наступает, когда пользователь начинает перетаскивать компонент, т. е. нажал над компонентом левую кнопку мыши и, не отпуская ее, начал смещать курсор мыши. Событие имеет параметр Sender, который содержит наименование перетаскиваемого компонента, или объекта перетаскивания (в случае, если компонент является компонентом контейнерного типа).
Событие OnDragDrop компонента наступает, когда пользователь отпускает перетаскиваемый компонент над другим компонентом. В обработчике события нужно описать, что должно происходить в момент отпускания перетаскиваемого компонента. При этом параметр Source должен соответствовать перетаскиваемому компоненту, а параметр sender должен соответствовать компоненту, над которым компонент будет отпущен. Кроме того, два параметра (X и Y) служат для хранения координат курсора мыши над компонентом. Система координат в данном случае соответствует клиентской части компонента.
Событие OnDragOver компонента наступает, когда перетаскиваемый компонент пересекает границу данного компонента и оказывается над ним. Это событие возникает все время, пока пользователь перемещает компонент над компонентом-приемником. Как только пользователь отпускает компонент (отпускает левую кнопку мыши), происходит событие OnDragDrop, описанное выше. Для того чтобы определить, компоненты какого типа принимает данный компонент, используют параметр Accept. Если компонент может принимать любые компоненты, можно оставить обработчик OnDragOver пустым, но он обязательно должен присутствовать. Например:
procedure TForm1.ListBox2DragOver(Sender, Source: TOtrject; X, Y: Integer;
State: TDragState; var Accept: Boolean); begin
// Данный комментарий нужен, чтобы компилятор не удалил этот пустой // обработчик end;

Во время перетаскивания компонента форма указателя мыши может изменяться. Для установки этого свойства служит свойство DragCursor компонента, на который будет переноситься другой компонент.

Приведем простой пример использования событий OnDragDrop и OnDragOver.

Для наглядного применения события OnDragDrop создадим приложение, которое позволит пользователю перетаскивать строки одного списка в другой. Итак, расположим на форме два списка ListBox; ListBox1 и ListBox2. Добавим строки в первый список путем редактирования его свойства Items. Назовем строки Cтрока 1 Cтрока 10 (Рисунок 8.17).

Для простоты будем перетаскивать строки из первого списка во второй. Поменяем значение свойства DragMode списка ListBox1 на dmAutomatic, что обеспечит автоматическое начало перетаскивания. Теперь для второго списка (ListBox2) напишем обработчик события OnDragOver (листинг 8.2).



Системы



системы

В этой главе мы рассмотрим принципы, по которым подключается файл справки к вашему приложению.

CLX не обеспечивает прямую поддержку отображения файла справки. Он обеспечивает механизм, с помощью которого запросы об отображении справки вызывают внешние программы, отображающие справочные файлы (такие, как Man, Info или HyperHelp). Кроме того, для работы этого механизма на разработчика возлагается задача по созданию класса, который поддерживает интерфейс ICustomHelpViewer (и, по желанию, один из интерфейсов-потомков ICustomHelpViewer). После чего необходимо зарегистрировать экземпляр данного класса с помощью глобального менеджера помощи (global Help Manager).

Менеджер помощи содержит список всех зарегистрированных в системе программ для отображения файлов помощи и передает ему запросы вашего приложения. Запросы передаются в две фазы:

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

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

Итак, CLX обеспечивает связь между вашим приложением и программой для просмотра файлов справки с помощью интерфейсов. Эти интерфейсы описаны в файле HelpIntfs.pas, который также содержит код, реализующий менеджер помощи (см. Приложение 1):

ICustomHelpViewer обеспечивает поддержку отображения помощи по заданному ключевому слову, а также отображения оглавления файла справки;
IExtendedHelpViewer обеспечивает поддержку отображения помощи по номеру контекста справки, а также отображения тем. В большинстве справочных систем функция темы в обеспечении ключевых слов высшего уровня (например, в справочной системе Kylix слово IntToStr является ключевым словом, но строка String manipulation routines является названием темы);
ISpecialWinHelpViewer обеспечивает поддержку ответа на специализированные сообщения WinHelp в случае, если приложение запущено под Windows. В поддержке данного интерфейса нуждаются только те приложения, которые работают в среде Windows. Более того, это необходимо, когда приложение использует нестандартные сообщения WinHelp;
IHelpManager обеспечивает механизм для обратной связи программы просмотра файлов помощи с менеджером помощи вашего приложения. Этот механизм необходим, если программа просмотра помощи нуждается в дополнительной информации;
IHelpSystem обеспечивает механизм, с помощью которого TApplication отсылает запросы в систему помощи. TApplication получает экземпляр объекта, который поддерживает два интерфейса IHelpSystem и IHelpManager;
IHelpSelector обеспечивает механизм, с помощью которого система помощи может использовать пользовательский интерфейс для того, чтобы узнать у пользователя, какую программу необходимо применить для просмотра файлов справки, если более чем один просмотрщик файлов справки может отображать данный файл.

Интерфейс ICustomHelpViewer содержит три типа методов:

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

Интерфейс ICustomHelpViewer обеспечивает три функции, которые используются для связи менеджера помощи и системной информации:

ICustomHelpViewer. GetViewerName: String; — Вызывается, когда менеджер помощи должен узнать имя программы для показа файлов справки (например, когда приложение запрашивает список всех зарегистрированных в системе программ просмотра файлов помощи). Данная функция возвращает информацию в строковой форме (String);
ICustomHelpViewer.NotifyID(const ViewerID: Integer); — вызывается немедленно после регистрации программы для просмотра файлов помощи, чтобы присвоить ей уникальный идентификационный номер;
ICustomHelpViewer.ShutDown; - вызывается из менеджера помощи для уведомления программы — просмотрщика помощи в том, что менеджер отключается и ресурсы, занятые просмотрщиком помощи, должны быть освобождены.

Интерфейс IHelpManager позволяет просмотрщику помощи передавать четыре запроса:

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

Рассмотрим методы, позволяющие выполнить все вышеописанное:

IHelpManager.GetHandle : LongInt; — вызывается просмотрщиком файлов помощи, если он нуждается в дескрипторе текущего оконного компонента;
IHelpManager.GetHelpFile: String; — вызывается просмотрщиком помощи, если ему необходимо узнать имя файла помощи, который назначен активному оконному компоненту;
IHelpManager.GetHelpPath: String; — вызывается просмотрщиком помощи, если ему нужно узнать путь к файлу справки. Данная информация не предоставляется по умолчанию, т. к. многие из внешних систем помощи способны самостоятельно определить путь с помощью переменных среды или другими способами;
IHelpManager.Release; — вызывается для уведомления менеджера помощи об отключении просмотрщика помощи. Данный метод никогда не должен вызываться в ответ на запрос, приходящий из ICustomHelpViewer.ShutDown. Метод используется только для уведомления менеджера помощи о неожиданном разрыве соединения.

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

Интерфейс ICustomHelpViewer необходим для обеспечения поддержки помощи по ключевому слову. Интерфейс IExtendedHelpViewer необходим для поддержки контекстно-зависимой помощи.

Интерфейс ICustomHelpViewer предоставляет три метода для работы со справкой по ключевому слову:

ICustomHelpViewer.CanShowKeyword(const HelpString: String): Integer; — метод, который вызывается менеджером помощи. Данный метод опрашивает каждый из зарегистрированных в системе просмoтрщиков помощи на возможность отображения справки по ключевому слову. Ожидается, что просмотрщик даст ответ в виде целого числа, которое указывает, сколько различных страниц справки может отобразить данный просмотрщик в ответ на запрос менеджера помощи. Просмотрщик может использовать любые методы для определения этого числа. Если просмотрщик не поддерживает помощь по данному ключевому слову, он возвращает нулевое значение. Отрицательные значения, возвращаемые просмотрщиками, в настоящее время расцениваются как нулевые, но в будущем могут использоваться для каких-либо других целей;
ICustomHelpViewer.GetHelpStrings(const HelpString: String):TStringList; — вызывается менеджером помощи если более одного про-смотрщика способны отобразить помощь для данного ключевого слова. При вызове данного метода ожидается, что просмотрщик возвратит значение типа TStringList. Строки возвращаемого списка должны указывать на страницы, которые содержат данное ключевое слово, но характеристики данного списка могут отличаться у разных просмотрщиков. В случае, когда ответ приходит от просмотрщика HyperHelp, список строк всегда содержит всего одну ссылку на каждую из страниц, в которой есть ключевое слово;
ICustomHelpViewer.ShowHelp(const HelpString: String); —вызывается менеджером помощи, если необходим просмотрщик помощи для отображения справки по ключевому слову.

Интерфейс ICustomHelpViewer обеспечивает два метода, связанных с отображением содержания файла справки:

CanShowTableOfContents; ShoWTableOfContents.

Теоретически их работа схожа с работой методов просмотра помощи по ключевому слову: менеджер помощи сначала запрашивает все просмотрщики с помощью метода ICustomHelpViewer.CanShowTableOfContents: Boolean;, затем вызывает конкретную программу-просмотрщик с помощью вызова метода ICustomHelpViewer.ShowTableOfContents.

Для того чтобы менеджер помощи мог работать с интерфейсами ICustomHelpViewer, IExtendedHelpViewer, ISpecialWinHelpViewer и IhelpSelector, необходимо осуществить регистрацию объекта справочной системы.

Модуль, который содержит описание данного объекта, должен иметь в списке используемых модулей модули HelpIntfs и QForms. Экземпляр объекта должен быть объявлен в секции var раздела реализации (implementing) модуля.

Вместе со средой Kylix поставляются файлы, помогающие создавать систему помощи для ваших приложений. Эти файлы находятся в каталоге

/kylix/demos/helpviewers/.

Здесь располагаются три основных файла:

HelpViewers.dpk
ManViewer.pas
WinHelpViewer.pas

Прежде чем рассмотреть эти три файла, отметим, что справочная система CLX имеет подключаемую архитектуру, которая работает через интерфейс IHelpSystem.

Модуль WinHelpViewer обеспечивает связь между приложением и HyperHelp (эмулятором WinHelp под Linux).

Модуль ManViewer обеспечивает связь между приложением и системой Linux man.

Пакет HelpViewers представляет собой пример пакета, который содержит модуль ManViewer. Этот пакет зарегистрирован как пакет времени разработки в IDE и обеспечивает связь IDE со страницами man. Данный пакет не может быть использован во время работы приложения.



с конкретным кодом, называемым обработчиком



События

Событие (event) — это механизм, который связывает какое-либо происшествие с конкретным кодом, называемым обработчиком события (event handler).

Механизм обработки событий будет подробно рассмотрен во второй части книги. Пока лишь отметим, что среда Kylix поддерживает два основных типа событий:

пользовательские (widget); системные (system).
К пользовательским относят события, которые происходят из-за взаимодействия пользователя с программой. Например, движение мышкой, нажатие кнопки и т. д.

Системные события — это события, происходящие в операционной системе. Например, тикание системного таймера.

Назад
Содержание
Вперед


Сообщения и системные события



Сообщения и системные события

Сообщения и события в Linux работают иначе, чем в Windows. Этот факт в первую очередь влияет на процесс создания своих компонентов. Несмотря на это, большинство компонентов и редакторов свойств переносятся в Linux достаточно легко. Так, например, интерфейс TObject. Dispatch замечательно функционирует в Linux.

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



Совместимости модулей Kylix и Delphi



Совместимости модулей Kylix и Delphi

Все компоненты и объекты VCL и CLX определены в файлах модулей (pas). Например, вы можете найти описание объекта TObject в модуле System.pas, а описание базового класса TCoroponent — в модуле Classes.pas. Когда вы помещаете объект на форму или используете его внутри своего приложения, имя модуля, который содержит данный компонент, помещается в раздел uses. Это позволяет компилятору узнать, какие модули использует ваше приложение при работе,

В табл. 21.3 приведен список модулей Delphi и совместимых с ними модулей Kylix. Некоторые модули Delphi имеются только в новой версии Delphi — Delphi 6.



Совместное использование файлов ресурсов Linux и Windows



Совместное использование файлов ресурсов Linux и Windows

Если вы хотите, чтобы ваше приложение успешно функционировало и в Windows и в Linux, вы можете распространять ваше приложение с ресурсными файлами, которые необходимы как для одной, так и для другой операционной системы. Для этого вы можете разместить файлы ресурсов на сервере, который является доступным для обеих систем или использовать Samba на Linux-компьютере для обеспечения доступа к файлам через сеть Microsoft.

Файлы форм (dfm в Delphi) имеют расширение xfm в Kylix. Если вы хотите использовать один и тот же файл формы для Linux и Windows, переименуйте dfm файлы в xfm. Иначе файлы dfm будут изменены средой Linux таким образом, что они не будут функционировать в среде Windows.

Примечание
Переименование файлов принесет результат лишь в том случае, если вы используете Delphi 6, которая поддерживает CLX.

Назад
Содержание
Вперед


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



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

Процесс создания пакета включает в себя:

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

Для создания пакета вам необходимо выполнить перечисленные ниже шаги:

1. Выберите в главном меню Kylix команду File/New.

2. В появившемся диалоговом окне выберите пиктограмму Package (Рисунок 20.4). Сгенерированный пакет будет отображен в редакторе пакета (Рисунок 20.5).



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



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

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

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

Как вы уже знаете, методы объявляются в секциях private, public и protected. При создании нового метода важно учитывать, как он будет использоваться в дальнейшем, сможет ли данный компонент быть предком для других компонентов, и, в зависимости от этого, расположить методы в нужных секциях. Табл. 19.2 поможет вам при выборе секций для методов компонента.



Создание приложения наподобие графического редактора



Создание приложения наподобие графического редактора

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

Приложение должно узнавать, какую кнопку нажал пользователь, и переходить в режим рисования данного объекта. Для этого вы можете сопоставить с каждым типом фигуры целое число, но в этом случае вам придется помнить, что обозначает каждое число. Если вы позволите пользователю создавать множество фигур, то это будет довольно трудно.

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

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

type
TDrawangTool = (dtLxne, dtRectangle, dtEllipse, dtRoundRect);

По соглашению, идентификатор типа (в нашем случае — это TDrawmgTool) начинается с буквы T, а группа перечисляемых констант начинается с двух-буквенного префикса (в нашем случае — букв dt).

Это объявление эквивалентно объявлению группы констант:

const
dtLine = 0;
dtRectangle = 1;
dtEllipse = 2;
dtRoundRect = 3;

Главное отличие объявления группы констант и перечисляемого типа заключается в том, что в случае объявления типа вы присваиваете константам не только значение, но и новый тип, который позволяет языку Object Pascal проверять соответствие типов и предотвращать возможные ошибки. Переменная, имеющая тип TDrawingTool, может иметь значение только из перечисленных (dtLine ... dtRoundRect). Любая попытка присвоения переменной других чисел (не входящих в диапазон от 0 до 3) вызовет ошибку компиляции.

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



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



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

Теперь вы можете создавать графические приложения практически любой сложности. Рассмотрим пример создания игры "Крестики-нолики" на поле 10x10 клеток. Мы не будем касаться вопросов создания искусственного интеллекта, предоставив это читателю. Рассмотрим лишь вопрос создания графической оболочки игры.

Итак, пусть программа работает в качестве игрового поля, на котором игроки смогут последовательно ставить крестики и нолики. Создадим форму-заготовку (Рисунок 13.10), на которую поместим две кнопки Button1 и Button2. Первая будет готовить игровое поле, а вторая позволит выйти из программы.

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



Создание SDI и MDIприложений



Создание SDI- и MDI-приложений

Kylix позволяет создавать приложения двух моделей пользовательского интерфейса:

одиночный интерфейс документа (Single document interface, SDI),
многооконный интерфейс документа (Multiple document interface, MDI).

В MDI-приложении в главном родительском окне может располагаться более чем одно дочернее окно или документ Такая форма наиболее часто используется в приложениях электронных таблиц или текстовых процессорах. В SDI-приложении, напротив, может содержаться только один документ или может быть активным всего одно окно. Для того чтобы приложение имело вид SDI, необходимо установить свойство FormStyle для формы приложения в fsNormal.

Примечание

По умолчанию свойство FormStyle у формы нового приложения устанавливается в fsNormal.

Для создания нового SDI-приложения выполните следующие шаги:

1. Выберите в главном меню Kylix пункт File/New. Появится диалоговое окно New Items (Рисунок 10.1).



Создание событий компонента



Создание событий компонента

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

Итак, событие — это любое действие, произошедшее благодаря операционной системе, действиям пользователя, работе программы.

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

Рассмотрим в качестве примера такое часто возникающее событие, как нажатие левой кнопки мыши OnClick. Данное событие, как и многие другие, имеет так называемые методы диспетчеризации событий (event-dispatching methods). Такие методы нужны для того, чтобы определять, создан ли код обработки данного события для данного компонента. Эти методы объявляются как защищенные (protected). Таким образом, для свойства OnClick определен метод диспетчеризации события Click (листинг 19.12).



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



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



Создание заготовки компонента



Создание заготовки компонента

Итак, вы выбрали класс-предок для вашего компонента. Теперь можно приступать к созданию модуля вашего компонента. Создание модуля (заготовки) для нового компонента можно выполнить путем вызова окна Kylix, которое называется экспертом компонентов (Component Expert). Дан-ное окно можно вызвать путем выбора в главном меню Kylix пункта Component/New Component. При этом появляется окнo, изображенное на Рисунок 19.1.

Рассмотрим данное окно. Итак, первое поле ввода Ancestor type предназначено для ввода класса — предка для нового компонента. Данное поле ввода содержит в выпадающем списке все зарегистрированные классы библиотеки CLX. Предположим, что мы будем создавать компонент, предком которого является кнопка TButton. Для этогo выберем в выпадающем списке класс TButton. Следующее поле Class Name предназначено для ввода имени нового класса. Пусть в нашем случае это будет новый класс TMyButton. Заметьте, что та умолчанию Kylix заполняет это поле именем класса-предка с добавлением порядкового номера (в нашем случае TButton1). Следующее поле Palette Page показывает, на какой вкладке палитры компонентов будет расположен новый компонент после его регистрации. Оставим в этом поле значение, предлагаемое Kylix по умолчанию Samples. Следующие два поля Unit file name и Search path заполняются средой Kylix самостоятельно, но разработчик может их изменить. Мы не будем этого делать в нашем примере. В результате окно эксперта компонентов должно быть заполнено так, как показано на Рисунок 19.2.



Средства для работы с базами данных



Средства для работы с базами данных

Среда Kylix предоставляет набор драйверов, необходимых для работы с базами данных, которые описаны выше. Кроме того, Kylix предоставляет программисту несколько компонентов, обеспечивающих работу с базами данных. Мы их кратко рассматривали в восьмой главе книги. Попробуем рассмотреть методику использования этих средств для создания простого приложения. Для этого воспользуемся файлом примера, который поставляется вместе со средой Kylix. Его можно найти в каталоге /kylix/demos/db/fishfact/.

Итак, запустим Kylix и откроем проект Fishfaet.dpr. Данный проект представляет собой простой просмотрщик содержимого базы данных. Как вы можете видеть, он написан практически без использования кода. Есть лишь одна команда, которая активизируется при показе главной формы приложения. В листинге 15.1 представлен код главного модуля Ffactlin этого приложения.



Статические методы



Статические методы

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

Перегрузка метода подразумевает, что класс или компонент может содержать несколько методов с одинаковым именем, но разными списками параметров.

Статический метод может быть описан так:

type TCortiponent = class
procedure MyProcedure; end;

Здесь метод MyProcedure является статическим. Мы опустили в данном примере название базового класса TObject после слова class. По умолчанию компилятор создает наследников класса TObject.

Назад
Содержание
Вперед


Структура пакета



Структура пакета

Вспомним все, что мы уже знаем о пакетах, и нам нетрудно будет понять, из чего состоит пакет.

Пакет состоит из: имени, раздела Requires и раздела Contains.

Package имя пакета;

Requires файлы пакетов, необходимые для работы данного пакета;

Contains файлы модулей, входящие в состав данного пакета;

end.

Имя пакета должно быть уникальным внутри проекта. Например, вы назвали пакет MyPack. При этом редактор пакета создает файл ресурсов с именем MyPack.dpk. При компиляции проекта создается еще два файла с именами MyPack.so и MyPack.dcp.

Файл MyPack.so является исполняемым файлом пакета (аналог so), а файл MyPack.dcp — двоичным файлом (аналог dcu),

Имя пакета необходимо для того, чтобы вызывать его из приложения или вписывать в раздел Requires другого пакета.

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

пакет не должен содержать ссылку на самого себя;
если пакет Package1 содержит в разделе Requires пакет Package2, то Package2 не должен содержать в своем разделе Requires пакет Package1;
если пакету Package1 требуется пакет Package2, а пакету Package2 — Package3, то пакет Package3 не должен содержать в разделе Requires пакет Package1.

Раздел Contains включает в себя файлы модулей (pas), входящих в проект.

Назад
Содержание
Вперед


Структура программы



Структура программы

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

Структура программы состоит из:

заголовка программы (program heading);
раздела uses (данный раздел может не входить в структуру программы);
блока описания и исполнения (block of declarations and statements).

Заголовок программы находится в самом ее начале и нужен для определения имени программы:

program Program1; / / здесь Program1 — имя программы

В стандартном Pascal заголовок программы может содержать параметры после имени программы:

program Program1(input, output);

Компилятор Kylix игнорирует данные параметры. Их можно указывать или не указывать, на работу программы это не повлияет.

Раздел uses содержит список программных модулей (units), которые используются данной программой:

uses

Forms,
Unit1 in 'Unit1.pas' {Form1};

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

Описательная часть обычно содержит (в строгом порядке):

объявления меток;
объявления констант;
описание типов;
объявления переменных;
описание процедур и функций.

Любой из перечисленных разделов описательной части в реальной программе может отсутствовать.

Назад
Содержание
Вперед


Структурированные операторы



Структурированные операторы

Напомним, что структурированные операторы — это операторы, которые изменяют ход выполнения команд программы.

К числу структурированных операторов можно отнести:

оператор перехода;
оператор условия;
оператор выбора;
операторы цикла.

Рассмотрим эти операторы.

Оператор перехода

Оператор перехода позволяет перейти от текущего места выполнения программы к другому месту, которое не является следующим по порядку. Данный оператор нарушает нормальный ход выполнения программы.

Переход осуществляется при помощи так называемых меток. Метка — это идентификатор или целое число без знака в диапазоне от 0 до 9999, которое находится перед каким-либо оператором программы и отделено от него двоеточием. Все используемые в программе метки должны быть предварительно объявлены в разделе объявления меток, начинающемся словом label.

Оператор перехода выглядит так:

goto метка;

Приведем фрагмент программы, в которой используется метка:

label 1; // Объявляем метку с именем 1
var
а:integer; begin
а:=10;
goto 1; // Переход на метку 1
a:=sqrt(a); // Этот оператор не будет выполняться никогда! 1:а:=а+а; // Оператор, помеченный меткой 1 end;

Примечание

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

Оператор условия

Оператор условия предназначен для выполнения или невыполнения каких-либо действий, зависящих от результата условия типа Boolean. Этот оператор применяют для разветвления выполнения программы. То есть, если данное условие истинно (и только в этом случае!), выполняется некоторая последовательность операторов, иначе — выполняются другие операторы. Вид оператора условия таков:

If условие then оператор1 else оператор2;

Оператор условия может быть записан и в упрощенной форме:

If условие then оператор;

Приведем примеры использования операторов условия:

If a>0 then b:=sqrt(a) else b:=a*2; // Оператор условия
If a=10 then b:=b+l; // Упрощенная форма

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

Примечание

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

Оператор выбора

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

Оператор выбора имеет следующий вид:

case селектор of Список1: Оператор1;
. . . СписокN: ОператорN; else
Оператор; end;

Таким образом, оператор выбора case состоит из селектора, списка вариантов и необязательной части else.

Выражение-селектор должно быть обязательно порядкового типа. Нельзя использовать в качестве селектора строковые типы.

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

цифрой, объявленной константой или другим выражением, которое компилятор может определить без выполнения программы. Переменные и вызовы функций не могут быть значением списка вариантов;
совместимым по типу с селектором;
уникальным. Ни одно из значений списка не может быть продублировано.

Приведем пример использования оператора case (листинг 3.4).



Структурные типы данных



Структурные типы данных

Структурные типы данных — это такие типы, которые состоят из данных других типов, в том числе из данных структурного типа. К числу таких данных относятся:

строки;
множества;
массивы;
записи;
файлы.

Рассмотрим эти типы данных.

Строки

В Object Pascal имеются строковые типы данных, которые перечислены в табл. 2.4.