Delphi 6 программирование

         

Области



16.4.4.2. Области

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

uses

For.gif" >




СТРАНИЦА ADDITIONAL



4.2. СТРАНИЦА ADDITIONAL

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

BitBtn - командная кнопка с надписью и пиктограммой.

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

MaskEdit - специальный текстовый редактор. Способен фильтровать вводимый текст, например, для правильного ввода даты.

StringGrid - таблица строк. Этот компонент обладает мощными возможностями для представления текстовой информации в табличном виде.

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

Image - рисунок. Этот компонент предназначен для отображения рисунков, в том числе пиктограмм и метафайлов.

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

Bevel - кромка. Служит для выделения отдельных частей окна трехмерными рамками или полосами.



ScrollBox - панель с полосами прокрутки. В отличие от компонента Panel автоматически вставляет полосы прокрутки, если размещенные в нем компоненты отсекаются его границами.

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

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

StaticText - статический текст. Отличается от стандартного компонента Label наличием собственного windows-окна, что позволяет обводить текст рамкой или выделять его в виде “вдавленной” части формы. Впервые введен в версии 3.

ControiBar - полоса управления. Служит контейнером для “причаливаемых” компонентов в технологии Drag&Dock. Впервые введен в версии 4.

ApplicationEvents - получатель события. Если этот компонент помещен на форму, он будет получать все предназначенные для программы сообщения Windows (без этого компонента сообщения принимает глобальный объект-программа Application). Впервые введен в версии 5.

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

LabeledEdit - комбинация однострочного редактора и метки. Впервые введен в версии 6.

ColorBox - специальный вариант ComboBox для выбора одного из системных цветов. Впервые введен в версии 6.

Chart - диаграмма. Этот компонент облегчает создание специальных панелей для графического представления данных. Впервые введен в версии 3.

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

ActionMainMenu.gif" >




Страница Win32 содержит интерфейсные элементы



4.3. СТРАНИЦА WIN32

Страница Win32 содержит интерфейсные элементы для 32-разрядных операционных систем Windows 95/98/NT/2000 (в версии 2 эта страница называется win 9 5). Этой страницы нет в версии 1.

TabControl - набор закладок. Каждая закладка представляет собой прямоугольное поле с надписью и/или рисунком. Выбор той или иной закладки распознается программой и используется для управления содержимым окна компонента.

PageControl - набор панелей с закладками. Каждая панель может содержать свой набор интерфейсных элементов и выбирается щелчком по связанной с ней закладке.

ImageList - набор рисунков. Представляет собой хранилище для нескольких рисунков одинакового размера.

RichEdit - многострочный редактор форматированного текста. В отличие от компонента Memo страницы Standard текст в компоненте RichEdit подчиняется правилам Расширенного Текстового Формата (RTF - Rich Text For.gif" >



СТРАНИЦА SYSTEM



4.4. СТРАНИЦА SYSTEM

На этой странице представлены компоненты, которые имеют различное функциональное назначение, в том числе компоненты, поддерживающие стандартные для Windows технологии межпрограммного обмена данными OLE (Object Linking and Embedding -связывание и внедрение объектов) и DDE (Dynamic Data Exchange -динамический обмен данными). Технология DDE в современных программах полностью вытеснена гораздо более мощной технологией СОМ, и поэтому соответствующие им компоненты в книге не рассматриваются.

Timer - таймер. Этот компонент служит для отсчета интервалов реального времени.

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

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

OleContainer - OLE-контейнер. Служит приемником связываемых или внедряемых объектов.

Компоненты этой страницы имеются во всех предыдущих версиях Delphi.



СТРАНИЦА DIALOGS



4.5. СТРАНИЦА DIALOGS

Компоненты страницы Dialogs реализуют стандартные для Windows диалоговые окна.

OpenDialog - открыть. Реализует стандартное диалоговое окно “Открыть файл”.

SaveDialog - сохранить. Реализует стандартное диалоговое окно “Сохранить файл”.

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

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

FontDialog - шрифт. Реализует стандартное диалоговое окно выбора шрифта.

ColorDialog - цвет. Реализует стандартное диалоговое окно выбора цвета.

PrintDialog - печать. Реализует стандартное диалоговое окно выбора параметров для печати документа.

PrinterSetupDialog - настройка принтера. Реализует стандартное диалоговое окно для настройки печатающего устройства.

FindDialog - поиск. Реализует стандартное диалоговое окно поиска текстового фрагмента.

ReplaceDialog - замена. Реализует стандартное диалоговое окно поиска и замены текстового фрагмента.

Компоненты OpenPictureDialog И SavePictureDialog введены в версии 3, остальные имеются в предыдущих версиях. Разумеется, интерфейс окон для Windows 16 (версия 1) отличается от интерфейса Windows 32.



Большинство компонентов этой страницы введены



4.6. СТРАНИЦА WIN31

Большинство компонентов этой страницы введены для совместимости с версией 1. В современных программах вместо них рекомендуется использовать соответствующие компоненты страницы Win32.

TabSet - набор закладок. В приложениях для Windows 32 вместо него рекомендуется использовать компонент TabControl.

OutLine - дерево выбора. В приложениях для Windows 32 вместо него рекомендуется использовать компонент Treeview.

TabbedNotebook - набор панелей с закладками. В приложениях для Windows 32 вместо него рекомендуется использовать компонент PageControl.

Notebook - набор панелей без закладок. В приложениях для Windows 32 вместо него рекомендуется использовать компонент Page-Control.

Header - управляющий заголовок. В приложениях для Windows 32 вместо него рекомендуется использовать компонент Header-Control.

FileListBox - панель выбора файлов.

DirectorybistBox - панель выбора каталогов.

DiriveComboBox - панель выбора дисков.

FilterComboBox - панель фильтрации файлов.

Компоненты FileListBox, DirectoryListBox, DriveComboBox и FilterComboBox впервые появились в версии 3. Их функции реализованы элементами стандартных окон OpenDialog и SaveDialog, которые и рекомендуется использовать в Windows 32.



Назад


СТРАНИЦА SAMPLES



4.7. СТРАНИЦА SAMPLES

Эта страница содержит компоненты разного назначения.

Gauge - индикатор состояния. Подобен компоненту ProgressBar (страница Win32), но отличается большим разнообразием форм.

СolorGrid - таблица цветов. Этот компонент предназначен для выбора основного и фонового цветов из 16-цветной палитры.

SpinButton - двойная кнопка. Дает удобное средство управления некоторой числовой величиной.

SpinEdit - редактор числа. Обеспечивает отображение и редактирование целого числа с возможностью его изменения с помощью двойной кнопки.

DirectoryOutLine - список каталогов. Отображает в иерархическом виде структуру каталогов дискового накопителя.

Calendar - календарь. Предназначен для показа и выбора дня в месяце.



КОМПОНЕНТЫ ДЛЯ РАБОТЫ С БАЗАМИ ДАННЫХ



4.8. КОМПОНЕНТЫ ДЛЯ РАБОТЫ С БАЗАМИ ДАННЫХ

В Delphi развиты средства построения приложений, рассчитанных на работу с электронными архивами (базами данных). Причем Delphi 6 предоставляет программисту возможность выбора способа доступа к данным: это может быть стандартный для ранних версий Delphi доступ с помощью машины баз данных BDE (Borland Data

base Engine), усиленно развиваемая Microsoft технология ADO ActiveX Data Objects), прямое управление сервером InterBase с помощью технологии IBExpress, наконец, технология dbExpress для непосредственного обращения к промышленным серверам MySQL, DB2, Oracle и некоторым другим.



КОМПОНЕНТЫ ДЛЯ ДОСТУПА К ИНТЕРНЕТ



4.9. КОМПОНЕНТЫ ДЛЯ ДОСТУПА К ИНТЕРНЕТ

4.9.1. Страница Internet

Компоненты этой страницы обеспечивают средства связи программы с глобальной компьютерной сетью Интернет. Эта сеть позволяет установить соединение между двумя удаленными компьютерами, один из которых (клиент) получает информацию, а другой (сервер) передает ее. Оба компьютера должны следовать протоколу TCP/IP (Transport Control Protocol/Internet Protocol - транспортный управляющий протокол/Интернет протокол), обеспечивающему логическую независимость связи от аппаратных средств компьютеров. Частью Интернет является всемирная паутина World Wide Web

