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

         

Абстрактные методы



Абстрактные методы

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

procedure MyProcedure; virtual; abstract;

Примечание

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

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

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


Алфавит и словарь языка



Алфавит и словарь языка

В алфавит языка Object Pascal входят следующие символы:

набор символов ASCII, включающий буквы латинского алфавита от а до z и от А до z и пробел, а также цифры от о до 9;
специальные символы: # $ &amp ; ' ( ) * + , - . / : ; & lt; = > @ [ ] ^ { } ; дополнительные специальные символы, которые являются комбинациями специальных символов:

• (* и *) — ремарка, пояснение. Является альтернативой символам фигурных скобок { и };

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

• .. — применяется для определения диапазона значений;

• / / — ремарка, пояснение. Символы, находящиеся справа от данной комбинации символов, игнорируются компилятором и считаются пояснением;

• : = — символ присваивания;

• <= — меньше или равно;

• >= - больше или равно;

• <> — не равно;

Примечание

Символы ! , ", % , ?, \, _, ~ не являются специальными символами языка Object Pascal.

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

Все слова условно делятся на три большие группы:

зарезервированные слова (reserved words); директивы (directives); идентификаторы (identifiers).

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

and, array, as, asm, begin, case, class, const, constructor, destructor, dispinterface, div, do, downto, else, end, except, exports, file, finalization, finally, for, function, goto, if, implementation, in, inherited, initialization, inline, interface, is, label, library, mod, nil, not, object, of, or, out, packed, procedure, program, property, raise, record, repeat, resourcestring, set, shl, shr, string, then, threadvar, to, try, type, unit, until, uses, var, while, with, xor.

В дополнение к представленным выше зарезервированным словам в языке Object Pascal присутствуют еще слова private, protected, public, published и automated, которые являются зарезервированными в пределах области объявления типов. Во всех других случаях они рассматриваются как директивы.

Директивы — слова, которые имеют специальное значение в языке Object Pascal, но, в отличие от зарезервированных слов, программист может использовать данные слова в качестве идентификаторов. Компилятор языка всегда отличит такой идентификатор от директивы. Ниже представлен список директив Object Pascal:

absolute, abstract, assembler, automated, cdecl, contains, default, dispid, dynamic, export, external, far, forward, implements, index, message, name, near, nodefault, overload, override, package, pascal, private, protected, public, published, read, readonly, register, reintroduce, requires, resident, safecall, stdcall, stored, virtual, write, writeonly.

Идентификаторами называются слова,которые применяются для обозначения констант, переменных, полей,'"типов, свойств, процедур, функций, программ, модулей, библиотечек и пакетов. К таким словам относятся как предопределенные (например, Pi, Sin), так и создаваемые программистом.

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

длина идентификатора не должна превышать 255 символов;
идентификатор может содержать в себе буквы, цифры и знак подчеркивания ( _ );
идентификатор всегда должен начинаться с буквы или символа подчеркивания, но он не может содержать внутри себя пробелы;
идентификатор может состоять из строчных или прописных букв, а также из комбинации тех и других. Компилятор не чувствителен к регистру букв, поэтому приведенные далее идентификаторы рассматриваются им как одинаковые: MyLabel, MYLABEL, mylabel
между каждыми двумя идентификаторами обязательно должен присутствовать хотя бы один разделитель.
Назад
Содержание
Вперед




Архитектура баз данных



Архитектура баз данных

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

На рис, 15.2 представлена схема организации приложения базы данных.



Арифметические выражения



Арифметические выражения

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

В языке Object Pascal определены арифметические операции над двумя операндами, которые приведены в табл. 3.1.



Библиотека классов Kylix



Библиотека классов Kylix

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

CLX Kylix

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

Библиотека компонентов Kylix называется CLX (произносится как "клике"). Эта аббревиатура расшифровывается так: Библиотека компонентов для кросс-платформенной (межплатформенной) разработки (Component Library for Cross-platform development).

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

Библиотека CLX позволяет достаточно быстро разрабатывать эффективные программы для Интернета, настольные приложения, а также приложения баз данных (как локальных, так и сетевых).

CLX является развитием визуальной библиотеки компонентов Delphi (Visual Component Library, VCL) и позволяет довольно легко переносить приложения, написанные на Delphi, в среду Linux. О разработке межплатформенных приложений мы расскажем в заключительной, шестой части книги.

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


CLX как версия VCL



CLX как версия VCL

Kylix использует библиотеку компонентов Borland для создания кроссплат-форменных приложений (Borland Component Library for Cross Platform, CLX) вместо библиотеки визуальных компонентов Delphi (Visual Component Library, VCL). В VCL многие оконные компоненты позволяли достаточно просто работать с окнами Windows. В среде Linux CLX обеспечивает доступ к Qt widgets (образовано от двух слов: window — "окно" и gadget — "приспособление") при помощи специальной библиотеки Qt.

CLX очень похоже на VCL. Множество компонентов CLX имеют такие же имена, как и в VCL. Многие свойства также имеют одинаковые названия.

Компоненты CLX можно сгруппировать в части, представленные в табл. 21.1.



Диалоговое окно добавления новых полей



Рисунок 18.4. Диалоговое окно добавления новых полей Добавим определения полей, представленные в табл. 18.1.



Диалоговое окно сохранения файла таблицы



Рисунок 18.8. Диалоговое окно сохранения файла таблицы

Теперь определим поля явно на основе FieldDefs. Дважды щелкнем на компоненте Clients, в появившемся диалоговом окне щелчком правой кнопкой мыши откроем контекстное меню и выберем пункт добавления всех полей Add all fields (Рисунок 18.9).



Динамическая загрузка пакетов



Динамическая загрузка пакетов

Иногда требуется загружать необходимый пакет во время работы приложения. Для этой цели служит функция LoadPackage. Данная функция находится в модуле Kylix SysUtils. Описание этой функции имеет следующий вид:

function LoadPackage(const Name: string): HMODULE;

В качестве передаваемого функции параметра служит имя файла пакета типа string. Вызов данной функции очень прост:

LoadPackage('Имя файла пакета');

Для динамической выгрузки пакета применяется процедура UnloadPackage. Эта процедура также содержится в модуле SysUtils. Ее описание имеет вид:

procedure UnioadPackage(Module: HMODULE);

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

Среда Kylix поставляется с уже установленными пакетами компонентов, которые поддерживают основные компоненты, необходимые для создания стандартных приложений Linux. Наибольшее число стандартных компонентов Kylix содержится в уже знакомом нам пакете bplclx. Но данный пакет не содержит многие компоненты, например компоненты для работы с базами данных. Эти компоненты находятся в других пакетах Kylix (например, компоненты, предназначенные для работы с базами данных, находятся в пакете bpldataclx). Однако, несмотря на это, для работы с базами данных вам понадобятся оба пакета: bplclx и bpldataclx. В табл. 20.2 перечислены пакеты времени выполнения, поставляемые с Kylix, а также модули (units), входящие в данные пакеты.



Динамические методы



Динамические методы

Динамические методы похожи на виртуальные, они также могут быть перегружены. Основная разница между виртуальными и динамическими методами — в способе их вызова. Если для виртуальных методов строится таблица виртуальных методов, то каждому динамическому методу присваивается уникальное число-идентификатор, после чего строится таблица динамических методов (Dynamic Method Table), в которую заносится данное число, а также адрес метода. Еще одно отличие динамических методов от виртуальных заключается в том, что таблицы динамических методов содержат методы только одного компонента или класса (не включая его предков). Поэтому существенно экономится память, но замедляется время работы, т. к. для поиска адреса метода обычно приходится просматривать несколько таблиц динамических методов.

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

type
TComponent = class procedure MyProcedure; dynamic; end;

Методы-сообщения

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

type TComponent = class
procedure MyProcedure(Var A: TMessage); message wm_MessageWindows; end;

После служебного слова message ставится значение (в нашем случае wm_MessageWindows), которое определяет сообщение операционной системы, в ответ на которое будет вызван метод MyProcedure.

Виртуальные и динамические методы могут быть замещенными (overriden) или абстрактными (abstract).

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


Директивы компилятора



Директивы компилятора

Директивы компилятора — это указания компилятору на выполнение каких-либо действий. Для записи директив компилятора используют символы:

{$ директива} либо( * директива *)

Все директивы компилятора делятся на:

глобальные; локальные.

Глобальные директивы компилятора действуют на весь компилируемый файл.

Локальные директивы действуют от места их появления до появления отменяющей директивы.

Имеется три вида директив компилятора:

ключевые директивы;
директивы параметров;
директивы условной компиляции.

Первые два вида директив могут быть установлены по умолчанию. Для того чтобы настроить эти установки, вы можете воспользоваться вкладкой Compiler (Компилятор) диалогового окна Project Options (Настройки проекта), вызываемого из главного меню Куliх Project/Options (Проект/Настройки).

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


Для чего используются пакеты



Для чего используются пакеты

Как мы уже говорили выше, пакеты разработки предназначены для упрощения задачи распределения и установки компонентов, созданных разработчиком. Программирование с помощью пакетов разработки, по определению, имеет некоторое преимущество по сравнению с обычным программированием. Главное преимущество — сокращение размера кода. Например, все ваши приложения, включая среду программирования Kylix, могут одновременно использовать стандартные компоненты Kylix, расположенные в одном и том же пакете. Так как приложения не содержат отдельные копии библиотек компонентов, их размер намного меньше. Более того, время компиляции пакетов намного меньше, т. к. для конкретного приложения компилируется тот код, который ему необходим.

Для того чтобы приложение использовало пакеты, необходимо установить флажок Build with runtime package в диалоговом окне Project Options на странице Packages. Для открытия этого диалогового окна используйте пункт главного меню Kylix Project/Options. При такой компиляции приложения оно значительно сократится в размерах (примерно в 8—10 раз), но вам придется при распространении приложения передавать и все применяемые им пакеты.

Рассмотрим, когда нужно использовать пакеты, а когда — стандартные библиотеки разделяемых объектов Linux:

если вы хотите внедрить самостоятельно созданные компоненты в среду Kylix— создавайте пакеты. Помните, что пакеты Kylix поддерживаются только приложениями, созданными в Kylix или Borland Delphi 6;
если же вы хотите использовать созданную вами библиотеку различными приложениями, созданными в разных средах программирования, вам необходимо создать библиотеку разделяемых объектов (so).

С файлами пакетов связаны следующие расширения (табл. 20.1):



Другие методы работы с графикой в Куliх



Другие методы работы с графикой в Куliх

Вообще, вам не требуется наличие специальных компонентов для работы с графическими возможностями Kylix. Вы можете создавать, рисовать, сохранять и уничтожать графические объекты без отображения графики на экране. В качестве графического объекта могут выступать bmp-файлы, рисунки, пиктограммы и другие объекты, включая сжатые jpeg-файлы. В большинстве случаев приложение редко рисует напрямую на форме. Обычно сначала создается графический образ, а затем он отображается с помощью компонента CLX Image.

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

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

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

Работа с компонентом Image

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

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

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

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

2. Создать объект Bitmap и присвоить его свойству Picture.Graphic компонента Image.

В нижеприведенном примере (листинг 13.17) главная форма приложения Form1 содержит компонент типа TImage, который имеет имя (свойство Name) Image. Код размещен в обработчике события OnCreate формы Form1.



Файловая система Linux



Файловая система Linux


Понятие каталога в Linux и Windows несколько отличается. В Linux любой файл или устройство может быть "смонтировано" в произвольном месте файловой системы.

Примечание

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

В табл. П1 указаны основные каталоги Linux и их содержание.



Фигуры получаемые после вызова метода Chord



Рисунок 8.14. Фигуры, получаемые после вызова метода Chord

Настоящий метод можно применять и к объекту Clipboard. Вызов метода Clear для буфера обмена удалит все содержимое буфера.

Метод Click служит для вызова обработчика события OnClick данного компонента. Применяется для имитации нажатия левой кнопки мыши над объектом. Например, для вызова обработчика события OnClick кнопки Button1 можно проделать следующее;
Button1.Click;Метод ClientToScreen применяется для преобразования координат клиентской области компонента в координаты экрана. Началом координат клиентской области является левый верхний угол клиентской области компонента, Началом координат экрана является левый верхний угол экрана. Для обратного преобразования координат можно использовать метод ScreenToClient.Метод ContainsControl определяет, каким наследником (прямым или косвенным) является данный компонент по отношению к какому-либо оконному компоненту. Если этот компонент прямой наследник, то метод возвращает true, иначе — false.Метод ControlAtPos предназначен для оконных компонентов. Он применяется для того, чтобы определить, какой дочерний компонент находится в позиции с координатами, задаваемыми параметром Pos. В случае, если в заданной позиции нет ни одного дочернего компонента, данный метод возвращает в качестве результата значение nil. Второй параметр AllowDisabied определяет, нужно ли учитывать при вызове метода те компоненты, которые отключены (свойство Disabled = true). Метод CopyRect применяется для копирования прямоугольной части изображения с одной канвы на другую. Копирование осуществляется в том режиме, который определен свойством CopyMode.Метод Delete применяется по отношению к таким компонентам, как TList, TStringList, TStrings и TMenuItem. Данный метод вызывается при необходимости удаления какого-либо элемента из списка. В качестве параметра этого метода передается число, определяющее индекс удаляемого элемента. Нумерация элементов начинается с нуля. При удалении пункта меню, содержащего Подменю, удаляется и этот пункт, и его подменю.