(WWW), использующая межкомпьютерный обмен так называемыми HTML-страницами (HyperText Markup Language - язык разметки гипертекста) на основе HTTP-протокола (HyperText Transfer Protocol - протокол передачи гипертекста). WWW реализует удобные средства для неформального общения мирового сообщества на са-мые разные темы. В то же время возможности Интернет не ограниваются только WWW, т. к. по глобальной сети можно передавать гктронную почту, разнообразные файлы, устраивать телеконференции и даже осуществлять телефонные переговоры. В последнее время усиленно развиваются так называемые интранет-сети, в ко-торых технология Интернет используется для передачи служебной и ювой информации в рамках одного или нескольких предприятий. для создания именно таких сетей и предназначены в основном компоненты этой страницы.



ДОСТУП К СЕРВЕРАМ АВТОМАТИЗАЦИИ



4.10. ДОСТУП К СЕРВЕРАМ АВТОМАТИЗАЦИИ

Многочисленные компоненты страницы servers обеспечивают удобный программный доступ к популярным СОМ-серверам, входящим в Microsoft Office'97 и доступным на любом компьютере, на котором полностью или частично установлен комплект этих программ.

Примечание
Примечание

Поскольку в базовом языке MS Qffice'97 - Visual Basic for Application - произошли значительные изменения по сравнению с версией, использовавшейся в MS Office'95 компоненты этой страницы будут нормально работать только с MS Office'97

Использование этих компонентов осложняется двумя обстоятельствами. Во-первых, на вашей машине или в доступном вам сетевом окружении должны быть установлены соответствующие серверы (Word, Excel, PowerPoint и т. д.). Во-вторых, все эти компоненты представляют собой так называемые контроллеры Автоматизации, т. е. существеннейшим образом используют многочисленные свойства, методы и события своих серверов. Поскольку взаимодействие с такого рода серверами требует знания интерфейса сервера (см. гл. 15), каждый компонент, с одной стороны, непривычно одинаков, показывая в окне Инспектора объектов лишь минимум свойств, общих для всех серверов Автоматизации, а с другой - разительно отличается от остальных своим уникальным набором свойств, методов и событий. Рассмотрение этих наборов далеко выходит за рамки любой книги по Delphi, кроме того, работа с СОМ и Объектами Автоматизации также не является целью этого диска.

Эти компоненты не могут использоваться в межплатформенных приложениях (Linux не поддерживает СОМ).



Фокус ввода



17.6.4. Фокус ввода

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

Компонент с фокусом ввода имеет значение True в своем свойстве property Focused: Boolean;

Если элемент запрещен к выбору или невидим, его свойство

property CanFocus: Boolean;

имеет значение False.

Фокус ввода передается элементу после щелчка на нем мышью или в порядке выбора его клавишей Tab. Чтобы элемент можно было выбирать этой клавишей, следует установить в его свойство

property TabStop: Boolean;

значение True. Порядок выбора элемента определяется свойством

property TabOrder: Integer;

Delphi следит за уникальностью и непрерывностью значений этого свойства у всех помещенных на форму не запрещенных и видимых в данный момент компонентов. С помощью метода procedure GetTabOrderList(List: TList) ; можно получить список всех дочерних элементов, выбираемых клавишей Tab.



Класс TCanvas



16.4.4. Класс TCanvas

Этот класс создает “канву”, на которой можно рисовать чертежными инструментами - пером, кистью и шрифтом. Объекты класса ЕСаnvas автоматически создаются для всех видимых компонентов, которые должны уметь нарисовать себя. Они инкапсулируют объекты Font, pen, Brush, а также многочисленные методы, использующие эти объекты.

Свойства класса:

property Brush: TBrush; property ClipRect: TRect; Объект-кисть Определяет текущие размеры области, нуждающейся в прорисовке
property CopyMode: TCopyMode; Устанавливает способ взаимодействия растрового изображения с цветом фона
property Font: TFont; Объект-шрифт
property Handle: Integer; Дескриптор канвы. Используется при непосредственном обращении к API-функциям Windows
property LockCount: In

tegers;

Счетчик блокировок канвы. Увеличивается на единицу при каждом обращении к методу Lock и уменьшается на единицу при обращении к Unlock
property Pen: TPen; Объект-перо
property PenPos:TPoint; Определяет текущее положение пера в пикселях относительно левого верхнего угла канвы
property Pixels[X,Y:Integer]: TColor; Массив пикселей канвы

Свойство copyMode используется при копировании части одной канвы (источника) в другую (приемник) методом copyRect и может иметь одно из следующих значений:

cmBlackness Заполняет область рисования черным цветом
cmDestInvert Заполняет область рисования инверсным цветом фона
cmMergeCopy Объединяет изображение на канве и копируемое изображение операцией and
cmMergePaint Объединяет изображение на канве и копируемое изображение операцией OR
cmNotSrcCopy Копирует на канву инверсное изображение источника
cmNotSrcErase Объединяет изображение на канве и копируемое изображение операцией OR и инвертирует полученное
cmPatCopy Копирует образец источника
cmPatInvert Комбинирует образец источника с изображением на канве с

помощью операции XOR

cmPatPaint Комбинирует изображение источника с его образцом с помощью операции OR, затем полученное объединяется с изображением на канве также с помощью OR
cmSrcAnd Объединяет изображение источника и канвы с помощью операции AND
cmSrcCopy Копирует изображение источника на канву
cmSrcErase Инвертирует изображение на канве и объединяет результат с изображением источника операцией AND
cmSrcInvert Объединяет изображение на канве и источник операцией XOR
cmSrcPaint Объединяет изображение на канве и источник операцией OR
cmWhitness Заполняет область рисования белым цветом

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

Методы класса:

procedure Arc(X1, Y1, X2, Y2, ХЗ, Y3, Х4, Y4: Integer); Чертит дугу эллипса в охватывающем прямоугольнике (Xl,Yl)-(X2,Y2). Начало дуги лежит на пересечении эллипса и луча, проведенного из его центра в точку (ХЗ, Y3), а конец - на пересечении с лучом из центра в точку (Х4, Y4). Дуга чертится против часовой стрелки (см. Рисунок 16.4, а)
procedure BrushCopy

(const Dest: TRect;

Bitmap: TBitmap;

const Source: TRect;

Color: TColor);