Примечание

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

Метод Destroy применяется для вызова деструктора объекта. То есть вызов данного метода уничтожает данный объект и освобождает занимаемую память.

Примечание

Не рекомендуется вызывать непосредственно метод Destroy для уничтожения объекта Для этих целей лучше использовать метод Free, который проверяет, не была ли уже раньше освобождена занимаемая объектом память, после чего вызывает метод Destroy. Более того, метод Free генерирует меньший код для уничтожения форм используйте метод Release.

Метод DisableAlign применяется для временного запрета выравнивания дочерних компонентов оконного компонента. Обратное действие можно получить, воспользовавшись методом EnableAlign.
Метод Dormant используется для создания битовой матрицы в оперативной памяти для освобождения дескриптора матрицы. Использование данного метода позволяет сократить расходы ресурсов графической подсистемы Linux, которые используются приложением. Приведем пример (листинг 8.1).


Функции



Функции

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

A:=Sin(x);

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

Описание функции состоит из двух частей: заголовка и блока. Заголовок функции имеет следующий вид:

Function имя функции (параметры): тип результата;

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

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

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

Блок функции — это программный блок, состоящий, как минимум, из одного оператора присваивания:

Имя функции := результат выполнения функции;

или

Result := результат выполнения функции;

Данная операция присваивания (как первая, так и вторая) присваивает результирующее значение, которое вернет функция при возврате в основную программу. Например:

function WF: Integer;
begin
WF := 17; end;

и

function WF: Integer; begin
Result := 17; end;

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

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

В качестве примера рассмотрим описание функции нахождения максимального значения среди элементов одномерного массива (листинг 4.1). В качестве параметров в функцию будем передавать имя массива и количество его элементов.



Функции языка SQL



Функции языка SQL

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

Статистические функции — функции, предназначенные для статистической обработки данных. Наиболее часто используемые статистические функции перечислены в табл. 17.4.



Генерация исключений



Генерация исключений

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

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

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

В качестве примера создания собственного типа исключения рассмотрим следующее определение:

type
EMyException = class(Exception);

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

Чтобы вызвать созданное исключение, используйте команду raise.

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

type
EPasswordInvalid = class(Exception);

После определения нового типа исключения EPasswordInwalid вы можете вызвать это исключение в любом месте программы:

if Password <> CorrectPassword then
raise EPasswordInvalid.Create('Введен неправильный пароль');

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

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


Главное окно Kylix



Рисунок 6.1. Главное окно Kylix

Меню главного окна Kylix содержит стандартные для любой программы пункты. Меню — это самая верхняя строка главного окна Kylix (File, Edit, Search и т. д.). При помощи меню можно работать с файлами, проектами, формами, настраивать установки Kylix и выполнять многие другие действия. Меню главного окна позволяет устанавливать новые компоненты, а также вызывать другие инструменты разработки.

Некоторые пункты меню Kylix можно выполнить при помощи "горячих клавиш", например команду Open Project (Открыть проект) можно выполнить с помощью комбинации клавиш <CTRL>+<F11>.

Панели инструментов состоят из шести частей, расположенных под меню главного окна (панель Desktop находится справа от меню), и содержат кнопки для вызова некоторых команд меню главного окна. Панели подразделяются по функциональному назначению:

стандартная панель (Standard) содержит кнопки для работы с файлами проекта и позволяет создавать, сохранять и удалять файлы проекта;
панель просмотра (View) служит для работы с формами и текстом программ;
панель отладки (Debug) — для запуска и отладки приложения;
панель пользователя (Custom) предназначена для размещения кнопок, необходимых разработчику;
панель рабочий стол (Desktop) — позволяет сохранять и восстанавливать сведения о том, какие окна среды разработки открыты и где именно они расположены на экране. Такие сведения называются конфигурацией рабочего стола Kylix. Среда Kylix позволяет создавать и сохранять несколько конфигураций рабочего стола. Кроме того, можно выделить конфигурацию, которая будет автоматически загружаться в режиме отладки (debug desktop) и выгружаться при выходе из него. Для вышеперечисленных целей можно использовать кнопки: Save current desktop и Set debug desktop.

Вы можете сами указывать кнопки, которые будут располагаться на тех или иных панелях при помощи диалогового окна Настройки (Customize) (Рисунок 6.2). Это окно можно вызвать из контекстного меню, щелкнув правой кнопкой в области панели управления, либо воспользоваться пунктом меню Kylix View/Toolbars/Customize (Просмотр/Панели управления/Настройка).



Графический интерфейс пользователя



Графический интерфейс пользователя.



И регенерация исключений



и регенерация исключений

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



Иерархия классов CLX



Иерархия классов CLX

Как уже говорилось ранее, библиотека классов CLX содержит наиболее применяемые компоненты, из которых строится ваше приложение. Так как в языке Object Pascal объекты создаются путем наследования, библиотека классов CLX построена по иерархическому принципу. Рассмотрим иерархию компонентов CLX (Рисунок 7.1).

Приведенный Рисунок 7.1 требует некоторых пояснений. Отметим, что данный рисунок показывает полную иерархию классов Kylix. Компоненты CLX являются лишь составной частью этой иерархии и начинаются с класса TComponent, который является базовым для всех компонентов CLX.

Далее рассмотрим полную иерархию классов Kylix.

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

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


Информация о типе во времени выполнения



Информация о типе во времени выполнения

Информация о типе во время выполнения (Runtime Type Information, RTTI) — это способность среды Kylix предоставлять приложению информацию об объектах во время выполнения приложения. Так как все объекты Kylix являются потомками класса TObject, то все они содержат указатель на информацию о типе, а также методы для работы с этой информацией. В приведенной ниже табл. 5.1 рассмотрены некоторые из этих методов.



Инициализация потоков



Инициализация потоков

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

Приоритеты потоков

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

Для установки значения приоритета у потоков имеется свойство Priority. Данное свойство может принимать произвольное целое значение. Используется как бы шкала значений приоритетов от самого низкого до наивысшего. В Linux-приложениях свойство Priority всегда должно принимать целое числовое значение. Наибольшее числовое значение указывает на самый высокий приоритет выполнения данного потока. Диапазон значений, которые может принимать свойство Priority, зависит от значения свойства Policy. Это свойство доступно только для Linux-приложений и может принимать значения, перечисленные в табл. 14.1.



Инспектор объектов



Рисунок 6.5. Инспектор объектов

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

дающего списка. На Рисунок 6.5 активным компонентом является сама форма Form1.

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

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

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

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

Kylix позволяет по-разному группировать свойства. Например, вы можете сгруппировать свойства в инспекторе объектов по категориям, для чего нужно щелкнуть правой кнопкой мыши на свойствах и выбрать в выпадающем меню строку Arrange/by category (Группировать/по категории). При этом вкладка свойств (Properties) примет вид, представленный на Рисунок 6.6.

Вы можете просмотреть свойства той или иной категории, щелкнув на значке "+" слева от названия категории.

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

Обратите внимание, что свойства для разных объектов могут довольно сильно отличаться. В Kylix имеется возможность множественного выбора объектов на форме (для этого необходимо, удерживая нажатой клавишу <Shift>, последовательно щелкать кнопкой мыши на выбираемых объектах активной формы). При этом в окне инспектора объектов будут отображаться свойства, которые присутствуют одновременно у всех объектов. Изменение значения какого-либо из свойств приводит к изменению этого свойства одновременно у всех выбранных объектов.

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

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



Интегрированная среда разработки Kylix



Интегрированная среда разработки Kylix


Из данной главы вы:

узнаете, что представляет собой среда Kylix;
изучите основные окна среды;
научитесь настраивать среду.

Возможности Kylix

Средство для быстрой разработки приложений (Rapid Application Development, RAD) Borland Kylix было создано в 2001 году. Корпорация Borland предлагает два основных варианта Kylix:

Kylix Desktop Developer; Kylix Server Developer.

Рассмотрим возможности среды и отличия в возможностях данных вариантов (табл. 6.1).



Интерфейс IUnknown



Интерфейс IUnknown

По аналогии с наследованием классов, предком которых является базовый класс TObject, все интерфейсы являются прямыми или косвенными наследниками интерфейса IUnknown. Этот базовый интерфейс описан в модуле System следующим образом (листинг 10.3).



Интерфейсы



Интерфейсы

В этой главе мы рассмотрим, что такое интерфейс и где он применяется. Кроме того, вы узнаете, что такое графический интерфейс пользователя, и познакомитесь с методами создания SDI- и MDI- приложений.

Понятие интерфейса

Ключевое слово Kylix interface позволяет вам создавать и использовать интерфейсы в ваших приложениях. Интерфейсы расширяют модель наследования в CLX, позволяя одному классу принадлежать нескольким интерфейсам, а также нескольким классам — наследникам различных базовых классов — использовать один интерфейс. Интерфейсы полезны в тех случаях, когда наборы операций, таких как потоки, используются большим количеством объектов.

Таким образом, интерфейсы — это средства для обеспечения взаимодействия между разными объектами.

Интерфейсы похожи на классы, которые содержат в себе только абстрактные методы и четкие определения их функциональности. Определение метода интерфейса включает в себя параметры и типы параметров, возвращаемый тип, а также ожидаемое поведение. Методы интерфейса семантически или логически связаны с отражением цели интерфейса, Существует соглашение об интерфейсах, гласящее, что каждый интерфейс должен быть назван в соответствии с задачей, которую он предназначен выполнять. Например, интерфейс IMalloc — предназначен для распределения, освобождения и управления памятью. Аналогично, интерфейс IPersist может использоваться как базовый интерфейс для потомков, каждый из которых определяет специфичные прототипы методов для загрузки и сохранения состояния объектов в память, поток или в файл. В листинге 10.1 приведен простой пример объявления интерфейса.



Использование главного CLXпотока



Использование главного CLX-потока

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

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

Для использования главного CLX-потока создайте отдельную процедуру, которая выполняет необходимые действия. А затем вызовите эту процедуру из вашего потокового модуля (внутри метода Execute), применив синхронизацию. Например, как представлено в листинге 14.7.



Использование кисти



Использование кисти

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

Кисть имеет три свойства:

Color — цвет кисти;
Style — стиль кисти;
Bitmap — графический образ, который будет применяться для заполнения.

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

Рассмотрим эти свойства более подробно.

Цвет кисти

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

Цвет кисти используется как фоновый цвет текста и линий. В листинге 13.6 мы устанавливаем синий цвет кисти.



Использование ключевого слова implements



Использование ключевого слова implements

Многие классы CLX Kylix имеют в качестве некоторых своих свойств объекты. Кроме того, вы можете применять в качестве свойств класса интерфейсы. В том случае, когда свойство имеет тип интерфейса, вы можете использовать ключевое слово implements для определения методов, которые данный интерфейс передает объекту. По умолчанию ключевое слово implements передает все методы интерфейса. Тем не менее, вы можете самостоятельно определить список тех методов интерфейса, которые передаются объекту.

В листинге 10.5 представлен пример использования ключевого слова implements при создании объекта адаптера цвета, предназначенного для преобразования восьмибитного значения цвета RGB.



Использование компилятора командной строки



Использование компилятора командной строки

Если вы компилируете пакет из командной строки (без загруженной графической оболочки Linux), вы можете воспользоваться ключами, приведенными в табл. 20.5.



Использование методов объекта Canvas



Использование методов объекта Canvas

В этой части главы мы рассмотрим методы объекта Canvas, которые позволяют рисовать простые графические объекты.

Рисование линий и ломаных

Объект канвы позволяет чертить прямые линии и ломаные линии.

Прямая линия — это точки отрезка прямой, проходящей через две заданные точки.

Ломаная линия — это несколько прямых линий, которые соединены между собой конечными точками.

Для рисования прямой линии на канве вы можете использовать метод LineTo. Данный метод чертит линию из текущей позиции пера в точку, указанную вами, и делает конечную точку линии текущей позицией пера.

Приведенный ниже пример (листинг 13.9) чертит диагональные линии формы каждый раз, когда форма перерисовывается (обновляется). Для этого мы записываем код в обработчик события формы OnPaint.



Использование оператора as



Использование оператора as

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

procedurePaintObjects(P: TInterfacedObject) var
X: IPaint; begin
X := P as IPaint; {операторы} end;

В данном примере переменная Р имеет тип TInterfacedObject. Данная переменная может быть назначена переменной X, как ссылка на интерфейс IPaint. Для данного назначения компилятор генерирует код для вызова метода QueryIntetface, относящегося к интерфейсу IUnknown переменной P. Такое назначение возможно, даже если Р не поддерживает данный интерфейс. То есть компилятор не выдаст ошибку при таком назначении.