Копирует часть изображения Source на участок канвы Dest. Color указывает цвет в Dest, который должен заменяться на цвет кисти канвы. Метод введен для совместимости с ранними версиями Delphi. Вместо него следует пользоваться классом Т Image List
procedure Chord(XI,

Yl, X2, Y2, X3, Y3,

Чертит сегмент эллипса в охватывающем прямоуголь нике (XI, У1) - (X2, Y2). Начало дуги сегмента лежит на пересечении эллипса и луча, проведенного из его центра в точку (X3, Y3), а конец - на пересечении с лучом из центра в точку (X4, Y4). Дуга сегмента чертится против часовой стрелки, а начальная и конечная точки дуги соединяются прямой (см. Рисунок 16.4, б)
procedure CopyRect (Dest: TRect; Canvas: TCanvas;Source: TRect) ; Копирует изображение Source канвы Canvas в участок Dest текущей канвы. При этом разнообразные специальные эффекты достигаются с помощью свойства CopyMode
procedure Draw(X, Y:Integer; Graphic:TGraphic) ; Осуществляет прорисовку графического объекта Graphic так, чтобы левый верхний угол объекта расположился в точке (X, Y)
procedure DrawFocusRect (const Rect:TRect) ; Прорисовывает прямоугольник с помощью операции XOR, поэтому повторная прорисовка уничтожает ранее вычерченный прямоугольник. Используется в основном для прорисовки нестандартных интерфейсных элементов при получении ими фокуса ввода и при потере его
procedure Ellipse(XI, Yl, X2,

Y2: Integers;

Чертит эллипс в охватывающем прямоугольнике (XI, Yl) - (X2, Y2). Заполняет внутреннее пространство эллипса текущей кистью
procedure FillRect(const Rect: TRect); Заполняет текущей кистью прямоугольную область Rect, включая ее левую и верхнюю границы, но не затрагивая правую и нижнюю границы
procedure Flood-

Fill(X, Y: Integer;

Color: TColor; Fill Style: TFillStyle);

Производит заливку канвы текущей кистью. Залив

ка начинается с точки (X, Y) и распространяется вовсе стороны от нее. Если FillStyle=fsSurface, заливка распространяется на все соседние точки с цветом Color. Если FillStyle=fsBorder, наоборот, заливка прекращается на точках с этим цветом

procedure FrameRect(const Rect: TRect); Очерчивает границы прямоугольника Rect текущей кистью толщиной в 1 пиксель без заполнения внутренней части прямоугольника
procedure LineTo(X,

Y: Integer);

Чертит линию от текущего положения пера до точки

(X,Y)

procedure Lock; Блокирует канву в многопоточных приложениях для предотвращения использования канвы в других по токах команд
procedure MoveTo(X,Y: Integer); Перемещает перо в положение (X, Y) без вычерчивания линий
procedure Pie(XI,

Yl, X2, Y2, X3, Y3,

X4, Y4: Longint);

Рисует сектор эллипса в охватывающем прямоугольнике (XI, Yl) - (X2, Y2). Начало дуги лежит на пересечении эллипса и луча, проведенного из его центра в точку (X3, Y3), а конец - на пересечении случом из центра в точку (X4, Y4). Дуга чертится против часовой стрелки. Начало и конец дуги соединяются прямыми с ее центром (см. Рисунок 16.4, в)
procedure Polygon.

(Points: array of TPoint) ;

Вычерчивает пером многоугольник по точкам, заданным в массиве Points. Конечная точка соединяется с начальной и многоугольник заполняется кистью. Без заполнения используйте - Polyline
procedure Polyline

(Points: array of

TPoint);

Вычерчивает пером ломаную прямую по точкам, заданным в массиве Points
procedure Rectan

gle(XI, Yl, X2, Y2:

Integer);

Вычерчивает и заполняет прямоугольник (XI, Yl) -S(X2, Y2). Для вычерчивания без заполнения используйте FrameRect или Polyline
procedure Refresh; Устанавливает в канве умалчиваемые шрифт и кисть
procedure RoundRect(Xl, Yl, X2,Y2, X3, Y3: Inte ger) ; Вычерчивает и заполняет прямоугольник (XI,Yl)- (X2, Y2) со скругленными углами. Прямоугольник (XI, Yl) - (X3, Y3) определяет дугу эллипса для округления углов (см. Рисунок 16.4, г)
procedure Stretch Draw (const Rect:TRect; Graphic:

TGraphic );

Вычерчивает и при необходимости масштабирует графический объект Graphic так, чтобы он полностью занял прямоугольник Rect
function TextExtent

(const Text:String): TSize;

Возвращает ширину и высоту прямоугольника, охватывающего текстовую строку Text
function TextHeight

(const Text: String): Integer;

Возвращает высоту прямоугольника, охватывающего текстовую строку Text
procedure TextOut(X,

Y: Integer; const Text: String) ;

Выводит текстовую строку Text так, чтобы левый

верхний угол прямоугольника, охватывающего текст, располагался в точке (X, Y)

procedure TextRect(Rect: TRect; X, Y:

Integer; const Text:

String) ;

Выводит текстовую строку Text так, чтобы левый верхний угол прямоугольника, охватывающего текст, располагался в точке (х, Y). Если при этом какая-либо часть надписи выходит из границ прямоугольника Rect, она отсекается и не будет видна
function TextWidth

(const Text:String): Integer;

Возвращает ширину прямоугольника, охватывающего текстовую строку Text
function TryLock:

Boolean;

Пытается заблокировать канву. Если она не заблокирована другим потоком команд, - True, в противном случае ничего не делает и возвращает False
procedure Unlock; Уменьшает на 1 счетчик блокировок канвы


Определение условий компиляции



21.3.4. Определение условий компиляции

Подобно директивам условной компиляции Delphi в RTF-файл можно вставлять указания Help-компилятору помещать или не помещать в результирующий файл тот или иной раздел. Такие указания могут понадобиться на этапе отладки справочной службы, а также при создании нескольких версий приложения (например, справочная служба демонстрационной версии может не содержать некоторые разделы, определенные для основной версии). Они вставляются в текст с помощью сноски, помеченной символом “*”. Чтобы включить условный раздел в Help-файл или исключить его из файла, ключевое слово, определяемое сноской “*”, должно указываться в секции соответственно include или Exclude файла проекта справочной службы (см. п. 21.4.1).

В тексте сноски “*” можно указать одно или несколько управляющих слов (следующие друг за другом слова в тексте сноски разделяются символом “;”). Раздел будет включен в Help-файл, если хотя бы одно из связанных с ним управляющих слов указано в секции include файла проекта (если раздел не имеет сноски “*”, он всегда включается в результирующий файл). Управляющие слова могут содержать любые символы, кроме “;” и пробелов. Например:

Test_Build; AppVersionI; DebuggVer



Освобождение ресурсов отображения



11.7.4. Освобождение ресурсов отображения

После использования отображенных данных ресурсы окна отображения нужно освободить функцией function UnMapViewOfFile(IpBaseAddress: Pointer): BOOL; единственный параметр обращения к которой должен содержать адрес первого отображенного байта, т. е. адрес, возвращаемый функцией MapViewOfFile. Закрытие объекта отображения и самого файла осуществляется обращением к функции

function CloseHandle(hObject: THandle).



Процедуры и функции для работы с динамической памятью



7.4.4. Процедуры и функции для работы с динамической памятью

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

Таблица 7.14. Средства Object Pascal для работы с памятью

Function Addr(X):

Pointer;

Возвращает адрес аргумента X. Аналогичный результат возвращает операция @
Procedure Dispose (var P: Pointer) ; Возвращает в кучу фрагмент динамической памяти, который ранее был зарезервирован за типизированным указателем P
Procedure Free-Mem(var P: Pointer; Size: Integer) ; Возвращает в кучу фрагмент динамической памяти, который ранее был зарезервирован за нетипизированным указателем Р
Procedure Get-Mem(var P: Pointer; Size: Integer) ; Резервирует за нетипизированным указателем Р фрагментдинамической памяти требуемого размера Size
Procedure New(var P: Pointer) ; Резервирует фрагмент кучи для размещения переменной и помещает в типизированный указатель Р адрес первого байта
Function SizeOf(X): Integer; Возвращает длину в байтах внутреннего представления указанного объекта Х

Windows имеет собственные средства работы с памятью. В табл. 7.15 перечислены соответствующие API-функции и даны краткие пояснения. За более полной информацией обращайтесь к справочной службе в файлах WIN32. hlp или WIN32S. hlp.

Таблица 7.15. Средства Windows для работы с памятью

CopyMemory Копирует содержимое одного блока памяти в другой блок.

Блоки не должны перекрываться хотя бы частично

FillMemory Заполняет блок памяти указанным значением
GetProcessHeap Возвращает дескриптор кучи для текущей программы
GetProcessHeaps Возвращает дескрипторы куч для всех работающих программ
GlobalAlloc Резервирует в куче блок памяти требуемого размера
GlobalDiscard Выгружает блок памяти
GlobalFlags Возвращает информацию об указанном блоке памяти
GlobalFree Освобождает блок памяти и возвращает его в общий пул памяти
GlobalHandle Возвращает дескриптор блока памяти, связанного с заданным указателем
GlobalLock Фиксирует блок памяти и возвращает указатель на его первый байт
GlobalMemoryStatus Возвращает информацию о доступной памяти (как физической, так и виртуальной)
GlobalReAlloc Изменяет размер и атрибуты ранее зарезервированного блока памяти
GlobalSize Возвращает размер в байтах блока памяти
GlobalUnlock Снимает фиксацию блока памяти и делает его перемещаемым
HeapAlloc Резервирует в куче неперемещаемый блок памяти
HeapCompact Удаляет фрагментацию кучи
HeapCreate Создает для программы новую кучу
HeapDestroy Возвращает кучу в общий пул памяти
HeapFree Освобождает блок памяти, зарезервированный функциями

HeapAlloc или HeapReAlloc

HeapLock Делает указанную кучу доступной только для текущего потока
HeapReAlloc Изменяет размер и/или свойства кучи
HeapSize Возвращает размер кучи в байтах
HeapUnlock Делает указанную кучу доступной для любых потоков текущего процесса
HeapValidate Проверяет состояние кучи или размещенного в ней блока памяти
IsBadCodePtr Сообщает, может ли вызывающая программа читать данные из указанного адреса памяти (но не из блока памяти)
IsBadHugeReadPtr Сообщает, может ли вызывающая программа читать данные из указанного блока памяти
IsBadHugeWritePtr Сообщает, может ли вызывающая программа изменять содержимое указанного блока памяти
IsBadReadPtr Сообщает, может ли вызывающая программа читать данные из указанного блока памяти
IsBadStringPtr Сообщает, может ли программа читать содержимое строки, распределенной в куче
IsBadWritePtr Сообщает, может ли вызывающая программа изменять содержимое указанного блока памяти
LocalAlloc Аналогична GlobalAlloc
:: LocalDiscard Аналогична GloalDiscard
'LocalFlags Аналогична GlobalFlags
LocalFree Аналогична Global Free
LocalHandle Аналогична GlobalHandle
LocalLock Аналогична GlobalLock
LocalReAlloc Аналогична GlobalReAlloc
LocalSize Аналогична GlobalSize
LocalUnlock Аналогична GlobalUnlock
MoveMemory Копирует один блок памяти в другой. Блоки могут перекрываться
VirtualAlloc Резервирует блок виртуальной памяти
VirtualFree Освобождает блок виртуальной памяти
VirtualLock Фиксирует блок виртуальной памяти
VirtualProtect Изменяет права доступа текущей программы к виртуальному блоку памяти
VirtualProtectEx Изменяет права доступа указанной программы к виртуальному блоку памяти
VirtualQuery Возвращает свойства виртуального блока памяти по отношению к вызывающей программе
VirtualQueryEx Возвращает свойства виртуального блока памяти по отношению к указанной программе
VirtualUnloc'k Снимает фиксацию блока виртуальной памяти
ZeroMemory Заполняет блок памяти нулями


Секция BITMAPS



21.4.4. Секция BITMAPS

Эта секция определяет список папок, в которых компилятор будет искать графические файлы, встроенные в текст справки директивами bmc, bmi, bmr (см. п. 21.3.6). Если ни одна папка не определена, компилятор сможет подключить только те файлы, которые располагаются в том же каталоге, где создается нlр-файл.



Страница DataSnap



4.8.4. Страница DataSnap

На этой странице сосредоточены компоненты, реализующие взаимодействие машин в локальной сети или Интернет в типичном для БД случае, когда клиент работает с удаленными данными. Часть компонентов известны по другим версиям Delphi, часть появилась в версии 6.



Страница WebSnap



4.9.4. Страница WebSnap

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



Свойства



9.2.4. Свойства

Свойства - это специальный механизм классов, регулирующий доступ к полям. Свойства объявляются с помощью зарезервированных СЛОВ property, read И write (слова read И write считаются зарезервированньши только в контексте объявления свойства). Обычно свойство связано с некоторым полем и указывает те методы класса, которые должны использоваться при записи в это поле или при чтении из него. Например:

type

TaClass = class

IntField: Integer; Function GetField: Integer;

Procedure SetField (Value: Integers);

Property IntegerValue: Integer read GetField

write SetField;

end ;

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

var

aClass: TaClass;

Value: Integer;

begin

aClass := TaClass.Create; { Обязательное обращение к

конструктору перед обращением к полю или свойству!} aClass.IntegerValue := 0;

Value := aClass.IntegerValue;

aClass.Destroy; // Удаление ненужного объекта

end;

Более того, возможен и такой оператор присваивания:

aClass.IntField := NewValue;

Разница между этим оператором и оператором

aClass.IntegerValue := NewValue;

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

IbOutput.Caption := 'Строка';

Свойство Caption компонента Label вызывает метод setText, который не только запоминает строку символов во внутренней переменной, но и осуществляет прорисовку метки с новым текстом.

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

type

TaClass = class IntFiled: Integer;

Procedure SetFieid (Value: Integers;

Property IntegerValue:

Integer read IntFiled write SetFieid;

end;

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

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



TColorDialog диалог выбора цвета



18.5.4. TColorDialog - диалог выбора цвета

Компонент создает и обслуживает стандартное диалоговое окно выбора цвета, показанное на Рисунок 18.42.

Свойства компонента:

property Color: TColor; Содержит выбранный цвет
property CustomColors: TStrings; Содержит до 16 цветов, определенных пользователем. Каждая строка имеет такой формат: Со1огх=нннннн, где х - буква от а до р, определяющая номер цвета, нннннн ~ шестнадцатеричное представление цвета в формате rgb
TColorDialogOption = (cdFullOpen, cdPreventFullOpen, cdShowHelp, cdSolidColor, cdAnyColor) ; TColorDialogOptions = set of TColorDialogOption; property Options: TColorDialogOptions; Определяет настройку окна: cdFullOpen -показывать с развернутым окном выбора цвета пользователя; cdPreventFullOpen -запретить показ окна выбора цвета пользователя; cdShowHelp - включить в окно кнопку Help; cdSolidColor - выбирать ближайший сплошной цвет; cdAnyColor -разрешить выбор не сплошных цветов


TLabel метка для отображения текста



18.1.4. TLabel - метка для отображения текста

Примечание
Примечание


Метка Label может отображать длинную текстовую строку своего свойства Caption в виде нескольких строк: для этого установите в AutoSize значение False, задайте достаточно большие размеры метки и поместите в Wordwrap значение True. Для отображения действительно многострочного текста используйте компоненты TMemo (см.п. 18.1.7)HTRichEdit(cM.n. 18.3.4).



TOutLine просмотр иерархических структур



18.6.4. TOutLine - просмотр иерархических структур

Подобно компоненту TTreeview страницы Win32 компонент Tout-Line предназначен для отображения иерархических структур данных (каталогов, например). Элементом отображения является узел. Каждый узел имеет родительский узел и дочерние узлы. Исключение составляет узел самого верхнего уровня (он не имеет родительского узла) и узлы самых нижних уровней (они не имеют дочерних узлов),

Для каждого узла компонент создает объект класса TOutLineNode. Его свойства:

property Data: Pointers; Указатель на связанные с узлом данные
property Expanded: Boolean; Если содержит True, с узлом связан раскрытый список дочерних узлов
property FullPath: String; Содержит полное имя узла со списком имен всех родительских узлов, разделенных символом ItemSeparator объекта ToutLine
property Hasltems: Boolean; Содержит True, если с узлом связаны дочерние узлы
property Index: Longint; Содержит уникальный идентификатор узла в компоненте ToutLine
property IsVisible: Boolean; Содержит True, если узел виден в окне компонента ToutLine
property Level: Integer; Определяет уровень иерархии узла. Узел самого верхнего уровня имеет уровень 0, его дочерние узлы - уровень 1, их дочерние узлы - уровень 2 и т. д.
property Text: String; Определяет имя узла
property Topltem: Longint; Содержит индекс своего родительского узла первого уровня (родительский узел нулевого уровня не виден в компоненте TOutLine)

Методы класса TOutLineNode:

procedure ChangeLevelBy(Value: TChangeRange) ; Перемещает уровень узла на один вверх (Value=-1) или вниз(Value=+l) Закрывает список дочерних узлов
procedure Collapse; procedure FullExpand; Раскрывает список всех своих дочерних узлов на всех уровнях
function GetFirstChild: TTreeNode; Возвращает ссылку на первый дочерний узел или nil, если нет дочерних узлов
function GetPrevChild(Value: Longint): Longint; Возвращает индекс узла, предшествующего узлу Value
TAttachMode = (oaAdd, oaAddChild, oalnsert) ; procedure MoveTo(Destination: Longint; AttachMode: TAttachMode) ; Перемещает узел со всеми потомками в положение, определяемое индексом Destination и режимом AttachMode: oaAdd -добавить последним на том же уровне, что и Destination; oaAddChild -добавить последним к потомкам узла Destination; oalnsert - вставить на место Destination, который смещается ниже него на том же уровне

Свойства компонента TOutLine:

property Canvas: TCanvas; Определяет канву для прорисовки компонента
property itemHeight: Integer; Определяет высоту узлов
property Items[Index: Longint]: TOutlineNode; Открывает доступ к узлу по его индексу
property ItemCount: Longing; Содержит общее количество узлов
property Lines: TStrings; Содержит список всех узлов
TOutlineOption = (ooDrawTreeRoot,

ooDrawFocusRect, ooStretchBitmaps) ; TOutlineOptions = set of Tout lineOption; property Options: TOutlineOptions;

Определяет атрибуты прорисовки: ooDraw TreeRoot - соединять линии узлов верхнего уровня; ooDrawFocusRect - выделять пунктиром сфокусированный узел; oostretch Bitmaps - масштабировать пиктограммы
TOutlineStyle = (osText, osPlus-

MinusText, osPictureText, osPlus-

MinusPictureText, osTreeText,

osTreePictureText) ;

property OutlineStyle: TOutlineStyle;

Задает стиль прорисовки: osText - выводится только текст(без линий); osPlusMinusText - текст и пиктограммы PicturePlus/PictureMinus;osPictureText -текст и пиктограммы PictureOpen/PictureClosed/PictureLeaf;osPlusMinus-PictureText - объединяет два предыдущих стиля; osTreeText - текст и линии связи между узлами; osTreePictureText - объединяет osTreeText и osPictureText
property PictureClosed: TBitmap; Содержит пиктограмму узла с закрытым списком дочерних узлов. По умолчанию -закрытая папка
property PictureMinus: TBitmap; Содержит пиктограмму узла с закрытым списком дочерних узлов. По умолчанию - пиктограмма со знаком минус
property PictureOpen: TBitmap; Содержит пиктограмму узла с открытым списком дочерних узлов. По умолчанию - открытая папка
property PictureLeaf: TBitmap; Содержит пиктограмму узла, не имеющего дочерних узлов. По умолчанию - пиктограмма документа
property PicturePlus: TBitmap; Содержит пиктограмму узла с открытым списком дочерних узлов. По умолчанию - пиктограмма со знаком плюс
property Row: Longint; Содержит индекс сфокусированного узла
property ScrollBars: TScroll-Style; Определяет наличие полос прокрутки: ssNone - нет полос; ssHorizontal - горизонтальная полоса; ssVertical - вертикальная полоса; ssBoth - и горизонтальная, и вертикальная полоса

Методы компонента:

function Add(Index: Longint; const Text: String): Longint; Добавляет узел с именем Text как последний на тот же уровень иерархии, что и узел index, и возвращает его индекс (режим oaAdd)
function AddChild(Index: Longint;

const Text: String): Longing;

Добавляет дочерний узел с именем Text к узлу index и возвращает его индекс (режим oaAddChild)
function AddChildObject(Index:

Longint; const Text: String; const Data: Pointer): Longint;

Добавляет дочерний узел с именем Text и данными Data к узлу index и возвращает его индекс
function AddObject(Index: Long

int; const Text: String; const Data: Pointer): Longint;

Добавляет узел с именем Text и с данными Data как последний на тот же уровень иерархии, что и узел index, и возвращает его индекс
procedure BeginUpdate ; Блокирует перерисовку компонента перед вставкой/удалением нескольких узлов
procedure Clear; Удаляет все узлы компонента
procedure EndUpdate; Разрешает перерисовку компонента после вставки/удаления нескольких узлов
procedure FullCollapse; Закрывает списки всех дочерних узлов на всех уровнях
procedure FullExpand; Раскрывает списки всех дочерних узлов на всех уровнях
function GetDataItem(Value: Pointer): Longint; Возвращает индекс узла по его данным
function GetItem(X, Y: Integer): Longint; Возвращает индекс узла по его координатам
function GetTextItem(Value: String) : Longing; Возвращает индекс узла по его имени
function Insert(Index: Longint;

const Text: String): Longing;

Вставляет узел с именем Text на место узла Index(режим oalnsert)
function InsertObj ect(Index:

Longint; const Text: String;

const Data: Pointer): Longint;

Вставляет узел с именем Text и данными Data на место узла index (режим oalnsert)
procedure LoadFromFile(const

FileName: String);

Загружает содержимое компонента из файла с именем FileName
procedure LoadFromFile(const FileName: Strings; Сохраняет содержимое компонента в файле
procedure SetUpdateState(Value: Boolean); С именем FileName если Value=True, соответствует BeginUp date, в противном случае - EndUpdate

Для компонента определены следующие события:

EOutlineChange = procedure

(Sender: TObject; Index: Longint)

of object;

property OnCollapse: EOut lineChange;Возникает при закрытии списка дочерних узлов узда Index

TOwnerDrawState = set of

(odSelected, odGrayed, odDisabled, odChecked, odFocused) ;

TListBox; Index: Integer; Rect:TRect; State: TOwnerDrawState) of Object;

property OnDrawItem: TDrawItemEvent;

Возникает при необходимости прорисовки узла index: Rect - прямоугольник прори совки; State - состояние узла (odSelected - узел выделен; odDisabled - узел запрещен для выбора; odFocused - узел сфокусирован)
EOutlineChange = procedure (Sender: TObject; Index: Longint) of object; property OnExpand: EOut lineChange; Возникает при открытии списка дочерних узлов узла Index




TRichEdit ввод и отображение RTFтекста



18.3.4. TRichEdit - ввод и отображение RTF-текста

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



TSpinEdit редактор для ввода целого числа



18.7.4. TSpinEdit - редактор для ввода целого числа

Компонент TSpinEdit предназначен для ввода/отображения числа. Он представляет собой комбинацию специализированного потомка однострочного редактора rcustomEdit и кнопок TSpinButton. Редактор способен вводить только числа (в этом и заключается его специализация), а кнопки используются для изменения числа на некоторую фиксированную величину.

Свойства компонента:

property Button: TSpinButton; Содержит ссылку на встроенный объект TSpinButton
property EditorEnabled: Boolean; Разрешает/запрещает использовать редактор для ручного ввода числа
property Increment: Longint; Содержит число, на которое будет изменяться свойство value при нажатии кнопок TSpinButton
property MaxValue: Longint; Содержит верхнюю границу диапазона возможных значений value
property MinValue: Longint; Содержит нижнюю границу диапазона возможных значений value
property Value: Longint; Содержит текущее значение числовой величины




Вызов исключения



16.1.4. Вызов исключения

В некоторых ситуациях программисту бывает необходимо инициировать собственное исключение. Для этого он использует зарезервированное слово raise (возбудить). Если это слово встретилось в секции try.. .exception или try.. .finally, немедленно начинают свою работу секции соответственно except... end и finally... end. Если оно встретилось в except.. .end или finally.. .end, считается, что данный защищенный блок на текущем уровне вложенности (блоки могут быть вложенными) завершил свою работу и управление передается вышестоящему уровню.

Слово raise возбуждает исключение самого общего класса Exception. Если программист желает возбудить исключение конкретного типа (не важно - стандартного или собственного), он должен явно указать класс создаваемого в этот момент объекта путем вызова его конструктора. Например, следующий оператор возбудит ошибку ввода/вывода:

raise EInOutError.Create('Ощибка!') ;

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



УЧЕБНАЯ ПРОГРАММА



5.1. УЧЕБНАЯ ПРОГРАММА

При описании свойств языка мне понадобится иллюстрировать их небольшими примерами. В таких примерах чаще всего реализуются простые действия по вводу некоторых данных, их преобразованию и выводу результатов на экран. Для реализации этих действий создадим форму, которая будет содержать все необходимые для учебных примеров интерфейсные элементы. Чтобы эта форма была доступна в любой учебной программе, мы поместим ее в так называемый репозиторий Delphi - архив, в котором сохраняются заготовки для новых программ. Замечу, что в версии 1 нет репозитория. Тем не менее полезно и в этом случае создать учебную форму: чтобы избавить себя от повторения одних и тех же действий при реализации разных примеров. Сохраните ее в файле с именем Example, например, а при создании новой программы свяжите ее с проектом (опция File | Add) и сразу же сохраните под другим именем (File | Save As).

Вид формы для учебной программы показан на Рисунок 5.1. На форме размещена панель (трапе!), две кнопки (TBitBtn), строка ввода (TEdit), метка (TLabel) и многострочный редактор (тмето). Панель понадобилась для того, чтобы размещенные на ней кнопки, строка ввода и метка всегда располагались в нижней части окна, даже если окно распахнуто на весь экран. Левая кнопка ок служит для сообщения программе о том, что в строке ввода подготовлен текст. Обработчик события onciick этой кнопки будет тем самым местом программы, куда мы будем помещать учебные фрагменты. Правая кнопка close служит для завершения работы программы. Ее функции аналогичны функциям системной кнопки закрытия окна, и поэтому ее можно было бы и не размещать на форме. Однако я предпочитаю использовать крупную, бросающуюся в глаза кнопку, чтобы даже неопытный пользователь сразу увидел интерфейсный элемент, с помощью которого он сможет прекратить работу с программой. Метка располагается над строкой ввода и пока не видна на экране. Она предназначена для размещения коротких сообщений, которые будет формировать программа. Для вывода многострочных сообщений служит редактор TMеmо, занимающий все остальное место окна.



СТРУКТУРА ПРОГРАММ DELPHI



5.2. СТРУКТУРА ПРОГРАММ DELPHI

Любая программа в Delphi состоит из файла проекта (файл с расширением dpr) и одного или нескольких модулей (файлы с расширениями pas). Каждый из таких файлов описывает программную единицу Object Pascal.



ТИПЫ



5.3. ТИПЫ

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



ОПЕРАТОРЫ ЯЗЫКА



5.4. ОПЕРАТОРЫ ЯЗЫКА

С одним из наиболее часто используемых операторов языка Object Pascal - оператором присваивания мы уже познакомились (см. п. 3.3.3). Ниже рассматриваются остальные операторы.



МАССИВЫ



5.5. МАССИВЫ

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

При описании массива необходимо указать общее количество входящих в массив элементов и тип этих элементов. Например:

var

а : array [1..10] of Real;

b : array [0..50] of Char;

с : array [-3..4] of String;

Как видим, при описании массива используются зарезервированные слова array и of (массив, из). За словом array в квадратных скобках указывается тип-диапазон, с помощью которого компилятор определяет общее количество элементов массива. Тип-диапазон (подробнее см. в гл. 7) задается левой и правой границами изменения индекса массива, так что массив А состоит из 10 элементов, массив В - из 51, а массив С - из 8 элементов. За словом of указывается тип элементов, образующих массив.

Доступ к каждому элементу массива в программе осуществляется с помощью индекса - целого числа (точнее, выражения порядкового типа, см. гл. 7), служащего своеобразным именем элемента в массиве (если левая граница типа-диапазона равна 1, индекс элемента совпадает с его порядковым номером). При упоминании в программе любого элемента массива сразу за именем массива должен следовать индекс элемента в квадратных скобках, например:

var

a: array [1..10] of Integer;

b: array [0..40] of Char;

c: array [-2..2] of Boolean;

k: Integer;

begin

b[17] := 'F';

c[-2] := a[1] > 2;

for k := 1 to 10 do a[k] := 0;

end;

В правильно составленной программе индекс не должен выходить за пределы, определенные типом-диапазоном. Например, можно использовать элементы а [ 1 ], в[38], с[0], но нельзя а [0 ] илис[38] (определение массивов см. выше). Компилятор Object Pascal может[ Буквальный перевод array - боевой порядок, упорядоченная масса (войск). В компьютерной терминологии array переводится словом массив. ] контролировать использование индексов в программе как на этапе компиляции, так и на этапе прогона программы.

Учебная программа AVERAGE

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

procedure TfmExample.bbRunClick(Sender: TObject);

{Программа создает массив из N случайных целых чисел, равномерно распределенных в диапазоне от 0 до MAX_VALUE-1, подсчитывает среднее арифметическое этих чисел, а также минимальное и максимальное из них.} const

N = 1000; // Количество элементов массива

MAX_VALUE = 100+1;// Диапазон значений случайных чисел var

m: array [1..N] of Integer; // Массив чисел

i: Integer;// Индекс массива

max,min: Integer; // Максимальное и минимальное число

sum: Real;// Сумма чисел

begin

// Наполняем массив случайными числами:

for i := 1 to N do

m[i] := Random(MAX_VALUE);

// Задаем начальные значения переменных:

sum : = m [ 1 ] ;

max : = m [ 1 ] ;

min := m[1] ;

// Цикл вычисления суммы всех случайных чисел и поиска

// минимального и максимального:

for i := 2 to N do

begin

sum := sum + m[i];

if m[i] < min then

min := m[i]

else if m[i] > max then

max := m[i] end;

// Вычисляем среднее значение и выводим результат:

IbOutput.Caption := 'Мин = '+IntToStr(min)+' Макс = '+ IntToStr(max)+' Среднее = '+FloatToStr(sum/N) ;

end;

Для создания массива используется встроенная функция Ran-dom(Max), которая возвращает случайное целое число, равномерно распределенное в диапазоне от 0 до мах-1 (мах - параметр обращения).



ПРОЦЕДУРЫ И ФУНКЦИИ



5.6. ПРОЦЕДУРЫ И ФУНКЦИИ

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

Многие примеры в этой книге невелики по размерам (не более 30-40 строк), поэтому в таких программах можно обойтись и без подпрограмм. Иное дело - создание крупных программ в сотни, тысячи и десятки тысяч строк. Писать такие программы как нечто единое целое, без расчленения на относительно самостоятельные фрагменты, т. е. без структурирования, просто невозможно. Практически во всех языках программирования имеются средства структурирования. Языки, в которых предусмотрены такие механизмы, называются процедурно-ориентированными. К их числу принадлежит и Object Pascal.

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

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

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



Классы TGraphic и TPicture



16.4.5. Классы TGraphic и TPicture

Важное место в графическом инструментарии Delphi занимают классы TGraphic и TPicture.

TGraphic - это абстрактный класс, инкапсулирующий общие свойства и методы трех своих потомков: пиктограммы (TIcon), метафайла (TMetafile) и растрового изображения (TBitmap). Общей особенностью потомков TGraphic является то, что обычно они сохраняются в файлах определенного формата. Пиктограммы представляют собой небольшие растровые изображения, снабженные специальными средствами, регулирующими их прозрачность. Для файлов пиктограмм обычно используется расширение ico. Метафайл - это изображение, построенное на графическом устройстве с помощью специальных команд, которые сохраняются в файле с расширением wmf или emf. Растровые изображения - это произвольные графические изображения в файлах со стандартным расширением bmp.

Свойства класса TGraphic:



property Empty: Boolean; Содержит True, если с объектом не связано графическое изображение
property Height: Integer; Содержит высоту изображения в пикселях
property Modified: Boolean; Содержит True, если графический объект изменялся
property Palette: HPALETTE; Содержит цветовую палитру графического объекта
property PaletteModified: Boolean; Содержит True, если менялась цветовая палитра графического объекта
property Transparent: Boolean; Содержит True, если объект прозрачен для фона, на котором он изображен
property Width: Integer; Содержит ширину изображения в пикселях
Методы Класса TGraphic:
procedure LoadFromClipooardFor.gif" >


Метки и операторы перехода



5.4.5. Метки и операторы перехода

Можно теоретически показать, что рассмотренных операторов вполне достаточно для написания программ любой сложности. В этом отношении наличие в языке операторов перехода кажется излишним. Более того, современная технология структурного программирования основана на принципе “программировать без GOTO”: считается, что злоупотребление операторами перехода затрудняет понимание программы, делает ее запутанной и сложной в отладке. Тем не менее в некоторых случаях использование операторов перехода может упростить программу.

Оператор перехода имеет вид:

goto <метка>;

Здесь goto - зарезервированное слово (перейти [на метку]); <метка> - метка.

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

Метка располагается непосредственно перед помечаемым оператором и отделяется от него двоеточием. Оператор можно помечать несколькими метками, которые в этом случае отделяются друг от друга двоеточием. Перед тем как появиться в программе, метка должна быть описана. Описание меток состоит из зарезервированного слова label (метка), за которым следует список меток:

Label

loop, Ibl, lb2;

begin

goto Ibl;

loop: .........

Ibl:lb2: ......

......

goto lb2;

end;

Действие оператора goto состоит в передаче управления соответствующему меченному оператору.

При использовании меток необходимо руководствоваться следующими правилами:

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

Пример использования



11.7.5. Пример использования

В следующем листинге приводится текст модуля, который создает окно, показанное на Рисунок 11.1.

Программа создает дисковый файл, состоящий из 100000 случайных вещественных чисел (длину файла можно выбрать другой, если изменить значение редактора длина массива). Файл с именем test.dat создается путем отображения файла в память (кнопка память) и традиционным способом (кнопка Файл). В обоих случаях показывается время счета (процессор 400 МГц, память 64 Мбайт). Чем больше частота и память, тем больше будет разница во времени.



Секция MAP



21.4.5. Секция MAP

В этой секции следует определить числовые идентификаторы разделов, которые будут автоматически вызываться кнопками Help и клавишей F1 в работающей программе. Напомню, что все видимые компоненты Delphi имеют специальное свойство HeipContext, в которое можно поместить числовой идентификатор раздела справочной службы. Если соответствующий компонент имеет фокус ввода и пользователь нажимает кнопку F1, автоматически включается справочная система Windows, которая отыскивает в ньр-файле и показывает в справочном окне соответствующий раздел. Только разделы, указанные в секции [map] , могут быть контекстно-доступными из работающей программы. Остальные разделы можно просмотреть после вызова справки с помощью выбора ключевых слов, кнопками просмотра связанных разделов или по содержанию справочной службы.

В списке Map topics IDs to numeric values указываются уже определенные разделы в формате

идентификатор_темы=Неlр Сontext

Здесь идентификатор_темы - идентификатор, определенный сноской # в RTF-файле; HelpContext -присвоенный разделу числовой идентификатор, который можно помещать в свойство HelpContext визуального компонента.

Для задания идентификатора нового раздела или удаления раздела из списка Map используются соответственно кнопки Add и Remove. С помощью кнопки include можно указать ASCII-файл с перечнем идентификаторов разделов и присвоенными им числовыми идентификаторами. Кнопка Edit позволяет отредактировать элемент списка.

При разработке файлов справочной службы, включающих множество разделов, приходится запоминать (или распечатывать) многочисленные идентификаторы разделов, чтобы поставить им в соответствие числовые идентификаторы. Эту проблему можно упростить, если вы назначили идентификаторы такими же, как и названия разделов, заменив в них пробелы символами подчеркивания. В этом случае можно вызвать опцию File | Report, в появившемся диалоговом окне указать имя нlр-файла и имя файла для отчета, установить режим вывода названий (отметить переключатель Titles) и щелкнуть по кнопке Report - MS HW создаст текстовый файл с перечнем названий всех тем. Если этот файл не слишком велик, он будет тут же показан в окне MS HW, и вы сможете без труда вспомнить идентификаторы.



Создание собственного класса



16.1.5. Создание собственного класса

Программист может создать собственный класс обработки исключений, объявив его потомком Exception или любого другого стандартного класса (этим другим чаще всего бывает класс EAbort). Объявление нестандартного класса имеет смысл только тогда, когда вам необходимо научить программу распознавать некорректные наборы данных и соответствующим образом на них реагировать.

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

Создадим новый класс EIntCheckError и будем возбуждать исключение этого класса при обнаружении ошибки в данных:

type

EIntCheckError = class(EAbort)

end;

var

F: TextFile;

S: String;

k: Integer;

begin

try

// Готовимся к работе: открываем файл AssignFile(F, FileName);

Reset(F); // Здесь возможна ошибка EinOutError // Цикл ввода-контроля-преобразования while not EOF(F) do begin

// Вводим символы очередного числа

ReadLn(F,S);// Здесь возможна ошибка EinOutError

// Преобразуем символы в число

k := StrToInt(S); // Здесь возможна ошибка EConvertError

// Проверяем число

if k < 0 then

raise EIntCheckError.Create("Отрицательное число');

// Преобразуем число

..... // Здесь возможна ошибка EIntError

// Вновь проверяем число

if k <= 0 then

raise EIntCheckError.Create('He положительное число');

end;

except

on E: EIntCheckError do

ShowMessage(E.Message) ;

on EInOutError do

ShowMessage('Некорректная файловая операция');

on EConvertError do

ShowMessage('Ошибка в записи числа');

on EIntError do

ShowMessage('Ошибка преобразования');

end;

end;

В этом примере создается класс EIntCheckError, который ничем, кроме названия, не отличается от своего родителя EAbort. В реальной программе потомок обычно расширяет набор полей (свойств) своего родителя или перекрывает его методы; приведенный пример лишь иллюстрирует, что делать это необязательно. При неудачной проверке операторами

raise EIntCheckError.Create('Отрицательное число') ;

и

raise EIntCheckError.Create('Ошибка преобразования');

возбуждается исключение нового класса. При этом с помощью унаследованного конструктора create создается новый безымянный объект, а строковый параметр обращения к конструктору запоминается в поле FMessage и становится доступен с помощью свойства Message объекта. Обработчик исключения EIntCheckError именует объект идентификатором e и с помощью стандартной процедуры ShowMessage показывает его в небольшом окне на экране.

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



Страница BDE



4.8.5. Страница BDE

Здесь представлены компоненты, поддерживающие доступ к данным с помощью BDE - Table, Query, StoredProc И Т. П. Механизм BDЕ в равной степени успешно работает как с файл-серверными, кис клиент-серверными БД. Компоненты этой страницы есть во всех версиях Delphi.



Страницы Indy Clients Indy Servers Indy Misc



4.9.5. Страницы Indy Clients, Indy Servers, Indy Misc

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



TDirectoryOutLine отображение структуры каталогов



18.7.5. TDirectoryOutLine - отображение структуры каталогов

Компонент предназначен для отображения древовидной структуры каталогов (см. Рисунок 18.46). В отличие от TDirectoryListBox (см. п. 18.6.7) компонент отображает полную структуру каталогов, а не маршрут доступа к одному из них.



TDrawGrid произвольная таблица



18.2.5. TDrawGrid - произвольная таблица

Компонент TDrawGrid предоставляет программисту мощные возможности создания и обслуживания табличных структур данных. Он обеспечивает двухмерное представление данных, упорядоченных по столбцам и рядам, и избавляет программиста от многих рутинных аспектов, связанных с представлением и обслуживанием таблиц.

Чтобы таблица была работоспособной, в ней как минимум следует определить обработчик события OnDrawCell, которое возникает при необходимости прорисовать ту или иную ячейку. Для прорисовки используется табличное свойство Canvas.

Компонент TDrawGrid является непосредственным родителем строковой таблицы TStringGrid, поэтому передает ей все свои свойства, методы и события за исключением специфичных для строк свойств Cells, Cols, Objects И Rows. Поскольку порядок описания компонентов в этой главе соответствует умалчиваемому порядку их расположения на страницах палитры компонентов, TStringGrid описан раньше своего родителя TDrawGrid, и вы сможете найти информацию о свойствах, методах и событиях последнего в предыдущем параграфе.

В следующем примере компонент TDrawGrid используется для показа текста и картинок одновременно, причем текст можно редактировать. Картинки взяты из каталога images l splash | igcolor (Рисунок 18.11).



TEdit ввод и отображение строки



18.1.5. TEdit - ввод и отображение строки

Компонент класса TEdit представляет собой однострочный редактор текста. С его помощью можно вводить и/или отображать достаточно длинные текстовые строки.

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

var

OldText: String;

procedure TFor.gif" >




THeader управляющий заголовок



18.6.5. THeader - управляющий заголовок

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

Свойства Компонента THeader:

property Sections: TStrings; Содержит набор заголовков секций. Методами Add, Delete, Insert объекта Sections можно добавлять, вставлять и удалять секции заголовка
property SectionWidth[X: Integer] : Integer; Содержит ширину секции с индексом index

Для компонента определены следующие события:

TSectionEvent = procedure(Sender: TObject; ASection, AWidth: Integer) of object; Возникает при завершении изменения размера секции с индексом ASection. AWidth -текущая ширина секции
property OnSized: TSectionEvent; TSectionEvent = procedure(Sender: TObject; ASection, AWidth: Integer) of object-property OnSizing: TSectionEvent; Возникает в процессе изменения размера секции с индексом ASection. AWidth - текущая ширина секции




TPrintDialog диалог настройки параметров печати



18.5.5. TPrintDialog - диалог настройки параметров печати

Компонент TPrintDialog создает стандартное диалоговое окно для выбора параметров печати, показанное на Рисунок 18.42.



TTrackBarрегулятор величины



18.3.5. TTrackBar-регулятор величины

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

Свойства компонента:

property Frequency: Integer; Определяет частоту нанесения меток: 1 - каждое значение диапазона изменения имеет метку; 2 - каждое 2-е значение и т. д.
property LineSize: Integer; Определяет смещение ползунка при нажатии клавиш курсора или при единичном перемещении мышью
property Max: Integer; Определяет максимальное значение диапазона изменения
property Min: Integer; Определяет минимальное значение диапазона измене ния
property Orientation:

TTrackBarOrientation;

Определяет ориентацию компонента: trHorizontal -горизонтальная; trVertical -вертикальная
property PageSize: Integer; Определяет смещение ползунка при нажатии клавиш Page Up, Page Down или при щелчке мышью на концах шкалы
property Position: Integer; Определяет текущее положение ползунка
property SelEnd: Integer- Задает конечную позицию выделения
property SelStart: Inte Задает начальную позицию выделения
ger-property SliderVisible: Boolean-property ThumbLength: Integer; TTickMark = (tmBottomRight, tmTopLeft, tmBoth) ; property TickMarks: TTickMark; TTickStyle = (tsNone, tsAuto, tsManual) ; property TickStyle: TTickStyle; Определяет, будет ли видимым указатель компонента Определяет длину указателя

Определяет способ нанесения меток: tmBottomRight -внизу или справа; tmTopLeft - вверху или слева; tmBottom - по обеим сторонам

Определяет стиль нанесения меток: tsNone - нет меток; tsAuto - метки наносятся с частотой Frequence; tsManual - наносятся начальная и конечная метки, остальные наносит программа с помощью метода setTick

С помощью метода

procedure SetTick(Value: Integer);

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



Указание порядка просмотра связанных разделов



21.3.5. Указание порядка просмотра связанных разделов

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

Файл гл меню:005
Новый меню файл:005
Открыть меню файл:010
Сохранить меню файл:015
Сохранить как меню файл:020
Печатать меню файл:025
Выход меню файл:030
Редактировать гл меню:010
Очистить меню редак:005
Вырезать меню редак:010
Копировать меню редак:015
Вставить меню редак:020
Отменить меню редак:025
Окно гл меню:015
Каскад меню окно:005
Мозаика меню окно:010
Закрыть все меню окно:015

В этом списке каждой опции меню поставлена в соответствие комбинация символов (гл_меню: 010, меню_файл:025 и т. п.), определяющая порядковый номер просмотра раздела. Все разделы, помеченные соответствующими комбинациями, сортируются в обычном ASCII-порядке следования символов этих комбинаций. Таким образом, раздел Редактировать, помеченный гл_меню:010, будет следовать за Файл (гл_меню: 005), но предшествовать Окно (гл_меню: 015).

Чтобы связать с разделом код для указания порядка просмотра раздела, необходимо вставить сноску “+”: *гл_меню:010

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

Замечу, что кнопки просмотра связанных разделов появляются в справочном окне автоматически, только от одного факта указания сноски “+” в текущем разделе. Чтобы вставить их независимо от этого, нужно выполнить макрокоманду BrowsButtons. Если макрокоманда выполнена, а текущий раздел не связан ссылкой “+” с другими разделами, кнопки появятся, но будут запрещены для выбора.



ИДЕНТИФИКАТОРЫ



6.2. ИДЕНТИФИКАТОРЫ

Идентификаторы в Object Pascal - это имена констант, переменных, меток, типов, объектов, классов, свойств, процедур, функций, модулей, программ и полей в записях. Идентификаторы могут иметь произвольную длину.

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

Примеры правильных идентификаторов:

a MyProgramIsBestProgram external
ALPHA date_27_sep_39 _beta

Примеры неправильных идентификаторов:

1 Program // начинается цифрой

block#l // содержит специальный символ

My Prog // содержит пробел

mod // зарезервированное слово



КОНСТАНТЫ



6.3. КОНСТАНТЫ

В качестве констант в Object Pascal могут использоваться целые, вещественные и шестнадцатеричные числа, логические константы, символы, строки символов, конструкторы множеств и признак непределенного указателя NIL.

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

Вещественные числа записываются со знаком или без него с использованием десятичной точки и/или экспоненциальной части.

Экспоненциальная часть начинается символом е или е, за которым могут следовать знаки “+” или “-” и десятичный порядок. Символ е (е) означает десятичный порядок и имеет смысл “умножить на 10 в степени”. Например,

3.14Е5 - 3,14 умножить на 10 в степени 5;

-17e-2 -минус 17 умножить на 10 в степени минус 2.

Если в записи вещественного числа присутствует десятичная точка, перед точкой и за ней должно быть хотя бы по одной цифре. Если используется символ экспоненциальной части е (в), за ним должна следовать хотя бы одна цифра десятичного порядка.[ Только для версий 4...6. Для версии 1 диапазон от -32536 до +32535. Для версии 2 и 3 от -2147483648 до +4294967294 ]

Шестнадцатеричное число состоит из шестнадцатеричных цифр, которым предшествует знак доллара $ (код символа 36). Диапазон шестнадцатеричных чисел - от $ffffffffffffffff до

$7FFFFFFFFFFFFFFF (для версии 4...6).

Логическая константа - это либо слово false (ложь), либо слово true (истина).

Символьная константа - это любой символ ПК, заключенный в апострофы:

'z' - символ “z”;

'Ф' - символ “Ф”.

Если необходимо записать собственно символ апострофа, он удваивается:

'''' - символ “'” (апостроф).

Допускается использование записи символа путем указания его внутреннего кода, которому предшествует символ # (код 35), например:

#97 - символ “а”;

#90 - символ “Z”;

#39 - символ “'”;

#13 - символ “CR”.

Строковая константа - любая последовательность символов (кроме символа CR - возврат каретки), заключенная в апострофы. Если в строке нужно указать сам символ апострофа, он удваивается, например:

'Это - строка символов';

'That''s string'.

Строка символов может быть пустой, т. е. не иметь никаких символов в обрамляющих ее апострофах. Строку можно составлять из кодов нужных символов с предшествующими каждому коду символами #, например, строка #83#i2i#i09#98#ii#i08 эквивалентна строке ' Symbol '.

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

#7'Ошибка !'#13'Нажмите любую клавишу ...'#7 .

Конструктор множества - список элементов множества, обрамленный-квадратными скобками,например:

[ 1,2,4..7,12]

[blue, red]

[ ]

[true]

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

abs lo ptr swap
chr odd round trunc
hi ord sizeof
length pred succ

Например:

const

MaxReal = Maxint div SizeOf(real) ;

NumChars = ord('Z') - ord('a') + 1;

Ln10 = 2.302585092994;

Ln10R = 1 / Ln10;



ВЫРАЖЕНИЯ



6.4. ВЫРАЖЕНИЯ

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

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

Примеры выражений:

у

21 (а + b) * с

sin(t)

а > 2

not Flag and (a = b)

NIL

[1, 3..7] * setl



ОПЕРАЦИИ



6.5. ОПЕРАЦИИ

В Object Pascal определены следующие операции:

унарные not, @ ;

мультипликативные *, /, div, mod, and, shi, shr;

аддитивные +, -, or, xor;

отношения =, <>, <, >, <=, >=, in.

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

Delphi переключателя Project | Options | Compiler | Complete

Boolean eval: при установленном переключателе вычисляются все операции отношения, при неустановленном - только те, что необходимы для однозначного определения результата исчисления.

Правила использования операций с операндами различного типа приводятся в табл. 6.1.

Таблица 6.1

Операция Действие Тип операндов Тип результата
not Отрицание Логический Логический
not To же Любой целый Тип операнда
@ Адрес Любой Указатель
* Умножение Любой целый Наименьший целый
* Тоже Любой вещественный Extended
* Пересечение множеств Множественный Множественный
/ Деление Любой вещественный Extended
div Целочисленное деление Любой целый Наименьший целый
mod Остаток от деления Тоже - Тоже
and Логическое И Логический Логический
and То же Любой целый Наименьший целый
shl Левый сдвиг Тоже То же
shr Правый сдвиг То же То же
+ Сложение Тоже Тоже
+ Тоже Любой вещественный Extended
+ Объединение множеств Множественный Множественный
+ Сцепление строк Строковый Строковый
- Вычитание Любой целый Наименьший целый
- Тоже Любой вещественный Extenden
or Логическое или Логический Логический
or Тоже Любой целый Наименьший целый
= Равно Любой простой или строковый Логический
0 Не равно Тоже Тоже
< Меньше Логический Логический
<= Меньше или равно Тоже Тоже
> Больше То же Тоже
>= Больше или равно Тоже Тоже

Унарная операция @ применяется к операнду любого типа и возвращает результат типа pointer (см. гл. 9), в котором содержится адрес операнда. Если операция @ применяется к процедуре, функции или методу в объекте, ее результатом будет адрес точки входа в эту процедуру (функцию, метод). Этот адрес можно использовать только в подпрограмме, написанной на Ассемблере, или во фрагментах

INLINE.

В Object Pascal определены следующие логические операции:

not - логическое НЕ;

and - логическое И;

or - логическое ИЛИ;

xor - исключительное ИЛИ.

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

Таблица 6.2

Логичеcкие операции над данными целого типа (поразрядно) 5
Операнд 1 Операнд 2 not and or xor
1 - 0 - - -
0 - 1 - - -
0 0 - 0 0 0
0 1 - 0 1 1
1 0 - 0 1 1
1 1 - 1 1 0

К логическим же в Object Pascal обычно относятся и две сдвиговые операции над целыми числами:

i shl j - сдвиг содержимого / на j разрядов влево; освободившиеся младшие разряды заполняются нулями;

i shr j - сдвиг содержимого i на j разрядов вправо; освободившиеся старшие разряды заполняются нулями.

В этих операциях i и у - выражения любого целого типа.

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

Таблица 6.3

Логические операции над данными логического типа
Операнд 1 Операнд 2 not and or xor
True - False - - -
False - True - - -
False False - False False False
False True - False True True
True False - False True True
True True - True True False

Операция отношения in применяется к двум операндам. Первым (левым) операндом должно быть выражение любого порядкового типа, вторым - множество, состоящее из элементов того же типа, или идентификатор множественного типа. Результат операции будет True, если левый операнд принадлежит множеству.



Секция ALIASES



21.4.6. Секция ALIASES

В этой секции можно указать псевдонимы идентификаторов разделов, с помощью которых можно модифицировать секцию Map без изменения RTF-файлов. Назначение кнопок Add, Remove, include и Edit такое же, как и в секции мар. После назначения псевдонима он может использоваться в секции мар вместо идентификатора раздела. Эта возможность облегчает модификацию справочной службы.