Во время выполнения вышеприведенного примера либо успешно происходит присваивание

Х:= Р as IPaint;

либо генерируется исключительная ситуация.

При использовании оператора as вы должны выполнять следующие требования:

при объявлении интерфейса явно объявляйте в качестве предка интерфейс Iunknown, т. к. только в этом случае вы сможете воспользоваться оператором as;
если вы используете оператор as для интерфейса, данный интерфейс должен иметь свой IID. Напомним, что для создания нового IID достаточно, находясь в редакторе кода, нажать комбинацию клавиш <Ctrl>+ +<Shift>+<G>.
Назад
Содержание
Вперед


Использование пакетов в приложениях



Использование пакетов в приложениях

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

Примечание
При разработке коммерческих приложений обратите внимание на то, чтобы пользователи получили правильную версию файлов пакетов (so).

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

1. Загрузите или создайте новый проект в среде Kylix.

2. В главном меню Kylix выберите Project/Options.

3. В открывшемся диалоговом окне выберите вкладку Packages (Рисунок 20.1).

4. Установите флажок Build with runtime package. Затем в открывшееся поле введите одно или несколько названий пакетов, которые вы хотите использовать в своем приложении. Вы можете воспользоваться также кнопкой Add для поиска необходимого пакета (Рисунок 20.2).



Использование пера



Использование пера

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

Перо имеет четыре собственных свойства, которые вы можете изменять:

Color — цвет пера; Width - ширина пера; Style — стиль пера; Mode — режим пера.

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

Рассмотрим последовательно использование этих четырех свойств.

Цвет пера

Вы можете устанавливать цвет пера по своему усмотрению с помощью свойства Color во время исполнения приложения. Для этого нужно лишь присвоить соответствующее значение цвета свойству Color пера Реn.

В листинге 13.3 мы устанавливаем красный цвет пера (значение clRed) по нажатии кнопки Button1.



Использование специальных директив



Использование специальных директив

Использование директивы компилятора $IFDEF является достаточно разумным путем для разделения кода Windows и Linux в вашем межплатформенном приложении. Тем не менее, использование директивы $IFDEF делает код приложения более трудным для понимания, поэтому старайтесь применять эту директиву как можно реже.

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

постарайтесь не применять директиву $IFDEF без крайней необходимости. Эта директива применяется в исходном файле только после компиляции;
не используйте директиву $IFDEF в файлах пакетов (dpk). Создателям компонентов нужно разработать два пакета для каждой из платформ без использования директивы $IFDEF;
применяйте директиву $IFDEF MSWINDOWS для проверки того, что приложение запущено в среде Windows. Используйте директиву $IFDEF WIN32 для определения различных Windows-платформ, например 32- и 64-битную версии Windows;
используйте директиву $IFDEF LINUX для проверки того, что приложение запущено в среде Linux;
избегайте в своих приложениях комбинации $IFNDEF/$ELSE. Пользуйтесь положительными тестами ($IFDEF/$ELSE) для лучшего понимания кода;
старайтесь использовать директивы $IFDEF MSWINDOWS и $IFDEF LINUX вместо комбинаций $IFDEF LINUX/$ELSE или $IFDEF MSWINDOWS/$ELSE.

Приведем пример неосторожного обращения с директивой $IFDEFF (листинг 21.4).



Класс TlnterfacedObject



Класс TlnterfacedObject

В CLX Kylix определен класс TInterfacedObject, который служит базовым классом для объектов интерфейса. Данный класс определен в модуле Kylix System (листинг 10.4).



Классы



Классы

Классы — это специальные типы данных языка Object Pascal, которые используются для описания объектов.

В состав класса входят поля, свойства и методы. Подробное их описание смотрите далее в этой главе.

Типичное определение нового класса выглядит следующим образом:

type Имя класса = class (Класс-предок)
{Список состава класса} private
{частные описания} protected {защищенные описания} public
{общедоступные описания} published
{опубликованные описания} end; где Имя класса — любое корректное имя (выбирается произвольно), Класс-предок — название класса, наследником которого является создаваемый класс, а Cписок состава класса содержит свойства и методы нового класса.

Для каждого элемента класса можно установить разную видимость. Для этого предназначены четыре ключевых слова: private, protected, public и published.

Видимость элемента класса определяет, где в программе и как будет виден данный элемент класса. Минимальная видимость элемента класса задается ключевым словом private, ключевое слово protected определяет средний уровень видимости. Наконец, public и published определяют наивысшую степень доступности.

Если перед описанием элемента класса не ставится ключевое слово, определяющее его степень видимости, то считается, что видимость элемента такая же, как и у предыдущего элемента класса.

Рассмотрим все четыре ключевых слова более подробно.

Private (частные) — определяет элементы класса, которые не видны вне модуля, в котором был объявлен класс, содержащий эти элементы. Другими словами, частные методы не могут быть вызваны из других модулей, а частные поля или свойства не могут быть считаны или изменены из других модулей.
Protected (защищенные) — определяет элементы класса, которые видны только внутри модуля, где определен класс, содержащий эти элементы, а также внутри других модулей, где присутствуют классы-потомки данного класса.
Public (общедоступные) — определяет элементы класса, которые видны в любом месте программы и из любых модулей, в которых виден сам класс.
Published (опубликованные) — определяет элементы класса, имеющие ту же видимость, что и public-элементы. Единственное отличие заключается в том, что опубликованные элементы порождают информацию о типе времени выполнения (RTTI). Благодаря данной информации. Kylix может осуществить проверку принадлежности элементов объекта к тому или иному классу. Kylix использует RTTI для доступа к значениям свойств при сохранении и загрузке файлов форм, чтобы иметь возможность отобразить свойства в инспекторе объектов и ассоциировать конкретные методы с конкретными свойствами. Все методы классов могут быть опубликованы, за исключением перегруженных (overload) методов, имеющих одинаковые имена.

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

В Kylix имеется понятие абстрактного класса.

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

Все объекты в Kylix созданы из абстрактного класса TObject. Класс TObject — предок многих простых классов. Этот класс объединяет в себе основные функции, которые свойственны всем объектам Kylix. TObject обеспечивает:

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

Итак, все классы в Kylix — потомки класса TObject.

Класс называется прямым потомком класса TObject, если он произведен непосредственно от класса TObject.

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

Примечание

В другой литературе можно встретить названия дочерний класс и класс-потомок. Дочерний класс — это прямой потомок, а класс-потомок — это косвенный потомок в терминологии данной книги.

Если при создании нового класса не указывается родительский класс, то считается, что родитель — класс TObject.

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


Классы и исключения



Классы и исключения

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

Работа с классами в Kylix

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

Класс — это абстрактное определение, инкапсулирующее понятия: свойства, методы, события и члены класса (например, локальные переменные, объявленные внутри класса).

Когда вы создаете экземпляр класса — он называется объектом. Термин "объект" часто в документации по Kylix используется более свободно, и, где различие между объектом и классом, не важно. Этот термин может обозначать класс, от которого данный объект произошел.

Часто программисту приходится создавать собственные классы для решения каких-либо задач, не предусмотренных стандартными классами CLX Kylix. Класс, который вы создаете, может иметь в качестве предка основной класс TObject или его потомок. Объявление нового класса содержит три допустимые секции, обеспечивающие доступ к полям и методам класса:

Тyре
TClassName = Class(TObject)
public
{public fields}
{public methods} protected
{protected fields}
{protected methods} private
{private fields}
{private methods} end;

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

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

В интегрированной среде разработчика Kylix начните новый проект и выполните команду меню Kylix File/New Unit (Файл/Новый модуль). Таким образом вы создадите новый модуль проекта, в котором будет объявлен новый класс.
Добавьте в секцию интерфейса нового модуля (interface) секцию uses и type.
В секции type напишите объявление нового класса. Здесь вам необходимо объявить все внутренние переменные класса, свойства, методы и события класса.

Например,

TMyClass = class; {Новый класс является потомком класса TObject} public
...
private
...
published{Класс является потомком TPersistent или его потомков}
. . .

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

Если вы хотите создать свой класс как потомка определенного класса, то вам необходимо указать это в объявлении класса:

TMyClass = class(TParentClass); {Новый класс является потомком класса TParentClass}

Например,

type TMyButton = class(TButton)
property Size: Integer;
procedure DoSomething;
end;

В этом примере мы определяем класс TMyButton, который является потомком класса TButton и будет иметь все свойства, события и методы своего родителя, а также дополнительное свойство Size целого типа и процедуру DoSomething.

Если ваша версия Kylix включает завершение класса, выполните следующие действия: поместите курсор внутри определения методов класса в секции интерфейса (interface) и нажмите комбинацию клавиш <Ctrl>+ +<Shift>+<C> или щелкните правой кнопкой мыши и в выпадающем меню выберите пункт Complete Class at Cursor (Завершить класс в пределах курсора). Kylix завершит объявление каждого незавершенного свойства и создаст необходимые пустые методы в секции реализации (implementation). Если же ваша версия Kylix не поддерживает завершение классов, вам придется делать все самостоятельно.

В приведенном ниже примере, если у вас есть завершение класса, Kylix добавит слова read и write, включая все поддерживаемые поля и методы:

type TMyButton = class (TButton)
property Size: Integer read FSize write SetSize;
procedure DoSomething;
private
FSize: Integer;
procedure SetSize(const Value: Integer);

Он также добавит следующий код в секцию реализации модуля:

{ TMyButton }
procedure TMyButton.DoSomething;
begin
end;
procedure TMyButton.SetSize(const Value: Integer);
begin
FSize := Value;
end;

Теперь заполните методы. Для примера, если вы хотите, чтобы кнопка издавала звуковой сигнал каждый раз при вызове метода DoSomething, добавьте команду Bеер между словами begin и end данного метода в разделе реализации:

{ TMyButton }
procedure TMyButton.DoSomething;
begin
Beep;
end;
procedure TMyButton.SetSize(const Value: Integer);
begin
FSize := Value;
DoSomething;
end;

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

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


Команды компоненты и другие элементы перенос которых невозможен



Команды, компоненты и другие элементы, перенос которых невозможен

Некоторые специфичные для Windows возможности не могут быть перенесены напрямую в среду Kylix. Такие элементы, как COM, ActiveX, OLE, BDE и ADO недоступны в среде Kylix. В табл. 21.2 перечислены элементы, отличающиеся в средах Linux и Windows, а также эквивалентные элементы Kylix, если таковые имеются.



это текст, который игнорируется компилятором



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

Имеется несколько способов записи комментария:

{ многострочныйкомментарий }
(* еще один
многострочный комментарий *)
/ / текст, расположенный справа от двойного слэша, также является/ / комментарием, только однострочнымКроме прямого предназначения, комментарии можно использовать для того, чтобы на время запретить выполнение некоторых операторов. Это очень полезно при отладке программ:
if tim>50 thenbegin timer1. Enabled: =false ;
/ / form2.showmodal; end;
Назад
Содержание
Вперед


Компиляция пакета



Компиляция пакета

Как откомпилировать пакет, мы с вами уже знаем, осталось только рассмотреть некоторые особенности компиляции.

Для начала рассмотрим директивы компилятора, которые могут включаться в файл пакета и файлы модулей пакета (табл. 20.4).



Компонент Clients в окне модуля данных



Рисунок 18.3. Компонент Clients в окне модуля данных

Создадим поля первым способом. Для этого дважды щелкнем на свойстве FieldDefs компоненту Clients. При этом откроется диалоговое окно добавления новых полей (Рисунок 18.4).



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



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

В этой главе мы рассмотрим основные компоненты, предназначенные для работы с базами данных. Компоненты расположены на вкладках Data Access, dbExpress и Data Controls.

Вкладка Date Access

На этой вкладке расположено всего три компонента, которые мы и рассмотрим.

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



Консольные приложения



Консольные приложения

Консольные приложения — это 32-разрядные приложения, которые могут работать без загруженного графического интерфейса Linux.

Для создания нового консольного приложения выберите пункт главного меню Kylix File/New и в появившемся диалоговом окне выберите пиктограмму Console Application (Рисунок 10.5).



Координация потоков



Координация потоков

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

Для начала определим, какие способы хранения локальных переменных потока нам предоставляет Kylix. Таких способов три.

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

Первый способ является самым простым, очевидным и самым эффективным. Доступ к локальным переменным, расположенным в стеке потока, самый быстрый.

Рассмотрим два других способа хранения локальных переменных потока. Второй способ проще и эффективнее чем третий (листинг 14.8).



Координаты точек задаваемых при вызове метода Arc



Рисунок 8.13. Координаты точек, задаваемых при вызове метода Arc

Метод Arc предназначен для рисования дуги окружности или эллипса. В качестве параметров метода передаются координаты четырех точек. Первые две точки (X1, Y1) и (X2, Y2) определяют прямоугольник, описывающий эллипс. Следующая точка (X3, Y3) определяет начальную точку
дуги, которая находится на пересечении прямой, проходящей через центр окружности или эллипса и точки (X3, Y3). Точка (X4, Y4) определяет конечную точку дуги, которая находится на пересечении прямой, проходящей через центр окружности или дуги и точки (Х4, Y4). Дуга рисуется против часовой стрелки, от начальной до конечной точки (Рисунок 8.13).
Для Рисунок 8.13 можно привести такой пример вызова метода Arc:
Image1,Canvas.Arc (0,0, 200,100, 200,10, 0,0);
Метод Assign применяется для копирования данных одного объекта в другой. Настоящий метод имеет отличие от простого присваивания: объект1 : = объект2, которое заключается в том, что при присваивании указатель на объект-назначение начинает указывать на объект-источник, а метод Assign создает новую копию объекта. После применения метода Assign получается два объекта с одинаковыми данными. Если объекты разного типа, то при вызове D.Assign(S) тип D должен "знать", как скопировать в него тип S (тип S может ничего не знать о преобразовании типов). Если метод Assign не может осуществить преобразование типов, он вызывает защищенный метод AssignTo, объявленный в классе TPersistent и перегруженный в классах, производных от него. Вызов имеет вид S.AssignTo(D). Если и метод AssignTo не может осуществить преобразование или если он не перегружен, вызывается AssignTo класса TPersistent и генерируется исключение. Метод Assign можно применять в разных ситуациях." Хорошей иллюстрацией применения данного метода может служить копирование изображения из буфера обмена в графический компонент TImage:
Image1.Picture.Assign (Clipboard);
и, наоборот, из компонента в буфер обмена
Clipboard.Assign (Image1.Picture);Метод BeginDrag вызывается, когда начинается процесс перетаскивания компонента. Данный метод применяется только в том случае, если свойство DragMode компонента имеет значение dmManual. В случае, когда свойство имеет значение dmAutomatic, перетаскивание компонента осуществляется автоматически. Вызов данного метода обычно вставляют в обработчик события OnMouseDown. Параметр Immediate метода BeginDrag показывает, сразу ли после нажатия кнопки мыши указатель курсора сменит вид на тот, который определен в свойстве DragCursor, и сразу ли начнется процесс перетаскивания. В случае, если параметр Immediate имеет значение false, перетаскивание начинается только после того, как пользователь щелкнет на компоненте и сместит указатель мыши на расстояние и пять пикселов. Это удобно для того, чтобы обрабатывать щелчок на компоненте, не начиная его немедленного перетаскивания.
Метод BringToFront применяется для переноса компонента наверх в так называемой Z-последовательности, Z-последовательность определяет порядок компонентов в свойстве Controls родительского оконного компонента (см. разд "Иерархия визуальных компонентов" данной главы). Тот компонент, который расположен в Z-последовательности выше других, в случае частичного или полного перекрытия компонентов будет виден. Таким образом, вызов метода BringToFront позволит переместить "наверх" компонент, скрытый под другими компонентами. Данный метод можно применять как к неоконным, так и к оконным компонентам. Однако все неоконные компоненты располагаются в Z-последовательности ниже оконных, поэтому в случае, если неоконный компонент перекрыт оконным, например кнопка перекрыта компонентом типа TMеmо, вызов метода BringToFront для кнопки ничего не даст.
Метод BrushCopy вызывается для копирования части изображения битовой матрицы на область вывода (канву) и замены указанного цвета в изображении на значение, установленное для кисти канвы.
Метод CanFocus применяется для определения, может ли данный компонент получать фокус. Данный метод возвращает значение true, если у компонента и всех его родителей свойства Visible и Enabled имеют значения true.Метод ChangeScale применяется для изменения масштаба компонента и всех его дочерних элементов При вызове настоящего метода масштабируются такие свойства компонента, как Tор, Left, Width, Height. Данный метод имеет два параметра, определяющих множитель и делитель масштаба: M и D. Приведем пример использования этого метода. Допустим, мы хотим увеличить размер формы Form1 в два раза, для этого зададим множитель масштаба, равный двум, а делитель - равный единице:
Form1.ChangeScale (2,1);
При выполнении данной строки размеры формы Form1 увеличатся в два раза.
Для уменьшения размеров, например в три раза, нужно задать значение M, равное eдинице, а значение D — равное трем:
Form1.ChangeScale (1,3);Метод Chord применяется для рисования замкнутой фигуры, границами которой являются дуга окружности или эллипса и хорда. Параметры данного метода аналогичны параметрам метода Arc. Результатом работы настоящего метода могут стать фигуры, изображенные на Рисунок 8.14.Метод ClassName применяется для определения имени типа компонента.Метод Clear предназначен для удаления всех элементов, входящих в данный список, или для удаления всего текста, входящего в рассматриваемый компонент. Примеры:
ListBox1.Clear;
Memo1. Clear;



Кроссплатформенные Интернетприложения



Кроссплатформенные Интернет-приложения

Интернет-приложения — это приложения типа клиент-сервер, которые используют стандартные Интернет-протоколы для обеспечения связи между клиентом и сервером. Так как ваши приложения используют стандартные Интернет-протоколы, вы можете легко сделать ваше приложение межплатформенным. Например, программа — сервер Интернет-приложения соединяется с клиентом при помощи специального программного обеспечения, называемого Web-сервером. Приложение для сервера пишется обычно под конкретную операционную систему, но может быть и межплатформенным. Клиентские приложения обычно кросс-платформенные.

Среда Kylix позволяет вам создать приложение Web-сервера для работы под Linux. Это такие приложения, как CGI- или Apache-серверы. В Windows вы можете создать другие типы Web-серверов, например Microsoft Server DLLs (ISAPI), Netscape Server DLLs (NSAPI) и приложения Windows CGI. Приложения CGI и некоторые приложения, использующие WebBroker, могут запускаться как в Windows, так и в Linux.

Перенос Интернет-приложений в среду Linux

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

Если ваше приложение использует ISAPI, NSAPI, Windows CGI или другие Web API, осуществить перенос будет довольно сложно. Вам придется просматривать приложение и преобразовывать все вызовы API в вызовы Apache или CGI. Кроме того, вам понадобится сделать все изменения, необходимые для переноса обычного Windows-приложения в Linux.

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

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


Линии тренда



Линии тренда



Линии тренда

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



Использование вариантной записи



Листинг 2.1. Использование вариантной записи

var Person = recordR>
FirstName, LastName: string[40];
BirthDate: TDate; case Citizen: Boolean of
True: (Birthplace: string [40]);
False: (Country: string [20];
EntryDate, ExitDate: TDate);

end;

Переменная Citizen в представленном выше листинге должна быть истинна, если человек является гражданином России, и ложна — в противном случае.

Файлы

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

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

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

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

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

Текстовые файлы состоят из строк текста переменной длины. Такие файлы объявляются с помощью слова Text File. Приведем пример объявления файловой переменной текстового файла:

var f: TextFile;

Типизированные файлы состоят из данных определенного (указанного) типа. Такие файлы объявляются с помощью конструкции file of typeData. Например:

var f1: file of real; f2: file of boolean

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

var f: file;

Кроме доступа к файлу с помощью файловых переменных, многие компоненты Kylix предоставляют свои собственные методы работы с файлами, такие как LoadFromFile или SaveToFile. О них мы расскажем далее, когда будем описывать свойства и методы основных компонентов Kylix.

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


Пример использований указателей



Листинг 2.2. Пример использований указателей

var
X, Y: Integer; / / объявление целых переменных X и Y Р: ^Integer; / / Р - указатель целого типа begin
X := 17; / / присваиваем значение переменной X Р := @Х ; / / присваиваем адрес переменной X указателю Р Y := Р^; / / разыменовываем указатель Р и присваиваем результат / / переменной Y end;

Итак, для назначения указателю адреса объекта (в нашем случае — переменной х) мы воспользовались операцией @. Символ @, поставленный перед объектом, определяет адрес этого объекта в оперативной памяти.

Символ ^ имеет два назначения. Во-первых, если он стоит перед идентификатором типа, он обозначает тип данного указателя. Если же он стоит после переменной типа указателя, как в последней строке нашего примера, то он разыменовывает указатель. Операция разыменовывания указателя применяется для получения доступа к значению адресуемых данных.

После выполнения программы, представленной на листинге 2.2, обе переменные х и Y будут иметь одинаковое значение — 17.

Процедурные типы данных

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

Описание данных процедурного типа похоже на описание процедуры или функции. На листинге 2.3 представлено описание процедурных указателей.



Описание процедурных указателей



Листинг 2.3. Описание процедурных указателей

type
TIntegerFunction = function: Integer; TProcedure = procedure; TStrProc = procedure(const S: string);
TMathFunc = function (X: Double): Double; var
F: TIntegerFunction; / / F - это функция без параметров, которая
/ / возвращает целое число
Proc: TProcedure; / / Proc - это процедура без параметров SP: TStrProc; / / SP - это процедура, у которой есть один
/ / строковый параметр М: TMathFunc; / / М - это функция с действительным параметром
/ / данная функция возвращает действительное значение

Для описания данных процедурного типа используется конструкция of object. Например:

type

TMethod = procedure of object;

TNotifyEvent = procedure(Sender: TObject) of object;

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

Вариантные типы данных

Иногда возникает необходимость работы с типами данных, которые не могут быть определены во время разработки приложения или тип которых изменяется. Для этого в язык Object Pascal были введены так называемые вариантные типы данных. Переменные вариантного типа могут содержать данные разных типов, кроме структурных типов данных, указателей и типа Int64. Для объявления переменной вариантного типа используется слово variant. Все типы являются совместимыми с типом variant, и компилятор делает необходимые преобразования типов автоматически.

Пример, приведенный на листинге 2.4, показывает применение вариантного типа данных.



Использование данных вариантного типа



Листинг 2.4. Использование данных вариантного типа

var
V1, V2, V3, V4, V5: Variant; I: Integer;
D: Double; S: string; begin V1 := 1; / / целое значение
V2 := 1234.5678; / / действительное значение
V3 := 'Это строка!'; / / строковое значение
V4 := '1000'; / / строковое значение
V5 := V1 + V2 + V4; / / действительное значение, равное 2235.5678 I := V1; / / I=1 (целое значение) D := V2; / / D = 1234.5678 (действительное значение)
S := V3; / / S = 'Это строка!' (строковое значение)
I := V4; / / I = 1000 (целое значение)
S := V5; / / S = '2235.5678' (строковое значение) end;

Переменная вариантного типа может принимать два дополнительных значения:

Unassigned — не определено;
Null — значение неизвестного типа или значение потеряно.
Назад
Содержание


Примеры использования арифметических операций



Листинг 3.1. Примеры использования арифметических операций

var
а, b, с, d: Integer; // Объявляем четыре целочисленных переменных
begin
a:=7; b:=5; c:=-10; // Присваиваем трем из них начальные значения
d:=a+b; // Результатом будет число 12
d:=-d; // Результатом будет число -12
d:=d+c; // Результатом будет число -22
d:=d div с; // Результатом будет число 2
d:=a mod b; // Результатом будет число 2 end;

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



Примеры использования побитовых операций



Листинг 3.2. Примеры использования побитовых операций

var
a,b,с: Integer; // Объявляем три целочисленные переменные begin
а =175; b:=77; // Двум из них присваиваем начальные значения
с =not a; // Результатом будет число -176
с =а or b; // Результатом будет число 239
с =а and b; // Результатом будет число 13
с =а хоr b; // Результатом будет число 226
с =а shl 1; // Результатом будет число 350
с =b shr 1; // Результатом будет число 38 end;

Число 175 в двоичной системе выглядит так: 10101111. А число 77 так: 1001101. Операции производятся поразрядно справа налево, затем результат переводится в десятичную систему счисления.

Сдвиг на один разряд влево равносилен умножению числа на 2. Сдвиг на один разряд вправо равносилен делению числа нацело на 2 с отбрасыванием дробной части.

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

Abs (x) — абсолютное значение х. Вызов данной функции позволяет отбросить знак минус у числа, если он есть;
Cos (х) — косинус угла х. Угол задается в радианах;Ехр (х) — возведение числа е в степень х; Ln(x) — натуральный логарифм числа х;
Odd(x) — проверяет число х на четность. Если оно четное, то возвращает значение True, иначе — False;
Sin (х) — синус угла х. Угол задается в радианах;
Sqr (х) — возведение числа х в квадрат;
Sqrt (х) — извлечение квадратного корня из числа х.

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

Приведем пример вычисления выражения, в котором присутствуют арифметические функции:

a:=sqr( (152+b) /2*cos (3.14+b) +sqrt (23)) ;

Логические выражения

Логические выражения это выражения, в которых содержатся:

логические константы True и False;
логические переменные и константы типа Boolean; операции отношения;логические операции; скобки.

В результате выполнения логической операции получается логическое значение True или False. Логические операции, доступные в языке Object Pascal, представлены в табл. 3.5.