Система Pascal ABC

Система Pascal ABC предназначена для обучения программированию на языке Паскаль и ориентирована на школьников и студентов младших курсов.

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

Язык Паскаль признан многими российскими преподавателями как один из лучших именно для начального обучения. Однако, среда Borland Pascal, ориентированная на MS DOS, устарела, а среда Borland Delphi с ее богатыми возможностями сложна для начинающего программиста. Так, попытка начинать обучение с написания событийной программы в Borland Delphi вызывает у обучаемого массу сложностей и приводит к ряду неправильно сформированных навыков.

Система Pascal ABC основана на языке Delphi Pascal и призвана осуществить постепенный переход от простейших программ к модульному, объектно-ориентированному, событийному и компонентному программированию. Некоторые языковые конструкции в Pascal ABC допускают, наряду с основным, упрощенное использование, что позволяет использовать их на ранних этапах обучения. Например, в модулях может отсутствовать разделение на секцию интерфейса и секцию реализации. В этом случае модули устроены практически так же, как и основная программа, что позволяет приступить к их изучению параллельно с темой "Процедуры и функции". Тела методов можно определять непосредственно внутри классов (в стиле Java и C#), что позволяет создавать классы практически сразу после изучения записей, процедур и функций.

Ряд модулей системы программирования Pascal ABC специально создавался для учебных целей:

  • Модуль растровой графики GraphABC обходится без объектов, хотя его возможности практически совпадают с графическими возможностями Borland Delphi. Он доступен в несобытийных программах и позволяет легко создавать анимацию без мерцания.
  • Модуль Events позволяет создавать простейшие событийные программы без использования объектов (события представляют собой обычные процедурные переменные).
  • Модули Timers и Sounds позволяют создавать таймеры и звуки, которые также реализованы в процедурном стиле. Эти модули можно использовать даже в консольных программах.
  • Модуль контейнерных классов Containers позволяет работать с основными структурами данных (динамические массивы, стеки, очереди, множества), реализованными в виде классов.
  • Модуль векторной графики ABCObjects предназначен для быстрого изучения основ объектно-ориентированного программирования, а также позволяет создавать достаточно сложные игровые и обучающие программы.
  • Модуль визуальных компонентов VCL позволяет создавать событийные приложения с главной формой в стиле Delphi. Классы VCL немного упрощены по сравнению с аналогичными классами Delphi. Имеется редактор форм и инспектор объектов. Технология восстановления формы по коду программы позволяет обойтись для приложения с главной формой одним файлом (!).

В языке Pascal ABC имеются арифметические операции с типизированными указателями (в стиле языка C), а также тип complex, предназначенный для работы с комплексными числами.

Компилятор Pascal ABC является компилятором переднего плана (front-end). Это означает, что он не генерирует исполняемый код в виде .exe-файла, а создает в результате компиляции дерево программы в памяти, которое затем выполняется с помощью встроенного интерпретатора. В итоге скорость работы программы примерно в 20 раз медленнее скорости работы этой же программы, откомпилированной в среде Borland Pascal, и в 50 раз медленнее этой программы, откомпилированной в среде Borland Delphi.

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

Проверяемые задания реализованы в виде электронного задачника по программированию Programming Taskbook, содержащего 1000 задач по программированию разного уровня сложности (от простейших задач до задач на файлы, указатели и рекурсию) а также в виде исполнителей Робот и Чертежник, предназначенных для быстрого обучения основам программирования школьников младших и средних классов.

В свободно распространяемую версию Pascal ABC & Programming Taskbook Mini Edition входит мини-версия электронного задачника (200 задач) и урезанный комплект задач для исполнителей Робот и Чертежник. Версия Pascal ABC & Programming Taskbook Complete Edition содержит полный комплект задач.

Система Pascal ABC используется для обучения студентов первого курса механико-математического факультета, а также учащихся Компьютерной школы при механико-математическом факультете Ростовского госуниверситета (web-сайт http://sunschool.math.rsu.ru).


Об авторах

Автор системы Pascal ABC - доцент механико-математического факультета Ростовского государственного университета Станислав Станиславович Михалкович (e-mail miks@math.rsu.ru).

Автор электронного задачника Programming Taskbook - доцент механико-математического факультета Ростовского государственного университета Михаил Эдуардович Абрамян (e-mail mabr@math.rsu.ru).


Типы приложений в Pascal ABC

В Pascal ABC можно создавать следующие типы приложений:

Консольные приложения (вывод текста осуществляется в окно вывода, а ввод - из окна ввода);

Графические приложения (при подключении модуля GraphABC открывается специальное графическое окно, предназначенное для вывода графики);

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

Приложения Pascal ABC Forms (после подключения модуля vcl можно создавать формы, размещать на них компоненты и определять обработчики событий для каждого компонента; можно также воспользоваться дизайнером формы);

Приложения для электронного задачника Programming Taskbook (при подключении модуля PT4);

Приложения для Исполнителя Робот (при подключении модуля Robot);

Приложения для Исполнителя Чертежник (при подключении модуля Drawman).

Последние три типа приложений реализуют идею проверяемых заданий.

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

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


Новые возможности

Bерсия 3.0

  • Появилась возможность создавать задания для электронного задачника Programming Taskbook.
  • Появилась возможность создавать задания для школьных исполнителей Робот и Чертежник.
  • В справочную систему добавлено детальное описание процесса создания заданий для электронного задачника и исполнителей.
  • Количество задач в свободно распространяемой версии Pascal ABC & Programming Taskbook ME увеличено до 250.
  • Модуль ABCObjects изменил статус с "Beta" на "Release". В справочную систему добавлен обзор модуля ABCObjects и подробное описание его классов.
  • Добавлен модуль спрайтов ABCSprites.
  • Функцию можно вызывать как процедуру.
  • В пункте меню Сервис появилось окно настройки параметров редактора. Параметры редактора сохраняются в локальном файле ABC.ini.
  • В справочной системе появилось описание операторов try ... except, try ... finally и raise, а также описание механизма обработки исключений.
  • В модуле Utils появились функции ExtractFileName, ExtractFileExt, ChangeFileExt и ExtractFilePath.
  • В модуле Utils появилась функции FindFirstFile, FindFirstDirectory, FindNext и FindClose, а также запись SearchRec, предназначенные для перебора файлов и каталогов.
  • В модуле Sounds появился класс Sound, инкапсулирующий действия со звуками. Процедура SoundTime заменена на процедуру SoundLength. Процедура LoadSound осуществляет теперь поиск звукового файла вначале в текущем каталоге, а затем в каталоге PascalABC\Media\Sounds.
  • В модуле Timers появился класс Timer, инкапсулирующий действия с таймерами
  • В модуле GraphABC появился класс Picture, инкапсулирующий действия с рисунками.
  • В процедурах LoadPicture и SavePicture модуля GraphABC добавлена возможность работы с .jpg и .png файлами.
  • В модуле GraphABC появились процедуры CopyRect, FlipPictureHorizontal и FlipPictureVertical.
  • В модуле GraphABC в функции CreatePicture теперь нужно задавать ширину и высоту: n:=CreatePicture(w,h).
  • В модуле GraphABC процедура CopyToPicture(n,r) заменена на функцию CreatePictureFromRect(r), а процедура CopyScreenBufferToPicture(n,r) - на функцию CreatePictureFromScreenBufferRect(r).
  • В модуле GraphABC появилась функция PictureTransparent, процедуры NormalizeWindow, SetBrushPicture(filename), SetBrushPicture(n), FillWindow(filename), FillWindow(n).
  • В процедурах LoadPicture(filename), SetBrushPicture(filename), FillWindow(filename), LoadWindow(filename) модуля GraphABC поиск файла теперь осуществляется вначале в текущем каталоге, а затем в каталоге PascalABC\Media\Images.
  • Появилась стандартная процедура CopyMem, копирующая участок памяти. Процедура FillChar переименована в FillMem.
  • Страница примеров выделена из пункта меню Справка в отдельный пункт меню.

Bерсия 2.7.4

  • Появилась возможность совмещать графический вывод модулей GraphABC и ABCObjects.
  • Реализована стандартная функция Concat.
  • В модуле GraphABC появились новые процедуры: LockScreenBuffer, UnlockScreenBuffer, CopyScreenBufferToPicture и SetRedrawProc, ClearWindow(color).
  • Модуль ABCObjects разбит на модули ABCObjects, ABCAdditionalObjects, ABCButtons, ABCChessObjects, ABCRobots и ABCHouse.
  • В модуле ABCObjects свойство Hidden класса ObjectABC заменено на свойство Visible, добавлены свойства Filled, Bordered, Text, Number и RealNumber. Функция обращения к i-тому объекту Objects заменена на динамический массив объектов Objects, в результате чего вместо Objects(i) следует писать Objects[i]. Появились также новые классы RoundRectABC и RoundSquareABC.
  • В папке Samples\Games появился новый пример - игра в 15.
  • Устранена ошибка смены имени компонента в инспекторе объектов.

Bерсия 2.7.3

  • Оптимизирован интерпретатор, в результате чего скорость интерпретации программы увеличилась примерно на 10%.
  • В процедурах LoadPicture и SavePicture модуля GraphABC добавлена возможность работы с .gif-файлами.
  • В модуль GraphABC добавлены процедуры DrawPicture(n,x,y,r) и DrawPicture(n,x,y,w,h,r) позволяющие выводить часть рисунка, заключенную в прямоугольнике r.
  • Переписана страница справки с описанием системы программирования Pascal ABC.
  • Переписана страница справки модуля Events.

Bерсия 2.7.2

  • Появился стандартный тип word.
  • В модуль GraphABC добавлена процедура DrawPicture(n,x,y,w,h), позволяющая выводить рисунки с масштабированием и зеркальным отражением.
  • В класс PictureABC модуля ABCObjects добавлены свойства ScaleX и ScaleY.
  • Добавлены новые примеры: MazeGen.pas, gr_PictureScale.pas, gr_MovingObjects.pas и gr_Intersects1.pas.

Bе рсия 2.7

  • Появилась обработка исключений: операторы try ... except ... end, try ... finally ... end, on ... do, raise.
  • Добавлена стандартная процедура Assert.
  • Добавлен стандартный класс Exception - предок всех классов исключений.
  • Процедуры и функции без параметров можно теперь вызывать также в стиле языка C: p().
  • Добавлена стандартная процедура Halt.

Bерсия 2.6.5

  • Появился оператор безусловного перехода goto и ключевое слово label.
  • В модуле ABCObjects сделаны некоторые правки. В частности, класс GraphObjectABC переименован в класс ObjectABC и к нему добавлены поля dx, dy, используемые обычно для задания направления и скорости движения. Также функция клонирования Clone возвращает теперь объект ровно такого же типа, что и тип клонируемого объекта. Старая функция Clone переименована в Clone0. Наконец, функция доступа к i-тому объекту переименована из GraphABCObjects в Objects.
  • Улучшен инспектор объектов.
  • В дизайнер форм добавлены компоненты MainMenu и Shape.
  • Имя класса Label в модуле VCL заменено на TextLabel.

Bерсия 2.6.4

  • В модуле ABCObjects сделаны значительные правки, в частности, появился класс TextABC и в классе GraphObjectABC появился метод Intersect(g: GraphABCObject), позволяющий попиксельно проверять, пересекаются ли графические объекты.
  • В модуле GraphABC появилась функция ImageIntersect(n1,n2), позволяющая определить, пересекаются ли изображения рисунков с описателями n1 и n2.
  • В папке Samples/Recursion появился ряд примеров на использование рекурсии: Hanoi.pas - ханойские башни, FormulaCompiler.pas, FormulaInterpreter.pas - компилятор и интерпретатор формул, QuickSort.pas - алгоритм быстрой сортировки, TreeDraw.pas - рисование полного бинарного дерева, RandomSearchTree.pas - визуализация бинарного дерева поиска.

Bерсия 2.6.3

  • Появилась возможность обращаться к имени в модуле, используя запись ИмяМодуля.Имя.
  • Появилась возможность получить бесплатную лицензию на версию Pascal ABC & Programming Taskbook CE.
  • Дизайнер форм дополнен компонентами ComboBox, TrackBar, SpinEdit, OpenDialog, SaveDialog, ColorDialog.
  • Появился форум программы Pascal ABC, в котором вы можете обсудить ее достоинства и недостатки, а также получить ответ на интересующий вопрос: http://it.mmcs.rsu.ru.
  • Модуль CRT приобрел статус Release-версии.

Bерсия 2.6.2

  • Появилась константа Pi.
  • Изменен алгоритм поиска имен: вначале имя ищется в текущем модуле, а если не найдено, то в списке подключенных модулей в порядке справа налево (как в Delphi).
  • Изменен алгоритм поиска перегруженных имен подпрограмм.
  • Ускорен обратный реинженееринг формы по коду.

Bерсия 2.6

  • Появилась бета-версия дизайнера форм. Для создания формы требуется выбрать пункт меню Сервис/Создать форму. В дизайнере форм пока доступны следующие компоненты: Button, Label, Edit, Panel, GroupBox, TextBox, CheckBox, RadioButton, ListBox, PaintBox, Timer. При переключении с вкладки Форма на вкладку Программа происходит генерация текста программы, а при переключении с вкладки Программа на вкладку Форма происходит создание формы по тексту программы. Таким образом, бинарный файл формы отсутствует.
  • В модуль Timers добавлена функция TimerEnabled.
  • В модуль Utils добавлены процедуры ShowMessage и FreeAndNil.

Bерсия 2.5.3

  • В модуль CRT добавлены процедуры ScrollingOff и ScrollingOn.
  • В модуль Utils добавлена функция PascalABCPath.
  • В модуль Timers добавлена функция CreateTimerExt.
  • Добавлена стандартная процедура Halt.
  • Тестируется подключение к сетевому хранилищу программ. При запуске Pascal ABC отправляет сообщение серверу. Никакая конфиденциальная информация не пересылается.
  • Появилась бета-версия модуля CRT.
  • Появились константные параметры.

Bерсия 2.5

  • Система Pascal ABC разделена на свободно распространяемую и полную версии. В полную версию включена полная версия электронного задачника Programming Taskbook (1000 задач), и 200 задач для исполнителей Робот и Чертежник. В свободно распространяемую версию входит мини-версия электронного задачника Programming Taskbook (200 задач) и по 4 задания из каждой темы для исполнителей Робот и Чертежник.
  • В модуле GraphABC появились новые процедуры и функции: SetPictureSize, SetPictureTransparent, SetDrawingSuraface, RestoreDrawingSuraface, LockDrawing, UnlockDrawing, IsDrawingLocked, Redraw.
  • В папке Samples\ABCObjects появилась бета-версия модуля ABCObjects, позволяющего обучать азам объектно-ориентированного программирования. На странице примеров опубликованы примеры использования модуля ABCObjects.
  • Появились типизированные константы (в частности, константы-массивы и константы-записи).

Bерсия 2.4

  • Существенно улучшено окно трассировки. При трассировке отображается тип переменной, возможно перетаскивание выражения в окно трассировки; неправильные выражения и выражения, вычисление которых вызывает исключение, сопровождаются фразой "нельзя вычислить". Разрешена трассировка секций инициализации и финализации модулей. Запрещена трассировка обработчиков событий.
  • При возникновении ошибки во время выполнения программы курсор позиционируется в строку, где произошла ошибка. Если ошибка произошла в пользовательском модуле, то файл модуля открывается в редакторе.
  • Убрана приставка "бета-версия" у модуля VCL. С этого момента имена классов, методов, свойств в модуле VCL считаются устоявшимися и практически не будут меняться.

Bерсия 2.3

  • В справочной системе появился указатель.
  • Помощь стала контекстной: если в редакторе нажимается F1, то вызывается пункт справки, соответствующий слову, на котором расположен курсор.

Bерсия 2.2

  • Появилась возможность определять методы классов как внутри, так и вне класса.
  • Все задания Begin, Integer, Boolean электронного задачника Programming Taskbook можно выполнять без регистрации.
  • В классах IntSet, RealSet, StringSet, ObjectSet модуля Containers метод Insert заменен на Include, добавлен метод Exclude и метод Embed.

Bерсия 2.1

  • В классах появились уровни видимости public, private и protected.
  • Типы TPoint и TRect переименованы в Point и Rect, функции для их создания - в PointF и RectF соответственно.
  • В модуле GraphABC появились новые процедуры и функции: ScreenWidth, ScreenHeight, CenterWindow, MaximizeWindow, CreatePicture, CopyToPicture, SavePicture.
  • Поменялся ряд имен в модуле VCL. Пополнен раздел справочной системы о модуле VCL.
  • В StringArray добавлены методы LoadFromFile и SaveToFile.

Bерсия 2.0

  • Добавлена бета-версия модуля визуальных компонентов VCL.
  • В справочной системе появился новый раздел Проверяемые задания.
  • Добавлены индексные свойства классов.

Bерсия 1.9

  • Задачник Programming Taskbook интегрирован в исполняемый файл программы PascalABC.exe.
  • Добавлены свойства классов.
  • Добавлен модуль Utils.
  • Переработан модуль Containers.
  • Типы TPoint и TRect перенесены в модуль GraphABC.
  • В модуль GraphABC добавлены функции Point, Rect, PtInRect, EqualRect, IntersectRect и процедура InflateRect.

Версия 1.8

  • Появился модуль Containers.
  • Добавлен метод ToString к классу Object.

Версия 1.7

  • Появилась переменная Self.
  • Появились процедуры Polygon и Polyline в модуле GraphABC.


Версии и получение лицензии

Pascal ABC (полное название - Pascal ABC & Programming Taskbook ME). Freeware. Содержит мини-версию электронного задачника Programming Taskbook Mini Edition (250 задач), а также урезанный комплект задач для исполнителей Робот и Чертежник (по четыре задания из каждой группы задач). Не требует получения лицензии.

Pascal ABC & Programming Taskbook CE. Содержит электронный задачник Programming Taskbook Complete Edition (1000 задач), а также полный комплект задач для исполнителей Робот и Чертежник (200 задач). Подробности приобретения данной версии можно узнать, отправив электронное письмо по одному из адресов:

mabr@math.rsu.ru - Абрамян Михаил Эдуардович (автор электронного задачника Programming Taskbook)

miks@math.rsu.ru - Михалкович Станислав Станиславович (автор системы программирования Pascal ABC)

Если вы используете Pascal ABC в некоммерческих целях, то вы можете бесплатно получить лицензию на версию Pascal ABC & Programming Taskbook CE на 1 компьютер, если опубликуете на вашей персональной Интернет-странице (на сайте вашей школы, колледжа, другого образовательного учреждения) ссылку на страницу программы Pascal ABC. В этом случае после проверки мы вышлем вам регистрационный код, открывающий несколько групп заданий из электронного задачника, а также задания для исполнителей Робот и Чертежник. Для преподавателей, опубликовавших ссылку на страницу Pascal ABC на сайте своего образовательного учреждения, мы присылаем ключ, открывающий группы заданий If, Case, For, While, Series, Proc; для остальных категорий пользователей - группы заданий If, Case, For, While.

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

Алгоритм получения лицензии на программу Pascal ABC & Programming Taskbook CE.

1. Опубликуйте на вашей персональной Интернет-странице (на вашем сайте, сайте вашего образовательного учреждения) ссылку на страницу программы Pascal ABC. Ссылка должна содержать название "Pascal ABC" и некоторый текст об использовании этой системы программирования лично Вами или в вашем учебном заведении. Ссылка не должна содержаться среди большого количества других ссылок - она должна выделяться логически и структурно. Сопроводительный текст может быть коротким, но должен пояснять назначение программы, а также то, для чего вы ее используете. Например:

а) Pascal ABC - система программирования на языке Паскаль, используемая мной для изучения программирования.

б) Для изучения программирования я использую систему Pascal ABC.

в) Для обучения программированию на уроках информатики в 9-11 классах нашей школы используется система программирования Pascal ABC.

г) Я вхожу в сообщество пользователей системы программирования Pascal ABC.

2. Вышлите на электронный адрес автора Pascal ABC письмо, содержащее ссылку на данную страницу, укажите в письме ваши ФИО и статус (для обучающихся - где учитесь, работаете; для преподавателей - где и что преподаете).

3. Дождитесь ответного письма с регистрационным кодом.

4. Зарегистрируйте программу Pascal ABC & Programming Taskbook CE.


Сообщество пользователей Pascal ABC

Мы начинаем формировать сообщество пользователей системы программирования Pascal ABC.

Для вас открыт форум http://it.mmcs.rsu.ru/forum. Обсуждайте, критикуйте, предлагайте.

Мы будем рады увидеть на вашей Интернет-странице ссылку на страницу программы Pascal ABC. Для опубликовавших такую ссылку предусмотрены определенные бонусы (получение бесплатной лицензии на версию Pascal ABC & Programming Taskbook CE), хотя вы можете опубликовать ссылку и без всяких бонусов.


Что такое проверяемые задания

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

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

Итак, что такое проверяемые задания и как их выполнять в системе Pascal ABC?

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

Пример 1. Задание Begin3 из электронного задачника Programming Taskbook.

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

Пример 2. Задание a1 для исполнителя Робот.

Следует обратить внимание на одну особенность программ для исполнителя Робот: команды программы выполняются Роботом не сразу, а заносятся в его память (то есть Робот программируется). После завершения программы можно запустить Робота, и он будет исполнять заложенные в него команды.

Пример 3. Задание Mix53 (String9) из электронного задачника Programming Taskbook.

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

Пример 4. Задание Mix61 (File48) из электронного задачника Programming Taskbook.

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

Пример 5. Задания группы Dynamic из электронного задачника Programming Taskbook.

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


Выполнение задания Begin3

Задание Begin3. Даны стороны прямоугольника a и b. Найти его площадь S=a*b и периметр P=2*(a+b).

Далее по шагам опишем сценарий решения задания в системе Pascal ABC.

Шаг 1. Для выполнения заданий из электронного задачника подключим к программе модуль PT4 и вызовем в начале программы процедуру Task, передав ей в качестве параметра имя задания:

uses PT4;
begin
  Task('Begin3');

end.

Чтобы не набирать указанный текст, нажмем кнопку [image] и в появившемся окне

в строке ввода «Задание» введем «Begin3» и нажмем Enter. После этого указанный выше текст сгенерируется автоматически и сохранится в файле Begin3.pas в рабочем каталоге системы Pascal ABC (по умолчанию C:\PABCWork).

Запустим программу (F9), чтобы увидеть на экране текст задания:

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

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

uses PT4;
var a,b: integer;
begin
  Task('Begin3');
  read(a,b);
end.

и повторно запустим программу:

Как видим, исходные данные поменялись и появилось сообщение об ошибке - переменные a и b должны быть объявлены как вещественные.

Шаг 3. Исправим тип исходных данных

uses PT4;
var a,b: real;
begin
  Task('Begin3');
  read(a,b);
end.

и вновь запустим программу:

Электронный задачник предупреждает, что не выведен результат.

Шаг 4. Проведем вычисления и выведем результирующие данные, но в неверном порядке:

uses PT4;
var a,b,S,P: real;
begin
  Task('Begin3');
  read(a,b);
  S:=a*b;
  P:=2*(a+b);
  write(P,S)
end.

Вновь запустим программу:

Верное решение можно посмотреть, переключившись на вкладку «Пример верного решения». Эта вкладка отображается сразу при первом запуске, когда не была выполнена ни одна операция ввода-вывода (см. шаг 1).

Шаг 5. Исправим ошибку:

uses PT4;
var a,b,S,P: real;
begin
  Task('Begin3');
  read(a,b);
  S:=a*b;
  P:=2*(a+b);
  write(S,P)
end.

После запуска программы увидим следующее окно:

Шаг 6. Чтобы задание считалось выполненным, запустим программу несколько раз до появления сообщения «Задание выполнено!».

Шаг 7. Можно посмотреть результаты выполнения заданий, нажав кнопку [image].

Уф, поздравляем! Задание Begin3 под руководством электронного задачника выполнено!


Выполнение задания RBa1

Задание a1 для исполнителя Робот. Закрасить помеченные клетки.

Опишем сценарий решения задания.

Шаг 1. Подключим к программе модуль Robot и вызовем в начале программы процедуру Task, передав ей в качестве параметра имя задания:

uses Robot;
begin
  Task('a1');

end.

Чтобы не набирать указанный текст, нажмем кнопку [image] и в появившемся окне наберем имя задания RBa1 (префикс RB означает, что решается задача для Робота). Запустим программу (F9), чтобы увидеть окно Робота с графическим изображением задания:

Шаг 2. Наберем несколько команд Робота:

uses Robot;
begin
  Task('a1');
  Right;Right;Right;Right;
end.

Запустим программу, после чего нажмем Enter или кнопку «Пуск» чтобы Робот наяал выполнять заложенную в него программу:

После окончания движения Робота осуществляется проверка, все ли помеченные клетки закрашены и находится ли Робот в конечной клетке. Поскольку это не выполняется, то задание не считается выполненным. Можно повторить путь Робота, нажав кнопку «Заново» и вновь кнопку «Пуск».

Шаг 3. Выполним неверную команду, в результате которой Робот врежется в стенку:

uses Robot;
begin
  Task('a1');
  Right;Right;Right;Right;
  Up;Up;Left;
end.

После запуска программы и нажатия Enter получим следующее окно:

Заметим, что состояние Робота окрасилось в красный цвет, и последняя команда Left не выполнилась - после фатальной ошибки Робот прекратил выполнение задания.

Шаг 4. Исправим ошибку и выполним задание до конца:

Последний рисунок не нуждается в комментариях.

Обратим внимание, что информацию о выполненном задании также можно просмотреть, нажав кнопку [image].


Выполнение задания на обработку строк

Шаг 1. Создание программы-заготовки и знакомство с заданием.

В качестве примера задания на обработку строк рассмотрим задание Mix53 (String9 в версии Pascal ABC & Programming Taskbook).

Программу-заготовку для решения этого задания можно создать с помощью команды меню «Сервис | Создать шаблон программы», кнопки [image] или клавиатурной комбинации Shift-Ctrl-L. Эта заготовка будет иметь следующий вид:

uses PT4;

begin
  Task('Mix53');

end.

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

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

Шаг 2. Ввод исходных данных.

Добавим в программу фрагмент, обеспечивающий ввод исходных данных:

uses PT4;
var
  n: integer;
  c1, c2: char;
begin
  Task('Mix53');
  read(c1, c2, n);
end.

Мы намеренно ввели данные не в том порядке, в котором они указаны в окне задачника.

Запуск нового варианта программы уже не будет считаться ознакомительным, поскольку в программе выполняется ввод исходных данных. Так как порядок ввода исходных данных является ошибочным, этот вариант решения будет признан неверным и приведет к сообщению «Неверно указан тип при вводе исходных данных»:

Общее правило, определяющее порядок ввода и вывода данных для задачника Programming Taskbook гласит: ввод и вывод данных производится по строкам (слева направо), а строки просматриваются сверху вниз. Иными словами, данные, отображаемые в окне задачника, вводятся и выводятся в том порядке, в котором читается обычный текст.

Исправим нашу программу, изменив порядкок параметров в процедуре ввода:

  read(n, c1, c2);

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

Шаг 3. Формирование и вывод требуемой строки.

Для формирования нужной строки воспользуемся операцией + (сцепления строк):

uses PT4;
var
  n, i: integer;
  c1, c2: char;
  s: string;
begin
  Task('Mix53');
  read(n, c1, c2);
  s := '';
  for i := 1 to n do
    s := s + c1 + c2;
  write(s);
end.

Заметим, что в операторе s := '' нет необходимости, так как все глобальные переменные в Паскале автоматически инициализируются «нулевыми» значениями (для числовых данных это обычные нули, для символов — это символ #0, для строк — пустая строка '').

Результат выполнения этой программы будет следующим:

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

Замечание. Красная звездочка может появиться и при выводе ошибочных числовых данных. Например, если ожидается целое число в диапазоне от 1 до 99, а получено число 10000, то на экране изобразится первая цифра этого большого числа, за которой будет указана красная звездочка: 1*.

Шаг 4. Верное решение.

Ошибка в предыдущей программе возникла из-за неверного указания количества итераций цикла. Действительно, на каждой итерации к строке добавляется по два символа, поэтому после n итераций строка будет содержать 2*n символов (а не n, как требуется в задании).

Для исправления ошибки достаточно вдвое уменьшить число итераций:

uses PT4;
var
  n, i: integer;
  c1, c2: char;
  s: string;
begin
  Task('Mix53');
  read(n, c1, c2);
  s := '';
  for i := 1 to n div 2 do
    s := s + c1 + c2;
  write(s);
end.

После запуска этого варианта мы получим сообщение «Верное решение. Тест номер 1 (из 5)», а после пяти подобных запусков — сообщение «Задание выполнено!»:

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

uses PT4;
var
  n, i: integer;
  c1, c2: char;
  s: string;
begin
  Task('Mix53');
  read(n, c1, c2);
  SetLength(s, n);
  for i := 1 to n div 2 do
  begin
    s[2*i-1] := c1;
    s[2*i] := c2;
  end;
  write(s);
end.

Обратите внимание на процедуру SetLength(s, n), которая обеспечивает правильную настройку длины результирующей строки s. Без вызова этой процедуры программа работала бы неверно, так как любая глобальная строковая переменная инициализируется пустой строкой, а при работе с отдельными символами строки корректировка ее длины не производится.

Шаг 5. Просмотр результатов выполнения задания.

С помощью команды меню «Сервис | Просмотреть результаты», кнопки [image] или клавиатурной комбинации Shift-Ctrl-R мы можем вывести на экран окно результатов, в котором будет перечислены все наши попытки решения задания:

Mix53     a24/03 11:37 Ознакомительный запуск.
Mix53     a24/03 11:48 Неверно указан тип при вводе исходных данных.
Mix53     a24/03 11:49 Выведены не все результирующие данные.
Mix53     a24/03 11:49 Ошибочное решение.
Mix53     a24/03 11:52 Задание выполнено!


Выполнение задания на обработку файлов

Шаг 1. Создание программы-заготовки и знакомство с заданием.

В качестве примера задания на обработку файлов рассмотрим задание Mix61 (File48 в версии Pascal ABC & Programming Taskbook).

Напомним, что программу-заготовку для решения этого задания можно создать с помощью команды меню «Сервис | Создать шаблон программы», кнопки [image] или клавиатурной комбинации Shift-Ctrl-L. Эта заготовка будет иметь следующий вид:

uses PT4;

begin
  Task('Mix61');

end.

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

В первой строке раздела исходных данных указаны имена трех исходных файлов (SA, SB и SC) и одного результирующего (SD). В трех последних строках раздела исходных данных показано содержимое исходных файлов. Для отображения содержимого каждого файла отводится по одной строке. Элементы файлов отображаются бирюзовым цветом, чтобы подчеркнуть их отличие от обычных исходных данных (желтого цвета) и комментариев (светло-серого цвета).

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

Для прокрутки содержимого файла с помощью мыши достаточно щелкнуть на одной из двух кнопок, расположенных справа от строки с содержимым нужного файла. С помощью клавиатуры можно выполнять поэлементную или «постраничную» прокрутку. Для поэлементной прокрутки используются клавиши со стрелками Right или Down (прокрутка вперед) и Left или Up (прокрутка назад); для «постраничной» прокрутки, обеспечивающей переход к новой «порции» элементов, умещающейся на экранной строке, используются клавиши Ctrl-Right или PgDn (прокрутка вперед) и Ctrl-Left или PgUp (прокрутка назад). Кроме того, клавиша Home обеспечивает перемещение на начало, а клавиша End — на конец файла.

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

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

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

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

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

Шаг 2. Ввод части исходных данных.

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

uses PT4;
var
  i: integer;
  s: string;
  f: array[1..4] of file of integer;
begin
  Task('Mix61');
  for i := 1 to 3 do
  begin
    read(s);
    Assign(f[i], s);
  end;
end.

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

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

Шаг 3. Ввод всех исходных данных без создания требуемого файла.

Изменим программу, заменив в заголовке цикла число 3 на 4, и вновь запустим программу. Теперь все данные, необходимые для выполнения задания, введены в программу. Однако задание не выполнено, поскольку результирующий файл не создан. Поэтому решение опять признано ошибочным с диагностикой «Результирующий файл не найден»:

Шаг 4. Пример программы, приводящей к ошибке времени выполнения.

Добавим в тело цикла после процедуры Assign вызов процедуры Reset, обеспечивающий открытие существующего файла:

uses PT4;
var
  i: integer;
  s: string;
  f: array[1..4] of file of integer;
begin
  Task('Mix61');
  for i := 1 to 4 do
  begin
    read(s);
    Assign(f[i], s);
    Reset(f[i]);
  end;
end.

Теперь запуск программы приведет к следующему сообщению об ошибке: «Error EInOutError: File not found»:

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

Сообщение об ошибке времени выполнения появится и в области вывода окна системы Pascal ABC, причем это сообщение будет содержать текст на русском языке:

Шаг 5. Создание пустого результирующего файла.

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

uses PT4;
var
  i: integer;
  s: string;
  f: array[1..4] of file of integer;
begin
  Task('Mix61');
  for i := 1 to 4 do
  begin
    read(s);
    Assign(f[i], s);
    if i < 4 then Reset(f[i])
    else Rewrite(f[i]);
  end;
  { * }
  for i := 1 to 4 do
    Close(f[i]);
end.

Комментарий { * } расположен в том месте программы, в котором можно выполнять операции ввода-вывода для всех четырех файлов: они уже открыты процедурами Reset или Rewrite и еще не закрыты процедурой Close.

Запуск этого варианта программы не приведет к ошибке времени выполнения; более того, результирующий файл будет создан. Однако созданный файл останется пустым, то есть не содержащим ни одного элемента. Поэтому при запуске программы на информационной панели появится сообщение «Ошибочное решение», а в строке, которая должна содержать элементы результирующего файла, появится текст EOF: (особое значение EOF для указателя текущей файловой позиции означает, что данный файл существует, но не содержит ни одного элемента):

Шаг 6. Пример программы, использующей неправильные типы для файловых данных.

Во всех ранее рассмотренных вариантах программы мы не использовали операции ввода-вывода для файлов. Поэтому тип файлов не играл никакой роли: вместо типа file of integer мы могли использовать любой другой файловый тип, например, file of real, и результат выполнения программы был бы тем же самым.

Тип файловых элементов становится принципиально важным, если в программе используются операции ввода-вывода для данного файла. Чтобы продемонстрировать это на примере нашей программы, внесем в нее следующие изменения: в описании массива f файловых переменных тип integer заменим на real, в раздел описаний добавим описание переменной a типа real, в раздел операторов (в позицию, помеченную комментарием { * }) добавим следующий фрагмент:

for i := 1 to 3 do
begin
  read(f[i], a);
  write(f[4], a);
end;

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

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

Судя по экранной строке с содержимым результирующего файла, в него будут записаны не три, а шесть элементов, по два начальных элемента из каждого исходного файла. Объясняется это тем, что после связывания файлов с файловыми переменными типа file of real элементами файлов стали считаться вещественные числа (занимающие в памяти по 8 байтов), тогда как «на самом деле», то есть по условию задания, элементами файлов являются целые числа (занимающие в памяти по 4 байта). Поэтому считывание из файла и последующая запись в файл одного «вещественного элемента» фактически приводит к считыванию и записи блока данных размером 8 байтов, содержащего два последовательных целочисленных элемента исходного файла.

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

Шаг 7. Исправление ошибки, связанной с неверными типами файловых данных.

Заменим в нашей программе все описания real на integer:

uses PT4;
var
  i: integer;
  s: string;
  f: array[1..4] of file of integer;
  a: integer;
begin
  Task('Mix61');
  for i := 1 to 4 do
  begin
    read(s);
    Assign(f[i], s);
    if i < 4 then Reset(f[i])
    else Rewrite(f[i]);
  end;
  for i := 1 to 3 do
  begin
    read(f[i], a);
    write(f[4], a);
  end;
  for i := 1 to 4 do
    Close(f[i]);
end.

Мы получим все еще неверное, но вполне «понятное» решение: первые три элемента результирующего файла совпадают с контрольными (то есть «правильными»), а прочие элементы отсутствуют:

Шаг 8. Верное решение.

Приведем, наконец, верное решение задания Mix61:

uses PT4;
var
  i, a: integer;
  s: string;
  f: array[1..4] of file of integer;
begin
  Task('Mix61');
  for i := 1 to 4 do
  begin
    read(s);
    Assign(f[i], s);
    if i < 4 then Reset(f[i])
    else Rewrite(f[i]);
  end;
  while not Eof(f[1]) do
    for i := 1 to 3 do
    begin
      read(f[i], a);
      write(f[4], a);
    end;
  for i := 1 to 4 do
    Close(f[i]);
end.

От предыдущего варианта данное решение отличается добавлением заголовка цикла while not Eof(f[1]) do, который обеспечивает считывание всех элементов из исходных файлов (напомним, что по условию задания все исходные файлы имеют одинаковый размер) и запись их в результирующий файл в нужном порядке. После запуска этого варианта мы получим сообщение «Верное решение. Тест номер 1 (из 5)», а после пяти подобных запусков — сообщение «Задание выполнено!»:

Шаг 9. Просмотр результатов выполнения задания.

С помощью команды меню «Сервис | Просмотреть результаты», кнопки [image] или клавиатурной комбинации Shift-Ctrl-R мы можем вывести на экран окно результатов, в котором будет перечислены все наши попытки решения задания:

Mix61      a24/03 12:15 Ознакомительный запуск.
Mix61      a24/03 12:16 Введены не все требуемые исходные данные.
Mix61      a24/03 12:17 Результирующий файл не найден.
Mix61      a24/03 12:18 Error EInOutError.
Mix61      a24/03 12:19 Ошибочное решение.--3
Mix61      a24/03 12:21 Задание выполнено!


Выполнение заданий на указатели и динамические структуры данных

Пример 1. Анализ существующей динамической структуры

В заданиях группы Dynamic мы встречаемся с двумя новыми видами данных: это динамические структуры, реализованные в виде цепочек связанных друг с другом записей типа TNode, и указатели типа PNode на записи TNode: PNode = ^TNode. Типы TNode и PNode не являются стандартными типами языка Паскаль; они определены в задачнике Programming Taskbook следующим образом:

type
  PNode = ^TNode;
  TNode = record
    Data: integer;
    Next: PNode;
    Prev: PNode;
  end;

Рассмотрим на примере задания Mix82 (Dynamic2 в версии Pascal ABC & Programming Taskbook) особенности, связанные с использованием этих новых типов данных.

Шаг 1. Создание программы-заготовки и знакомство с заданием.

Программа-заготовка для задания Mix82 (Dynamic2), созданная с помощью команды меню «Сервис | Создать шаблон программы», кнопки [image] или клавиатурной комбинации Shift-Ctrl-L, имеет следующий вид:

uses PT4;

begin
  Task('Mix82');

end.

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

Это окно содержит в качестве исходных и результирующих данных новые элементы: динамические структуры и указатели.

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

Рассмотрим в качестве примера динамическую структуру, указанную на рисунке:

 P1
 97 - 94 - 10 - 14 - 25 >nil

Этот текст означает, что структура состоит из 5 элементов, причем ее первый элемент имеет поле Data, равное 97, и связан с помощью своего поля Next со вторым элементом, поле Data которого равно 94, и так далее до последнего, пятого элемента, поле Data которого равно 25, а поле Next равно nil, что является признаком завершения структуры. Таким образом, текст, описывающий данную динамическую структуру, является максимально упрощенным вариантом следующей схемы:

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

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

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

P1 = ptr

Здесь текст P1 = является комментарием и выделяется, как обычный комментарий, светло-серым цветом, а текст ptr означает, что этот элемент исходных данных является указателем, который надо ввести в программу с помощью процедуры ввода read.

Замечание. Может возникнуть вопрос: почему вместо условного текста «ptr» не отображается «настоящее» значение указателя (то есть некоторый четырехбайтный адрес)? Это связано с тем, что, даже выведя это значение на экран, мы не сможем определить, с какими данными связан этот адрес, поэтому подобная информация на экране будет излишней.

Итак, слово ptr в разделе исходных или результирующих данных означает, что соответствующий элемент данных является указателем, причем непустым (для пустого указателя используется слово nil). Определить, с каким элементом динамической структуры данных связан непустой указатель, можно по экранной информации об этой динамической структуре. Разумеется, при чтении указателя программа учащегося получит «настоящий» адрес, с помощью которого она сможет обратиться к исходной динамической структуре.

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

Шаг 2. Приступаем к решению.

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

Приведем вначале неполное решение задания, выводящее все необходимые данные, кроме указателя на последний элемент:

uses PT4;
var
  P1: PNode;
  n: integer;
begin
  Task('Mix82');
  read(P1);
  n := 0;
  while P1 <> nil do
  begin
    write(P1^.Data);
    Inc(n);
    P1 := P1^.Next;
  end;
  write(n);
end.
После запуска программы можно убедиться, что все числовые результирующие данные определены правильно, однако из-за того, что не выведен указатель на последний элемент, решение признано ошибочным с диагностикой «Выведены не все результирующие данные»:

Добавим в конец программы оператор

write(P1);
После запуска нового варианта программы все требуемые данные будут выведены, однако результирующее значение указателя будет равно nil. Это связано с тем, что после завершения цикла while в переменной P1 содержится нулевой указатель, а не указатель на последний элемент динамической структуры:

Шаг 3. Правильное решение.

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

uses PT4;
var
  P1, P2: PNode;
  n: integer;
begin
  Task('Mix82');
  read(P1);
  n := 0;
  while P1 <> nil do
  begin
    write(P1^.Data);
    Inc(n);
    P2 := P1;       { сохраняем адрес текущего элемента }
    P1 := P1^.Next; { и переходим к следующему элементу }
  end;
  write(n, P2);
end.

Запустив эту программу три раза, мы получим сообщение «Задание выполнено!»:

Пример 2. Добавление элемента к динамической структуре

Шаг 1. Знакомство с заданием.

Рассмотрим простейшее задание, связанное с добавлением элемента к динамической структуре-стеку: Mix83 (Dynamic3 в версии Pascal ABC & Programming Taskbook).

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

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

Шаг 2. Приступаем к решению.

Что произойдет, если динамическая структура будет создана с ошибками? Для того, чтобы это выяснить, вернем в программе, решающей задание Mix83, указатель на прежнюю вершину стека, не добавляя к ней новый элемент:

uses PT4;
var
  d: integer;
  P1: PNode;
begin
  Task('Mix83');
  read(d, P1);
  write(P1);
end.

В результате, если исходный стек содержал, к примеру, четыре элемента со значениями 95, 91, 22 и 26, то полученный стек будет отображен на экране следующим образом:

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

Шаг 3. Правильное решение.

Для получения правильного решения задания Mix83 необходимо явно выделить память для нового элемента, используя процедуру New, и заполнить поля этого элемента, связав его с текущей вершиной стека (в результате сам этот элемент станет новой вершиной, адрес которой и следует вывести):

uses PT4;
var
  d: integer;
  P1, P2: PNode;
begin
  Task('Mix83');
  read(d, P1);
  New(P2);
  P2^.Data := D;
  P2^.Next := P1;
  write(P2);
end.
Приведем вид окна задачника при первом запуске этой программы:

Пример 3. Удаление элемента из динамической структуры

Шаг 1. Знакомство с заданием.

Рассмотрим простейшее задание на удаление элемента из динамической структуры — Mix84 (Dynamic5 в версии Pascal ABC & Programming Taskbook)). В нем требуется удалить из стека вершину и вернуть указатель на новую вершину, то есть на элемент, расположенный непосредственно за удаленным.

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

Для того, чтобы напомнить учащемуся о необходимости уничтожения некоторых элементов исходной динамической структуры, эти элементы выделяются на экране синим цветом меньшей яркости, чем обычные элементы (на рисунке таким способом выделен элемент 66):

Шаг 2. Приступаем к решению.

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

uses PT4;
var
  P1: PNode;
begin
  Task('Mix84');
  read(P1);
  write(P1^.Data, P1^.Next);
end.
Несмотря на то, что все результирующие данные будут совпадать с контрольными (то есть текст на вкладках «Полученные результаты» и «Пример верного решения» будет одинаковым), на информационной панели появится сообщение об ошибке «Не освобождена динамическая память», а в разделе исходных данных будет выделен красным цветом тот элемент, который требовалось удалить:

Шаг 3. Правильное решение.

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

uses PT4;
var
  P1: PNode;
begin
  Task('Mix84');
  read(P1);
  write(P1^.Data, P1^.Next);
  Dispose(P1);
end.
Приведем вид окна задачника при первом запуске этой программы:

Пример 4. Двусвязные динамические структуры

Шаг 1. Знакомство с заданием.

Особенности работы с двусвязными динамическими структурами рассмотрим на примере задания Mix88 (Dynamic30 в версии Pascal ABC & Programming Taskbook), в котором требуется преобразовать исходную односвязную структуру в двусвязную. Запустив программу-заготовку, созданную для этого задания, мы увидим в области исходных данных информацию об «обычной» односвязной структуре, подобной рассмотренным в предыдущих примерах:

Динамическая структура, приведенная в разделе результатов, имеет две особенности: во-первых, ее элементы связаны символом =, а во-вторых, перед первым элементом присутствует текст nil<.

Это означает, что результирующая структура является двусвязной, то есть каждый ее элемент связан не только с последующим элементом (с помощью поля Next, как в односвязной структуре), но и с предыдущим элементом (с помощью нового поля Prev), а поле Prev первого элемента имеет значение nil:

Шаг 2. Приступаем к решению.

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

uses PT4;
var
  P1, P: PNode;
begin
  Task('Mix88');
  read(P1);
  P := P1^.Next;
  while P <> nil do
  begin
    P^.Prev := P1;
    P1 := P1^.Next;
    P := P^.Next;
  end;
  write(P1); { вывод указателя на последний элемент }
end.
В этой программе мы определили поля Prev для всех элементов, кроме первого. Поэтому решение будет считаться ошибочным (обратите внимание на то, что перед первым элементом полученного списка отсутствует текст nil<):

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

                         P2
nil< 33 = 64 - 78 = 12 = 51 >nil

Это означает, что между вторым и третьим элементом структуры имеется не двойная, а одинарная связь (поле Next второго элемента содержит адрес третьего элемента, а поле Prev третьего элемента не содержит адрес второго).

Шаг 3. Правильное решение.

Для получения правильного решения достаточно добавить в программу перед циклом while следующий оператор:

  P1^.Prev := nil;
Приведем вид окна задачника при первом запуске исправленной программы:

Пример 5. Циклические динамические структуры

Шаг 1. Знакомство с заданием.

Динамическая структура называется циклической, если она замкнута в «кольцо», то есть ее последний элемент связан полем Next с первым (в случае двусвязной структуры требуется также, чтобы ее первый элемент был связан полем Prev с последним элементом). Простейшим заданием на циклические структуры является Mix90 (Dynamic55 в версии Pascal ABC & Programming Taskbook), в котором требуется преобразовать обычный двусвязный список в циклический.

Запустив программу-заготовку для этого задания, мы увидим на экране изображение двух динамических структур, причем исходная структура является «обычным» двусвязным списком, а результирующая структура — циклическим двусвязным списком:

Обозначения << = и = >> позволяют отличить циклический список от обычного (напомним, что у обычного двусвязного списка поле Prev первого элемента и поле Next последнего элемента равны nil).

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

Шаг 2. Приступаем к решению.

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

uses PT4;
var
  P1, P2: PNode;
begin
  Task('Mix90');
  read(P1);
  P2 := P1;
  while P2^.Next <> nil do
    P2 := P2^.Next;
  P2^.Next := P1;
  write(P2);
end.

В данном варианте решения мы «забыли» о том, что надо связать не только последний элемент с первым, но и первый с последним (поскольку наш список — двусвязный). Поэтому решение оказалось ошибочным (обратите внимание на то, что после последнего элемента изображена одинарная, а не двойная черта): - >>):

Шаг 3. Правильное решение.

Для получения правильного решения достаточно добавить в программу перед процедурой вывода write следующий оператор:

  P1^.Prev := P2;
Приведем вид окна задачника при первом запуске исправленной программы:

Шаг 4. Просмотр результатов выполнения заданий.

С помощью команды меню «Сервис | Просмотреть результаты», кнопки [image] или клавиатурной комбинации Shift-Ctrl-R мы можем вывести на экран окно результатов, в котором будет перечислены все наши попытки решения заданий на указатели:

Mix82    a24/03 12:29 Ознакомительный запуск.
Mix82    a24/03 12:30 Выведены не все результирующие данные.
Mix82    a24/03 12:31 Ошибочное решение.
Mix82    a24/03 12:32 Задание выполнено!
Mix83    a24/03 12:33 Ознакомительный запуск.
Mix83    a24/03 12:34 Ошибочное решение.
Mix83    a24/03 12:34 Задание выполнено!
Mix84    a24/03 12:35 Ознакомительный запуск.
Mix84    a24/03 12:36 Не освобождена динамическая память.
Mix84    a24/03 12:37 Задание выполнено!
Mix88   a24/03 12:37 Ознакомительный запуск.
Mix88   a24/03 12:38 Ошибочное решение.
Mix88   a24/03 12:39 Задание выполнено!
Mix90   a24/03 12:40 Ознакомительный запуск.
Mix90   a24/03 12:40 Ошибочное решение.
Mix90   a24/03 12:41 Задание выполнено!


Редактор

В качестве редактора для системы Pascal ABC использован компонент SynEdit (web-сайт http://SynEdit.SourceForge.net).

Горячие клавиши

F2, Ctrl-S - сохранить файл.

F3, Ctrl-O - загрузить файл.

F12 - сохранить файл под новым именем.

Ctrl-Shift-S - сохранить все открытые файлы.

Ctrl-Shift-0 ... Ctrl-Shift-9 - установить закладку с номером 0...9.

Ctrl-0 ... Ctrl-9 - перейти к закладке с номером 0...9.

Ctrl-Tab, Ctrl-Shift-Tab - перейти к следующему/предыдущему окну редактора.

Ctrl-Shift-I - увеличить отступ выделенного блока.

Ctrl-Shift-U - уменьшить отступ выделенного блока.

Окно вывода

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

Окно вывода может быть скрыто. Клавиша F5 и кнопка [image] показывают/скрывают окно вывода. Для скрытия окна вывода используется также клавиша Esc.

Окно вывода обязательно открывается при любом выводе в него.

Для очистки окна вывода следует нажать комбинацию клавиш Ctrl-Del или кнопку [image].

Окно ввода

Окно ввода открывается при выполнении процедур read и readln в ходе работы программы:

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


Запуск и остановка программы

Для запуска программы в текущем окне редактора следует нажать клавишу F9 или кнопку [image] панели инструментов.

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

Выполнение программы можно в любой момент прервать нажатием комбинации клавиш Ctrl-F2 или кнопки [image]. При этом в окне вывода появится сообщение

• Программа прервана пользователем

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

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

Окна исполнителей Робот, Чертежник и электронного задачника Programming Taskbook возникают лишь после завершения работы программы.


Пошаговое выполнение программы

Режим пошагового выполнения предназначен для отладки программы. Для выполнения одного шага (одной строки) программы следует нажать клавишу F8 или кнопку [image] (шаг без входа в подпрограмму), либо клавишу F7 или кнопку [image] (шаг со входом в подпрограмму). Для выполнения программы до данной строки следует установить на нее курсор и нажать клавишу F4 или кнопку [image].

Прервать программу, находящуюся в режиме пошагового выполнения, можно с помощью комбинации клавиш Ctrl-F2 или кнопки [image]. Если программа находится в режиме пошагового выполнения, то ее можно выполнить до конца, нажав F9.

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

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

Трассировка обработчиков событий запрещена.


Окно отладки

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

Для добавления переменной или выражения в окно отладки следует нажать комбинацию клавиш Ctrl-F5 или кнопку [image]. Можно также перетащить из редактора в окно отладки выделенное выражение или при активном окне отладки нажать клавишу Ins. Допускаются выражения, содержащие функции, в т.ч. и определенные в программе (такие функции не должны иметь побочного эффекта, т.е.не должны менять значения глобальных переменных).

Окно отладки включается/выключается нажатием комбинации клавиш Ctrl-Shift-W.

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

Для изменения строки в окне отладки следует дважды щелкнуть на ней.

Для очистки окна отладки следует нажать комбинацию клавиш Ctrl-Del или воспользоваться командой контекстного меню окна отладки.

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


Команды меню "Сервис"

Команды меню "Сервис" облегчают выполнение заданий из электронного задачника Programming Taskbook, а также заданий для исполнителей Робот и Чертежник.
  • Для просмотра заданий из задачника Programming Taskbook в демонстрационном режиме используется комбинация клавиш Shift-Ctrl-D или кнопка [image].
  • Для создания шаблона программы для выполнения задания используется комбинация клавиш Shift-Ctrl-L или кнопка [image].
  • Для просмотра результатов выполнения заданий используется комбинация клавиш Shift-Ctrl-R или кнопка [image].


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

Программа на языке Pascal ABC имеет следующий вид:

program имя программы;
раздел подключения модулей
раздел описаний
begin
  операторы
end.

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

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

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

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

Операторы отделяются один от другого символом "точка с запятой".


Идентификаторы и служебные слова

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

Например, a1, _h, b123 - идентификаторы, а 1a, ф2 - нет.

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

and | array | as | begin
break | case | class | const
constructor | continue | destructor | div
do | downto | else | end
exit | external | externalsync | file
finalization | for | forward | function
if | in | inherited | initialization
is | mod | not | of
or | private | procedure | program
property | protected | public |
record | repeat | set | shl
shr | sizeof | string |
then | to | type | unit
until | uses | var | while
with | xor |  |

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

ИмяМодуля.Имя

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

Имя программы также считается именем модуля.


Выражения и операции

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

В Pascal ABC имеются следующие операции: @, not, ^, *, /, div, mod, and, shl, shr, +, -, or, xor, =, >, <, <>, <= и >=.

Арифметические операции

К арифметическим относятся бинарные операции + - * / для вещественных и целых чисел, бинарные операции div и mod для целых чисел и унарные операции + и - для вещественных и целых чисел. Выражение, имеющее числовой тип, называется арифметическим. Тип арифметического выражения определяется по следующему правилу: если все операнды целые и в выражении отсутствует операция деления /, то выражение имеет тип integer, в противном случае выражение имеет тип real. Например, если b имеет тип byte, c имеет тип 1..9, то b+c и -b имеют тип integer, а 2.0+b и 1/2 - тип real.

Логические операции

К логическим относятся бинарные операции and, or и xor, а также унарная операция not, имеющие операнды типа boolean и возвращающие значение типа boolean. Выражение, имеющее тип boolean, называется логическим.

Операции отношения

Операции отношения <, >, <=, >=, =, <> возвращают значение типа boolean и применяются к операндам целого, вещественного, символьного, логического и строкового типов, а также к типизированным указателям. Операции = и <> также применяются к операндам типа pointer, к операндам, являющихся объектами классов и к константе nil. При сравнении символа и строки символ преобразуется в строку длины 1.

Побитовые операции

Побитовые операции and, or, not, xor, shl, shr производят побитовые манипуляции с операндами целого типа. Для унарной операции not результат имеет тот же тип, что и операнд. Для остальных операций результат имеет тип integer. Например, если b имеет тип byte и b=1, то b shl 10=1024, а not b=254.

Строковые операции

Помимо операций отношения <, >, <=, >=, =, <>, к строковым и символьным операндам применима операция конкатенации (слияния) +. Ее результат имеет строковый тип. Например, 'a'+'b'='ab'. Поскольку строки могут содержать максимум 255 символов, то если сливаются строки суммарной длины больше 255, то программа завершается сообщением об ошибке

» Ошибка: произошло переполнение строки при выполнении операции "+".

Операция @

Операция @ применяется к переменной и возвращает ее адрес.

Операции с указателями

К типизированным указателям применима операция разыменования ^: если p является указателем на тип T, то p^ - элемент типа T, на который указывает p.

Помимо операций отношения <, >, <=, >=, =, <>, к типизированным указателям применимы арифметические операции + и -.

Операция + применяется к типизированному указателю и целому числу: если p имеет тип ^T и указывает на элемент a[k] одномерного массива элементов типа T, i - целое, то p+i возвращает адреc элемента a[k+i]. Операция - применяется к двум типизированным указателям одного типа: если p1 и p2 указывают на элементы одномерного массива элементов типа T, то p2-p1 возвращает количество элементов между этими указателями (взятое со знаком -, если адрес в p2 меньше адреса в p1). Например:

var
  a: array [1..10] of integer;
  p: ^integer;
begin
  p:=@a[1];
  for i:=1 to 10 do
  begin
    p^:=i;
    p:=p+1;
  end;
  ...

Операции с множествами

К множествам применимы операции + (объединение), - (разность) и * (пересечение):

var
  s1,s2,s: set of byte;
begin
  s1:=[1..4];
  s2:=[2..5];
  s:=s1+s2; // s=[1..5]
  s:=s1-s2; // s=[1]
  s:=s1*s2; // s=[2..4]

К множествам применимы также операции отношения = (равенство), <> (неравенство), <= (вложено) и >= (содержит):

var
  s1,s2,s: set of byte;
  b: boolean;
begin
  s1:=[1..4];
  s2:=[2..5];
  s:=[1,2];
  b:=s1=s2; // b=False
  b:=s2<>s; // b=True
  b:=s<=s2; // b=False
  b:=s1>=s; // b=True

Наконец, операция in определяет, принадлежит ли элемент множеству:

1 in [2..5] // False
3 in [2..5] // True

Приоритет операций

Приоритет определяет порядок выполнения операций в выражении. Первыми выполняются операции, имеющие высший приоритет. Операции, имеющие одинаковый приоритет, выполняются слева направо.

Таблица приоритетов операций

@, not, ^ | 1 (наивысший)
*, /, div, mod, and, shl, shr | 2
+, -, or, xor | 3
=, <>, <, >, <=, >=, in | 4 (низший)


Описание переменных и констант

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

список имен переменных: тип;

Имена в списке перечисляются через запятую. Например:

var
  a,b,c: integer;
  d: real;
  e,f: integer;
  s,s1: string;
  ch: char;

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

имя константы = значение;

или

имя константы : тип = значение;

Например:

const
Pi = 3.14;
Count = 10;
Name = 'Mike';
DigitsSet = ['0'..'9'];
Arr: array [1..5] of integer = (1,3,5,7,9);
Rec: record name: string;
    age: integer end = (name: 'Иванов';
    age: 23);
Arr2: array [1..2,1..2] of
    real = ((1,2),(3,4));

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


Описание типов

Раздел описания типов начинается со служебного слова type, после которого следуют строки вида

имя типа = тип;
Например,

type
  myint = integer;
  arr10 = array [1..10] of integer;
  pinteger = ^integer;
  A = class
    i: integer;
    constructor Create(ii: integer);
    begin
      i:=ii;
    end;
  end;

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

type
  PNode = ^TNode;
  TNode = record
    data: integer;
    next: PNode;
  end;

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

Следующее описание, однако, ошибочно:

type
  TNode = record
    data: integer;
    next: ^TNode;
  end;

(сообщение об ошибке: "Тип TNode полностью не определен").


Область действия идентификатора

Основная программа, процедура и функция состоят из заголовка и блока. Блоком называется раздел описаний, после которого следуют операторы, заключенные в операторные скобки begin/end.

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

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

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

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

var i: integer;

procedure p;
var i: integer;
begin
  i:=5;
end;

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

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

type
  A=class
    i: integer;
    procedure p;
    begin
      i:=5;
    end;
  end;
  B=class(A)
    i: integer;
    procedure p;
    begin
      i:=5;
      inherited p;
    end;
  end;

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

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

uses unit1,unit2;
begin
  i:=2;
end.

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


Ввод и вывод. Форматы вывода

Для вывода в окно вывода используются стандартные процедуры write и writeln. Они могут вызываться как без параметров, так и со списком параметров. Параметры в списке перечисляются через запятую и должны иметь простой тип (кроме перечислимого типа и интервального типа, построенного на базе перечислимого), либо тип string, либо тип указателя. Процедура writeln после вывода своих параметров осуществляет переход на следующую строку.

В процедурах вывода write и writeln после каждого выводимого значения типа может указываться формат вывода, представляющий собой двоеточие, после которого следует целое число или выражение. Это число или выражение задает ширину поля вывода, то есть количество позиций, отводимых под выводимое значение. Если длина выводимого значения меньше ширины поля вывода, то выводимый текст дополняется слева пробелами до нужной ширины; в результате выводимое значение выравнивается по правому краю. Если длина выводимого значения больше ширины поля вывода, то формат вывода игнорируется. Вещественные и комплексные значения с форматом вывода вида :m всегда выводятся в экспоненциальной форме.

Например, если a, b - целые переменные, то при выполнении операторов

a:=-2437; b:=13555;
writeln(a:6,'Привет!':9);
writeln(b:1);
в окно вывода будет выведен следующий текст:

 -2437  Привет!
13555

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

writeln(-14.859:10:3); // ___-14.859
writeln(-14.859:10:5); // _-14.85900
writeln(-14.859:10:2); // ____-14.86
writeln(-14.859:10:0); // _______-15
writeln(-14.859:10:7); // -14.8590000
writeln((0,1):10:1);   // _(0.0,1.0)

(здесь символом _ изображены пробелы).

Для ввода с клавиатуры используются стандартные процедуры read и readln. Они могут вызываться как без параметров, так и со списком параметров. Параметры в списке перечисляются через запятую и должны быть переменными простого типа (кроме перечислимого типа и интервального типа, построенного на базе перечислимого), либо типа string. Процедура readln после ввода пропускает данные до конца текущей строки ввода.

Процедуры write, writeln, read, readln - единственные, для которых можно указывать список параметров произвольной длины.

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

writeln(f,'abc',1,True,2.4);


Оператор присваивания

Оператор присваивания имеет вид:

переменная:= выражение

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


Условный оператор

Условный оператор имеет полную и краткую формы.

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

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

В качестве условия указывается некоторое логическое выражение. Если условие оказывается истинным, то выполняется оператор1, в противном случае выполняется оператор2.

Краткая форма условного оператора имеет вид:

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

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

В случае конструкции вида

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

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

if условие1 then
begin
  if условие2 then оператор1
end
else оператор2


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

Составной оператор предназначен для объединения нескольких операторов в один. Он имеет вид:

begin
  операторы
end

Операторы отделяются один от другого символом ";". Служебные слова begin и end, окаймляющие операторы, называются операторными скобками.

Например:

s:=0; p:=1;
for i:=1 to 10 do
begin
  p:=p*i;
  s:=s+p
end

Перед end также может ставиться ";". В этом случае считается, что последним оператором перед end является пустой оператор, не выполняющий никаких действий.


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

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

case переключатель of
  список выбора 1: оператор1;
  ...
  список выбора N: операторN;
  else оператор0
end;

Переключатель представляет собой выражение порядкового типа (целого, символьного, перечислимого или интервального), а списки выбора содержат константы совместимого типа. Как и в операторе if, ветка else может отсутствовать.

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

Список выбора состоит либо из одной константы, либо из диапазона значений вида a..b (константа a должна быть меньше константы b); можно также перечислить несколько констант или диапазонов через запятую:

case DayOfWeek of
  1..5: writeln('Будний день');
  6,7: writeln('Выходной день');
end;

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

case i of
  2,5: write(1);
  4..6: write(2);
end;

приведет к ошибке компиляции "Пересечение диапазонов меток в операторе case".


Оператор цикла for

Оператор цикла for имеет одну из двух форм:

for переменная:=начальное значение to конечное значение do
  оператор

или

for переменная:=начальное значение downto конечное значение do
  оператор

Текст от слова for до слова do включительно называется заголовком цикла, а оператор после do - телом цикла. Переменная после слова for называется параметром цикла. Для первой формы цикла с ключевым словом to параметр цикла меняется от начального значения до конечного значения, увеличиваясь всякий раз на единицу, а для второй формы ключевым словом downto - уменьшаясь на единицу. Для каждого значения переменной-параметра выполняется тело цикла. Однократное повторение тела цикла называется итерацией цикла.

Значение параметра цикла после завершения цикла считается неопределенным.

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

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

Тело цикла for в Pascal ABC не может быть пустым. Это сделано для защиты от часто встречающейся у начинающих ошибки ставить после do точку с запятой.

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

for i:=1 to 10 do
  for i:=1 to 5 do
    write(i);

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

var
  en: (red,green,blue,white);
  c: char;
...
for en:=red to blue do
  write(Ord(en):2);
for c:='a' to 'z' do
  write(c);


Оператор цикла while

Оператор цикла while имеет следующую форму:

while условие do
  оператор

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

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

while 2>1 do
  write(1);

Чтобы прервать зациклившуюся программу, следует использовать комбинацию клавиш Ctrl-F2 или кнопку [image].

Тело цикла while в Pascal ABC не может быть пустым. Это сделано для защиты от часто встречающейся у начинающих ошибки ставить после do точку с запятой.


Оператор цикла repeat

Оператор цикла repeat имеет следующую форму:

repeat
  операторы
until условие

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

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

repeat
  write(1);
until 2=1;

Чтобы прервать зациклившуюся программу, следует использовать комбинацию клавиш Ctrl-F2 или кнопку [image].


Оператор вызова процедуры

Оператор вызова процедуры имеет вид:

имя процедуры

или

имя процедуры(список фактических параметров)

Количество фактических параметров должно совпадать с количеством формальных, а типы фактических параметров должны соответствовать типам соответствующих формальных.

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


Операторы break, continue и exit

Операторы break и continue используются только внутри циклов.

Оператор break предназначен для досрочного завершения цикла. При его выполнении происходит немедленный выход из текущего цикла и переход к выполнению оператора, следующего за циклом. Оператор continue завершает текущую итерацию цикла, осуществляя переход к концу тела цикла. Например:

flag:=False;
for i:=1 to 10 do
begin
  read(x);
  if x<0 then continue; // пропуск текущей итерации цикла
  if x=5 then
  begin
    flag:=True;
    break; // выход из цикла
  end;
end;

Использование операторов break и continue вне тела цикла ошибочно.

Оператор exit предназначен для досрочного завершения процедуры или функции. Например

function Analyze(x: integer): boolean;
begin
  if x<0 then
  begin
    Result:=False;
    exit
  end;
  ...
end;

Вызов exit в разделе операторов основной программы приводит к ее немедленному завершению.

Следует отметить, что в Pascal ABC (в отличие от Borland Pascal и Borland Delphi) break, continue и exit являются не процедурами, а операторами и входят в число служебных слов языка.


Оператор with

Оператор with позволяет сократить обращение к полям записи, а также к полям, методам и свойствам объекта. Он имеет вид:

with имя записи или объекта do оператор

или

with список имен do оператор

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

var
  DateOfBirthday=record
    Day: Integer;
    Month: Integer;
    Year: Integer;
  end;

Тогда присваивание значений ее полям без использования оператора with имеет вид:

DateOfBirthday.Day:=23;
DateOfBirthday.Month:=2;
DateOfBirthday.Year:=1965;

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

with DateOfBirthday do
begin
  Day:=23;
  Month:=2;
  Year:=1965;
end;

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

var
  x,y,z: integer;
  a: record
    x,y: integer;
  end;
  b: record
    x: integer;
  end;

то фрагмент программы

with a,b do
begin
  x:=1;
  y:=2;
  z:=3;
end;

эквивалентен фрагменту

with a do
 with b do
 begin
   x:=1;
   y:=2;
   z:=3;
 end;

а также фрагменту

b.x:=1;
a.y:=2;
z:=3;


Оператор безусловного перехода goto

Оператор безусловного перехода goto имеет следующую форму:

goto метка

Он переносит выполнение программы к оператору, помеченному меткой метка.

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

label1: оператор

Метки должны быть описаны в разделе меток с использованием служебного слова label:

label 1,2,3;

Например, в результате выполнения программы

label 1,2;
begin
  i:=5;
2: if i<0 then goto 1;
  write(i);
  Dec(i);
  goto 2;
1:
end.

будет выведено 54321.

Метка должна помечать оператор в том же блоке, в котором описана. Метка не может помечать несколько операторов.

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

Использование оператора безусловного перехода в программе считается признаком плохого стиля программирования. Для основных вариантов использования goto в язык Паскаль введены специальные операторы: break - переход на оператор, следующий за циклом, exit - переход за последний оператор процедуры, continue - переход за последний оператор в теле цикла.

Единственный пример уместного использования оператора goto в программе - выход из нескольких вложенных циклов одновременно. Например, при поиске элемента k в двумерном массиве:

  found:=False;
for i:=1 to 10 do
for j:=1 to 10 do
if a[i,j]=k then
begin
found:=True;
goto
    c1;
end;
c1: writeln(found);


Оператор try ... except

Оператор try ... except имеет вид:

try
 операторы
except
 блок обработки исключений
end;

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

Если в процессе обработки исключения (в блоке except) произошло другое исключение, то текущий блок except завершается, первое исключение остается необработанным и обработка нового исключения передается объемлющему блоку try. Таким образом, в каждый момент времени существует максимум одно необработанное исключение.

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

on имя: тип do оператор;

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

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

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

Пример.

try
  readln(x);
  writeln(ctg(x)/(x-1));
  ...
except
  on EZeroDivide do
    writeln('Деление на 0');
  on e: ECtgError do
    writeln(e.Message);
end;


Оператор try ... finally

Оператор try ... finally имеет вид:

try
  операторы
finally
  операторы
end;

Операторы в блоке finally выполняются безотносительно к тому, возникло или нет исключение в блоке try. При этом само исключение не обрабатывается.

Блок finally используется для возвращения ранее выделенных ресурсов.

Пример 1. Закрытие открытого файла.

reset(f);
try
  ...
finally
  close(f);
end;

Файл будет закрыт независимо от того, произошло ли ислючение в блоке try.

Пример 2. Возвращение выделенной динамической памяти.

New(p);
try
  ...
finally
  Dispose(p);
end;

Динамическая память, контролируемая указателем p, будет возвращена независимо от того, произошло ли ислючение в блоке try.


Оператор raise

Оператор raise предназначен для возбуждения исключения и имеет вид:

raise объект

Здесь объект - объект класса, производного от Exception. Например:

raise Exception.Create('Ошибка');

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

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

function ctg(x: real): real;
begin
  Result:=cos(x)/sin(x);
end;

Если вызвать ctg(0), то будет возбуждено исключение EZeroDivide вещественного деления на 0.

Рассмотрим наивную попытку обработать ошибочную ситуацию внутри функции ctg:

function ctg(x: real): real;
begin
  if x=0 then
    writeln('Функция ctg: деление на 0');
  Result:=cos(x)/sin(x);
end;

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

Простейший способ - оставить исходный вариант функции и обрабатывать исключение EZeroDivide:

try
  readln(x);
  writeln(ctg(x)/(x-1));
  ...
except
  on EZeroDivide do
    writeln('Деление на 0');
end;

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

Однако, последнее решение обладает существенным недостатком: исключение EZeroDivide будет возбуждено и при x=1 и не будет связано с функцией ctg. Для устранения подобного недостатка определим собственный класс исключения и возбудим его в функции ctg:

type ECtgError=class(Exception) end;

function ctg(x: real): real;
begin
  if x=0 then
    raise ECtgError.Create('Функция ctg: деление на 0');
  Result:=cos(x)/sin(x);
end;

Тогда обработка ошибок будет выглядеть так:

try
  readln(x);
  writeln(ctg(x)/(x-1));
  ...
except
  on EZeroDivide do
    writeln('Деление на 0');
  on e: ECtgError do
    writeln(e.Message);
end;

Если сделать ECtgError наследником класса EMathError, как и EZeroDivide, то последний код можно упростить:

type ECtgError=class(EMathError) end;

...

try
  readln(x);
  writeln(ctg(x)/(x-1));
  ...
except
  on e: EMathError do
    writeln(e.Message);
end;

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

Наконец, исправим еще одну неточность. Исключение ECtgError должно генерироваться не только когда аргумент x равен 0, но и когда он кратен Pi. Чтобы не проверять это сложное условие, поступим следующим образом: перехватим в функции ctg исключение EZeroDivide и в ответ сгенерируем новое - ECtgError:

function ctg(x: real): real;
begin
  try
    Result:=cos(x)/sin(x);
  except
    on e: EZeroDivide do
      raise ECtgError.Create('Функция ctg: деление на 0');
  end;
end;


Обзор типов

В Pascal ABC имеются следующие типы:

integer (целый)
byte (байтовый)
char (символьный)
перечислимый
диапазонный
boolean (логический)
real (вещественный)
complex (комплексный)
string (строковый)
тип "массив"
тип "запись"
тип "указатель"
процедурный
файловый
классовый

Типы integer, byte, char, перечислимый и диапазонный называются порядковыми. Только значения этих типов могут быть индексами массивов и фигурировать в качестве выражения-переключателя в операторе case. Переменная-параметр цикла for также должна иметь перечислимый тип.

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

Pred(x) возвращает значение, предшествующее x (к наименьшему значению не применяется);
Succ(x) возвращает значение, следующее за x (к наибольшему значению не применяется);
Ord(x) возвращает порядковое целое значение, соответствующее x. Для целых x возвращает само значение x, для символов char возвращает их код, а для элементов перечислимого типа - их номер (нумерация начинается с нуля).

Все порядковые типы, а также типы boolean, real и complex называются простыми типами.


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

Тип integer (целый). Значения этого типа занимают 4 байта и находятся в диапазоне от -2147483648 до 2147483647. Константа MaxInt хранит значение 2147483647.

Тип byte (беззнаковый целый). Значения этого типа занимают 1 байт и находятся в диапазоне от 0 до 255.

Тип word (беззнаковый целый). Значения этого типа занимают 2 байта и находятся в диапазоне от 0 до 65535.

Тип char (символьный). Значения этого типа занимают 1 байт и представляют собой символы в кодировке Windows. Стандартная функция Chr(x) возвращает символ с кодом x. Константы этого типа могут быть записаны в виде #x, где x - целое число от 0 до 255.

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

type
  Season = (Winter,Spring,Summer,Autumn);
  DayOfWeek = (Mon,Tue,Wed,Thi,Thr,Sat,Sun);

Значения перечислимого типа занимают 4 байта.

Интервальный тип представляет собой подмножество значений целого, символьного или перечислимого типа и описывается в виде a..b, где a - нижняя, b - верхняя граница интервального типа:

var
  a: 0..10;
  c: 'a'..'z';
  d: Mon..Thr;

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


Типы boolean, real и complex

Тип boolean (логический). Переменные и константы логического типа занимают 1 байт и принимают одно из двух значений, задаваемых предопределенными константами True (истина) и False (ложь).

Тип real (вещественный). Значения вещественного типа занимают 8 байт, содержат 15-16 значащих цифр и по модулю не могут превосходить величины 1.7∙10308. Самое маленькое положительное число вещественного типа равно 5.0∙10-324. Константы типа real можно записывать как в форме с плавающей точкой, так и в экспоненциальной форме: 1.7, 0.013, 2.5e3 (2500), 1.4e-1 (0.14).

Тип complex (комплексный). Значения комплексного типа занимают 16 байт. Константы этого типа записываются в виде (x,y), где x и y - выражения вещественного типа, представляющие собой вещественную и мнимую части комплексного числа. Если переменная c имеет тип complex, то обратиться к ее вещественной и мнимой частям можно как к полям записи: c.re и c.im. Например:

const ci=(0,1);
var c: complex;
...
c.re:=2*c.im;
c:=ci*c+(c.im,c.re);

К переменным типа complex применимы стандартные числовые функции: abs, sin, cos, exp, ln, sqrt, а также функция conj(c), возвращающая комплексно сопряженное к c, и функция carg(c), возвращающая главное значение аргумента комплексного числа c. При вычислении многозначных функций ln, sqrt, carg возвращается главное значение и предполагается, что разрез сделан по отрицательной вещественной оси, причем, верхний берег принадлежит разрезу. Так, carg(c) возвращает значение в диапазоне (-Pi,Pi].


Строковый тип

Строки в Pascal ABC имеют тип string и состоят из не более чем 255 символов. При описании

var s: string;

под переменную s отводится 256 байт, при этом в нулевом байте хранится длина строки.

Для экономии памяти предусмотрено описание вида

var s1: string[40];

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

При выполнении операции конкатенации вида s1+s1 результат считается строкой типа string, т.е.занимает 256 байт. Однако, если при конкатенации результат будет занимать более 255 символов, то программа завершится с ошибкой.

К символам в строке можно обращаться, используя индекс: s[i] обозначает i-тый символ в строке. Обращение к нулевому символу s[0] считается ошибочным. Чтобы изменить длину строки, следует воспользоваться процедурой SetLength. Если индекс i выходит за пределы памяти, отводимой под строку, то выдается сообщение об ошибке. Однако, если индекс i выходит лишь за пределы длины строки, то сообщение об ошибке не выдается.


Массивы

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

array [тип индекса1, ..., тип индексаN] of базовый тип

Тип индекса обязательно представляет собой интервальный тип и обязательно должен задаваться в виде a..b, где a и b - константные выражения целого, символьного или перечислимого типа. Например:

type enum=(w1,w2,w3,w4,w5);
var
  a1,a2: array [1..10] of integer;
  b: array ['a'..'z',w2..w4] of string;
  c: array [1..10] of array [1..5] of real;

Базовый тип может быть любым (в частности, он может быть типом массива, как для переменной c).

Переменные-массивы одного типа можно присваивать друг другу, при этом будет производиться копирование содержимого одного массива в другой:

a1:=a2;

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

procedure p(arr: array [1..10] of integer);
...
p(a1);

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

procedure r(var arr: array [1..10] of integer);
...
r(a1);

К элементам массива обращаются при помощи переменных с индексами:

a1[3]:=a2[5];
b['f',w3]:='Hello';
c[3][4]:=3.14;

Наиболее часто встречающаяся ошибка при работе с массивами - выход за границы изменения индекса. В Pascal ABC возникновение этой ошибки приводит к завершению работы программы.


Записи

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

record список полей1: тип1; ... список полейN: типN; end

Последний символ ";" не является обязательным. Например:

type
Date=record
Day: 1..31;
Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct,
    Nov, Dec);
Year: Integer;
end;

Теперь можно объявить переменные типа Date:

var d1,d2: Date;

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

d1.Day:=9;
d1.Month:=Sep;
d1.Year:=2004;

Как и для массивов, можно скопировать содержимое полей одной переменной-записи в другую:

d2:=d1;


Множества

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

set of базовый тип

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

type
  ByteSet = set of byte;
  CharSet = set of char;
  Digits = set of '0'..'9';
  SeasonSet = set of (Winter,Spring,Summer,Autumn);

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

[список значений]

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

var
  bs: ByteSet;
  bestdays: (Mon,Tue,Wed,Thi,Thr,Sat,Sun);
...
bs:=[1,3,5,20..25];
bestdays:=[Wed,Thr..Sun];

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

bs:=[];

Операция in проверяет принадлежность элемента множеству:

if Wed in bestdays then ...

Для множеств определены операции + (объединение), - (разность), * (пересечение), = (равенство), <> (неравенство), <= (вложено) и и >= (содержит). Примеры этих операций приведены в пункте Выражения и операции.

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

var st: set of 3..9;
...
st:=[1..5,8,10,12]; // в st попадут значения [3..5,8]

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

for i:=0 to 255 do
  if i in st then write(i,' ');


Указатели

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

Тип указателя на тип T имеет форму ^T, например:

type pinteger=^integer;
var p: ^record r,i: real end;

Бестиповой указатель описывается с помощью слова pointer.

Для доступа к ячейке памяти, адрес которой хранит типизированный указатель, используется операция разыменования ^:

var
  i: integer;
  pi: ^integer;
...
pi:=@i; // указателю присвоили адрес переменной i
pi^:=5; // переменной i присвоили 5

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

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

type preal=^real;
var
  p: pointer;
  pr: ^real;
...
p:=pr;

Обратное преобразование может быть выполнено только явно:

pr:=preal(p);
pr^:=3.14;

Указатели можно сравнивать на равенство (=) и неравенство (<>). В дополнение к этому типизированные указатели можно сравнивать, используя операции <, >, <=, >=.

Для типизированных указателей доступны также операции p+i, p-i и p2-p1, где i - целое (см.п.Выражения и операции).

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


Файлы

Файл в Pascal ABC представляет собой последовательность элементов одного типа, хранящихся на диске. В Pascal ABC имеется два типа файлов - типизированные и текстовые. Текстовые файлы хранят символы, разделенные на строки символами #13#10.

Для описания текстового файла используется стандартное имя типа text, а для описания типизированного файла - конструкция file of тип элементов:

var
  f1: file of real;
  f2: text;

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


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

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

procedure (список параметров)

или

function (список параметров): тип возвращаемого значения

При этом список параметров вместе с круглыми скобками могут отсутствовать. Например:

type proc=procedure(i: integer);
var
  p1: proc;
  p2: procedure;
  f1: function: integer;

Процедурной переменной можно присвоить процедуру или функцию с совместимым типом:

procedure my(i: integer);
begin
  ...
end;
function f: integer;
begin

end;
...
p1:=my;
f1:=f;

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

p1(5);
write(f1);

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

procedure foreach(var a: array [1..100] of
    real; n: integer; p: procedure(var r: real));
var i: integer;
begin
for i:=1 to n do
p(a[i]);
end;

procedure mult2(var r: real);
begin
  r:=2*r
end;

procedure print(var r: real);
begin
  write(r,' ');
end;
...
foreach(a,10,mult2); // умножение элементов массива на 2
foreach(a,10,print); // вывод элементов массива


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

В Pascal ABC два типа считаются эквивалентными (равными), если совпадают их описания. Например, после описаний

type Arr=array [1..100] of integer;
var
  a: Arr;
  b: array [1..100] of integer;

можно присваивать массивы друг другу:

a:=b;

В типах записей, помимо типов полей, должны совпадать имена:

type
  rec1 = record i,j: integer end;
  rec2 = record x,y: integer end;
...
var r1: rec1; r2: rec2;
...
r1:=r2; // ошибка!

В типах формальных параметров процедур и функций имена могут не совпадать:

type
  proc1 = procedure (i: integer);
  proc2 = procedure (x: integer);
...
var p1: proc1; p2: proc2;
...
p1:=p2; // все в порядке

Подобная расширенная трактовка эквивалентности (по сравнению с Borland Pascal и Borland Delphi) позволяет передавать параметры составного типа (массивы, записи, процедурный и указательный) в процедуры и функции, не определяя для этих параметров новый тип:

procedure foreach(var a: array [1..100] of
    real; n: integer; f: function(r: real): real);
var i: integer;
begin
for i:=1 to n do
a[i]:=f(a[i]);
end;


Неявное приведение типов

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

Типы byte, word и integer неявно преобразуются друг к другу, а также к типам real и complex.

Тип real неявно преобразуется к типу complex.

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

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

Указатель на любой тип неявно преобразуется к указателю pointer.

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

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

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

Все возможные неявные преобразования типов проиллюстрированы в программе ImplicitCast.pas.

В процессе выполнения программы после неявного преобразования числовых типов может произойти переполнение. Например, это возможно при преобразовании типа integer в тип byte. Однако, если s1 и s2 - строки и при присваивании s1:=s2 данные строки s2 не умещаются в строку s1, то остаток строки усекается без возникновения ошибки.

Операнды в выражениях также могут иметь разные типы. В этом случае обычно меньший тип неявно приводится к большему или оба типа приводятся к большему. Например, если r имеет тип real, а i - тип integer, то в выражении r+i значение i вначале приводится к типу real, после чего выполняется операция сложения над двумя вещественными значениями. Если строка s1 имеет тип string[30], а s2 - тип string[40], то в выражении s1+s2 обе строки приводятся к типу string и только потом выполняется операция сложения.

Выражения "меньший тип" и "больший тип" в предыдущем абзаце используются в смысле диапазона значений. Например, тип set of 1..9 меньше типа set of byte, но ни один из типов set of 1..9 и set of 5..15 не меньше другого.


Явное приведение типов

Некоторые типы не приводятся к другим неявно, однако такое преобразование имеет смысл. Например, переменную типа char можно преобразовать к значению типа byte, являющемуся кодом символа. Переменную типа integer, содержащую неотрицательное значение, можно преобразовать к интервальному типу, причем, это значение будет выступать номером элемента в порядковом типе.

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

имя нового типа(выражение)

Например:

type
  pinteger=^integer;
  days=(mon,tue,wed,thi,fri,sat,sun);
var
  p: pointer;
  i: integer;
  en: days;
...
p:=pinteger(@i);
i:=integer(en):
en:=days(3);

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

p:=^integer(@i);

Явные преобразования типов содержат все неявные. Кроме того, все порядковые типы можно явно преобразовывать друг к другу, все порядковые типы можно явно преобразовывать к типам real и complex, базовый класс можно явно преобразовать к производному и указатель pointer можно явно преобразовать к указателю на любой тип.

Все возможные явные преобразования типов проиллюстрированы в программе ExplicitCast.pas.


Описание процедур и функций

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

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

Описание процедуры имеет вид:

procedure имя(список формальных параметров);
раздел описаний
begin
  операторы
end;

Описание функции имеет вид:

function имя(список формальных параметров): тип возвращаемого значения;
раздел описаний
begin
  операторы
end;

Операторы подпрограммы, окаймленные операторными скобками begin/end, называются телом этой подпрограммы.

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

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

Пример описания процедуры приводится ниже:

procedure Reverse(var a: array [1..100]
    of integer; n: integer);
var i,v: integer;
begin
for i:=1 to n div 2 do
begin
v:=a[i];
a[i]:=a[n-i+1];
a[n-i+1]:=v;
end;
end;

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

function Add(a,b: real): real;
begin
  Add:=a+b;
end;

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

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

function MinElement(var a:
    array [1..100] of real; n: integer): real;
var i: integer;
begin
Result:=a[1];
for i:=1 to n do
if a[i]<Result then Result:=a[i];
end;

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


Параметры процедур и функций

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

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

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

procedure PrintSquare(i: integer);
begin
  writeln(i*i);
end;
Тогда при вызове PrintSquare(5*a-b) значение 5*a-b будет вычислено и присвоено переменной i, после чего выполнится тело процедуры.

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

procedure Mult2(var a: integer);
begin
  a:=a*2;
end;
то после вызова Mult(d) значение d увеличится в 2 раза.

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

При передаче параметра по ссылке в подпрограмму передается адрес фактического параметра. Поэтому если параметр занимает много памяти (массив, запись), то обычно он также передается по ссылке. В результате в процедуру передается не сам параметр, а его адрес, что экономит память и время работы. Например:

    procedure Print(var
    a: array [1..10] of integer; n: integer);
var i: integer;
begin
for i:=1
    to n do
write(a[i],' ');
writeln;
end;

Параметр может быть также описан со служебным словом const. Это означает, что менять его в подпрограмме запрещено. Например:

procedure PrintSquare1(i: integer);
begin
  i:=i*i; // верно
  writeln(i);
end;
procedure PrintSquare2(const i: integer);
begin
  i:=i*i; // ошибка!!!
  writeln(i);
end;

В Pascal ABC константный параметр передается по значению (в Delphi - по ссылке).


Локальные и глобальные переменные

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

Параметры подпрограммы считаются ее локальными переменными.

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

var i: real;
procedure p;
var i: integer;
begin
  // к глобальной переменной i внутри процедуры нельзя обратиться
  i:=5; // присваивание локальной переменной i; ...
end;


Опережающее объявление

В некоторых ситуациях возникает необходимость вызвать подпрограмму, описанную далее по тексту программы. Например, эта необходимость возникает при косвенной рекурсии (подпрограмма A вызывает подпрограмму B, а та в свою очередь вызывает подпрограмму A). В этом случае используется опережающее объявление подпрограммы, состоящее из ее заголовка, за которым следует служебное слово forward. Например:

procedure B(i: integer); forward;
procedure A(i: integer);
begin
  ...
  B(i-1);
end;
procedure B(i: integer);
begin
  ...
  A(i div 2);
end;

Запрещено делать опережающее объявление для уже описанной подпрограммы.


Перегрузка имен

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

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

procedure p(b: byte);
begin
end;
procedure p(r: real);
begin
end;

то при вызове p(1.0) будет выбрана перегруженная версия с параметром типа real (точное соответствие), а при вызове p(1) будет выбрана перегруженная версия с параметром типа byte (при этом произойдет преобразование фактического параметра типа integer к типу byte).

Заметим, что, в отличие от Delphi, использовать при перегрузке служебного слова overload не нужно.

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

procedure p(i: integer; r: real);
begin
end;
procedure p(r: real; i: integer);
begin
end;

то при вызове p(1,2) оба они одинаково подходят, что приводит к неоднозначности.

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

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

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

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

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

type
A=class
procedure p(i: integer);
procedure
    q(r:
    real);
end;
B=class(A)
procedure p(r:
    real);
procedure
    q(i: integer);
end;
...
var m: B;
...
m.p(1);
m.q(2.1);

В первом случае вызовется метод p класса B, т.к. соответствие типа параметра будет найдено уже в классе B (хотя оно и не точное - требуется преобразование от типа integer к типу real). Во втором же случае метод q, который может быть вызван с вещественным параметром, в классе B не будет найден, и поиск продолжится в классе A; таким образом, вызовется метод q класса A.
Такое правило разрешения перегрузки для подклассов отличается от принятого в Delphi и C++. В C++, например, метод в производном классе полностью скрывает одноименные методы базового класса. В Delphi в перегрузке участвуют все методы базовых классов за исключением методов с идентичными списками параметров. Для не методов поиск перегруженной подпрограммы в Pascal ABC ограничивается разделом описаний, где впервые встречено такое имя.


Обзор стандартного модуля System

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

Общие стандартные процедуры и функции

Стандартные процедуры и функции для работы со строками

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

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

Системные cтандартные процедуры и функции

Стандартные константы

Стандартные классы исключений


Общие стандартные процедуры и функции

Имя и параметры | Процедура или функция | Типы параметров | Тип возвращаемого значения | Действие
Read(a,b,...) | процедура | a,b,c - переменные простого типа или типа string | вводит значения с клавиатуры в переменные a, b ...
Write(a,b,...) | процедура | a,b,c - выражения простого типа, типа string или указатели | выводит значения a, b ... в окно вывода
Readln(a,b,...) | процедура | a,b,c - переменные простого типа или типа string | вводит значения с клавиатуры в переменные a, b ..., после чего пропускает все оставшиеся символы в текущей строке ввода. Если параметры процедуры не указаны, то осуществляет паузу в выполнении программы до нажатия клавиши Enter
Writeln(a,b,...) | процедура | a,b,c - выражения простого типа, типа string или указатели | выводит значения a, b ... в окно вывода и осуществляет переход на следующую строку. Если параметры процедуры не указаны, то выполняет только переход на следующую строку.
Abs(x) | функция | x - integer, real, complex | совпадает с типом параметра | возвращает абсолютное значение (модуль) x
Sqr(x) | функция | x - integer, real, complex | совпадает с типом параметра | возвращает квадрат x
Sqrt(x) | функция | x - real, complex | совпадает с типом параметра | возвращает квадратный корень из x
Sin(x) | функция | x - real, complex | совпадает с типом параметра | возвращает синус x
Cos(x) | функция | x - real, complex | совпадает с типом параметра | возвращает косинус x
Ln(x) | функция | x - real, complex | совпадает с типом параметра | возвращает натуральный логарифм x
Exp(x) | функция | x - real, complex | совпадает с типом параметра | возвращает e в степени x (e=2.718281...)
Arctan(x) | функция | x - real, complex | совпадает с типом параметра | возвращает арктангенс x
Power(x,y) | функция | x, y - real | real | возвращает x в степени y
Conj(z) | функция | z - complex | complex | возвращает число, комплексно сопряженное к z
Carg(z) | функция | z - complex | real | возвращает аргумент комплексного числа z (в диапазоне (-Pi, Pi])
Round(x) | функция | x - real | integer | возвращает результат округления x до ближайшего целого
Trunc(x) | функция | x - real | integer | возвращает целую часть х
Int(x) | функция | x - real | real | возвращает целую часть х
Frac(x) | функция | x - real | real | возвращает дробную часть х
Ord(x) | функция | x - порядкового типа | integer | возвращает номер значения порядкового типа
Chr(x) | функция | x - integer | char | возвращает символ с кодом х
Odd(x) | функция | x - integer | boolean | возвращает True, если х - нечетное, и False в противном случае
Inc(x) | процедура | x - порядкового типа | Увеличивает x на 1
Dec(x) | процедура | x - порядкового типа | Уменьшает x на 1
Inc(x,n) процедура x - порядкового типа,
n - целого типа 		Увеличивает x на n
Dec(x,n) процедура x - порядкового типа,
n - целого типа 		Уменьшает x на n
Pred(x) | функция | x - порядкового типа | совпадает с типом параметра | возвращает предыдущее значение порядкового типа
Succ(x) | функция | x - порядкового типа | совпадает с типом параметра | возвращает следующее значение порядкового типа
Random(x) | функция | x - integer | integer | возвращает случайное целое в диапазоне от 0 до x-1
Random | функция | real | возвращает случайное вещественное в диапазоне [0..1)
Include(s,x) | процедура | s - множество, x - элемент, тип которого совместим с базовым типом множества | включает элемент x во множество s
Exclude(s,x) | процедура | s - множество, x - элемент, тип которого совместим с базовым типом множества | исключает элемент x из множества s


Стандартные процедуры и функции для работы со строками

Имя и параметры | Процедура или функция | Типы параметров | Тип возвращаемого значения | Действие
Length(s) | функция | s - string | integer | возвращает длину строки s
Copy(s,index,count) | функция | s - string, index и count - integer | string | возвращает подстроку строки s длины count, начиная с позиции index
Delete(s,index,count) | процедура | s - string, index и count - integer | удаляет в строке s count символов начиная с позиции index
Insert(subs,s,index) | процедура | s, subs - string, index - integer | вставляет подстроку subs в строку s с позиции index
Pos(subs,s) | функция | s, subs - string | integer | возвращает позицию первой подстроки subs в строке s (или 0 если подстрока не найдена)
SetLength(s,n) | процедура | s - string, n - integer | устанавливает длину строки s равной n
Str(x,s)
Str(x:n,s)
Str(x:n:m,s) 		процедура s - string, x - integer, real и n, m - integer преобразует x к строковому представлению (во втором и третьем случаях согласно формату вывода, устанавливаемому n и m) и записывает результат в строку s
Val(s,v,code) | процедура | s - string, v - integer, real, и code - integer | преобразует строку s к числовому представлению и записывает результат в переменную v. Если преобразование возможно, то в переменной code возвращается 0, если невозможно, то в code возвращается ненулевое значение
Concat(s1,...,sn) | функция | s1,..., sn - string | string | возвращает строку, являющуюся результатом слияния строк s1,..., sn. Результат тот же, что у выражения s1+s2+...+sn
IntToStr(i) | функция | i - integer | string | преобразует целое число к строке
StrToInt(s) | функция | s - string | integer | преобразует строку в целое число . Если преобразование невозможно, то возникает ошибка времени выполнения
FloatToStr(r) | функция | r - real | string | преобразует вещественное число к строке
StrToFloat(s) | функция | s - string | real | преобразует строку в вещественное число. Если преобразование невозможно, то возникает ошибка времени выполнения
UpCase(c) | функция | c - char | char | возвращает символ c, преобразованный к верхнему регистру
LowCase(c) | функция | c - char | char | возвращает символ c, преобразованный к нижнему регистру
UpperCase(s) | функция | s - string | string | возвращает строку s, преобразованную к верхнему регистру
LowerCase(s) | функция | s - string | string | возвращает строку s, преобразованную к нижнему регистру
Trim(s) | функция | s - string | string | возвращает копию строки s с удаленными лидирующими и заключительными пробелами
TrimLeft(s) | функция | s - string | string | возвращает копию строки s с удаленными лидирующими пробелами
TrimRight(s) | функция | s - string | string | возвращает копию строки s с удаленными заключительными пробелами


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

Имя и параметры | Процедура или функция | Типы параметров | Тип возвращаемого значения | Действие
Assign(f,name) | процедура | f - переменная файлового типа , name - string |  | связывает файловую переменную f с файлом с именем name
Reset(f) | процедура | f - переменная файлового типа |  | открывает файл, ранее связанный с файловой переменной f с помощью процедуры Assign. Файл должен существовать на диске, в противном случае происходит ошибка времени выполнения. Текстовые файлы открываются только на чтение, типизированные файлы - на чтение и запись
Rewrite(f) | процедура | f - переменная файлового типа |  | создает и открывает новый файл, ранее связанный с файловой переменной f с помощью процедуры Assign. Если файл с указанным именем уже существует, то он удаляется, и вместо него создается новый файл. Текстовые файлы открываются только на запись, типизированные файлы - на чтение и запись
Append(f) | процедура | f - переменная типа Text |  | открывает текстовый файл на запись для добавления. Файловый указатель устанавливается в конец файла.
Close(f) | процедура | f - переменная файлового типа |  | закрывает файл
FileExists(name) | функция | name - string | boolean | возвращает True, если на диске имеется файл с именем name, в противном случае возвращает False
CanCreateFile(name) | функция | name - string | boolean | возвращает True, если можно создать файл с именем name, в противном случае возвращает False
Read(f,a,b,...) | процедура | f - переменная файлового типа, a,b - переменные простого типа, типа string или указатели |  | считывает значения из файла f в переменные a, b ... Если файл типизированный, то типы переменных a, b ... должны совпадать с базовым типом файла, а их значения считываются из файла в двоичном виде. Если файл текстовый, то переменные a, b ... могут иметь различные типы, а их значения должны храниться в файле в текстовом виде
Write(f,a,b,...) | процедура | f - переменная файлового типа, a,b - выражения простого типа, типа string или указатели |  | записывает значения a, b ... в файл f. Если файл типизированный, то типы значений a, b ... должны быть совместимыми с базовым типом файла. Если файл текстовый, то значения a, b ... выводятся в него в текстовом виде, при этом могут быть использованы форматы вывода
Readln(f,a,b,...) | процедура | f - переменная типа Text, a,b - переменные простого типа, типа string или указатели |  | считывает значения из текстового файла f в переменные a, b ..., после чего пропускает символы до конца строки. Вызов readln(f) просто пропускает символы до конца строки
Writeln(f,a,b,...) | процедура | f - переменная типа Text, a,b - выражения простого типа, типа string или указатели |  | записывает значения a, b ... в текстовый файл f, после чего записывает в него символ конца строки. Значения a, b ... записываются в файл в текстовом виде, при этом могут быть использованы форматы вывода. Вызов writeln(f) просто записывает в файл символ конца строки
Eof(f) | функция | f - переменная файлового типа | boolean | возвращает True, если файловый указатель стоит на конце файла, и False в противном случае
Eoln(f) | функция | f - переменная типа Text | boolean | возвращает True, если файловый указатель стоит на конце строки, и False в противном случае
SeekEof(f) | функция | f - переменная типа Text | boolean | пропускает пробелы, символы табуляции и перехода на новую строку, после чего возвращает True, если файловый указатель стоит на конце файла, и False в противном случае
SeekEoln(f) | функция | f - переменная типа Text | boolean | пропускает пробелы, символы табуляции, после чего возвращает True, если файловый указатель стоит на конце строки, и False в противном случае
FileSize(f) | функция | f - переменная типа file | integer | возвращает количество элементов в типизированном файле
FilePos(f) | функция | f - переменная типа file | integer | возвращает позицию файлового указателя в типизированном файле (нумерация элементов в типизированном файле начинается с нуля)
Seek(f,n) | процедура | f - переменная типа file |  | перемещает файловый указатель в типизированном файле на n-тый элемент (нумерация начинается с нуля)
Truncate(f) | процедура | f - переменная типа file |  | удаляет все элементы типизированного файла с текущей позиции файлового указателя до конца файла
Rename(f,name) | процедура | f - переменная файлового типа, name - string |  | переименовывает файл, связанный с файловой переменной f. Файл должен быть закрыт
Erase(f) | процедура | f - переменная файлового типа |  | удаляет файл, связанный с файловой переменной f. Файл должен быть закрыт


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

Имя и параметры | Процедура или функция | Типы параметров | Действие
New(p) | процедура | p - типизированный указатель | выделяет динамическую память размера, равного размеру типа, на который указывает p, и возвращает указатель на нее в переменной p
Dispose(p) | процедура | p - типизированный указатель | освобождает динамическую память по указателю p, ранее выделенную процедурой New
GetMem(p,n) | процедура | p - указатель любого типа, n - integer | выделяет динамическую память размера n байт и возвращает указатель на нее в переменной p
FreeMem(p) | процедура | p - указатель любого типа | освобождает динамическую память по указателю p, ранее выделенную процедурой GetMem
FillMem(v,count,x) процедура v - переменная любого типа, count - integer,
x - byte 		заполняет count значениями x область памяти, занимаемую переменной v. Контроль выхода за границы не производится
CopyMem(src,dest,count) | процедура | src, dest - pointer, count - integer | копирует count байт из памяти, расположенной по адресу src, в память, расположенную по адресу dest. Допускается использовать перекрывающиеся диапазоны памяти.


Системные процедуры и функции

Имя и параметры | Процедура или функция | Типы параметров | Тип возвращаемого значения | Действие
Sleep(ms) | процедура | ms - integer |  | Осуществляет паузу в выполнении программы на ms миллисекунд
Cls | процедура |  |  | Очищает окно вывода
Halt(n) | процедура | n - integer |  | Завершает программу. Выводит в окно вывода предупреждение "Программа завершена вызовом Halt(n)"
Halt | процедура |  |  | Завершает программу без вывода предупреждения
Assert(b) | процедура | b - boolean |  | Если b=False, то генерирует специальное исключение EAssertionFailed. Используется для проверки выполнения утверждений в программе
Assert(b,mess) | процедура | b - boolean, mess - string |  | Если b=False, то генерирует специальное исключение EAssertionFailed с сообщением mess. Используется для проверки выполнения утверждений в программе.


Стандартные константы

Имя | Тип | Значение
Pi | real | 3.14159265358979
MaxInt | integer | Максимальное значение типа integer: 2147483647
MaxReal | real | Максимальное значение типа real: 1.7E308
MinReal | real | Минимальное положительное значение типа real: 4.94065645841247E-324


Обзор классов и объектов

Класс представляет собой составной тип, состоящий из полей (переменных), методов (процедур и функций) и свойств.

Описание класса имеет вид:

type
  имя класса=class
    описания полей
          объявления или описания методов и описания свойств
  end;

После слова class в скобках может быть указано имя класса-предка (см. п. Наследование).

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

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

Например:

type
Student=class
name: string;
course, group: integer;
constructor Create(nm:
    string; c,gr: integer);
procedure Print;
begin
writeln('Имя:',name,' курс:',course,' группа:');
end;
procedure NextCourse;
begin
Inc(course);
end;
end;

  constructor Student.Create(nm:
    string; c,gr: integer);
begin
name:=nm;
course:=c;
group:=g;
end;

Здесь конструктор Create объявлен в классе, а определен вне класса, а методы Print и NextCourse определены внутри класса. При определении метода вне класса его имя предваряется именем класса с последующей точкой.

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

Объявление метода не может следовать за определением этого же метода.

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

var s: Student;
...
s.name:='Иванов'; s.course:=1; s.group:=3;
s.Print;
s.GotoNextCourse;
s.Print;

Как и другие указатели, переменная типа класс может хранить значение nil:

s:=nil;
...
if s=nil then ...

Несколько переменных типа класс могут ссылаться на один объект:

var s1,s2: Student;
...
s1.name:=' Петров';
s2:=s1;
writeln(s2.name); // s2.name='Петров'

Локальные определения классов (т.е. определения в процедурах и функциях) запрещены.

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


Конструкторы и деструкторы

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

Конструктор представляет собой функцию, создающую объект в динамической памяти, инициализирующую его поля и возвращающую указатель на созданный объект. Этот указатель обычно сразу присваивается переменной типа класс. При описании конструктора вместо служебного слова function используется служебное слово constructor. Кроме того, для конструктора не указывается тип возвращаемого значения. Для вызова конструктора следует указать имя класса, за которым следует точка-разделитель, имя конструктора и список параметров. Например:

var s: Student;
...
s:=Student.Create('Иванов',1,3);

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

Деструктор представляет собой процедуру, уничтожающую объект и освобождающую динамическую память, которую этот объект занимал. При описании деструктора вместо служебного слова procedure используется служебное слово destructor. Деструктор объекта вызывается как обычный метод:

s.Destroy;

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

s:=nil;

В Pascal ABC, как и в Borland Delphi, принято использовать имя Create для конструктора и имя Destroy - для деструктора.

В Pascal ABC конструктор можно также вызвать как обычную процедуру, при этом создание объекта не происходит, а выполняется лишь тело конструктора.


Свойства

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

property Prop: тип read имя функции чтения write имя процедуры записи;

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

function getProp: тип;
procedure setProp(v: тип);

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

Например, рассмотрим тип Person (персона), имеющий поле _age (возраст). Доступ к полю _age будем осуществлять через свойство Age:

type Person=class
_age: integer;
procedure setAge(a: integer);
begin
if a>0 then _age:=a
else writeln('Ошибка в Person.setAge:
возраст не может быть отрицательным');
end;
function getAge: integer;
begin
writeln('Осуществлен доступ к полю
    _age на чтение');
Result:=_age;
end;
property Age: integer read getAge write setAge;
end;
var
p: Person;
a: integer;
...
p:=Person.Create;
p.Age:=-3; //
    выводится сообщение об ошибке
i:=p.Age; //
    выводится сообщение
    о чтении поля _age

Всякий раз, когда мы присваиваем свойству Age новое значение , вызывается процедура setAge с соответствующим параметром. Всякий раз, когда мы считываем значение свойства Age, вызывается функция getAge.

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

p._age:=-3;

Присваивание полю _age отрицательного значения ошибочно, но подобная ошибка не будет обработана.

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

property Age: integer read _age write setAge;

В этом случае строка i:=p.Age эквивалентна строке i:=p._age.

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

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

Inc(p.Age); // ошибка!

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

a:=p.Age;
Inc(a);
p.Age:=a;

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

b1.Width:=100;

Процедура для записи этого свойства в приватное поле _width будет выглядеть примерно так:

procedure SetWidth(w: integer);
begin
  if (w>0) and (w<>_width) then
  begin
    _width:=w;
    <перерисовка кнопки>
  end
end;

Следует обратить внимание на вторую часть условия в операторе if: w<>_width. Добавление этой проверки позволяет избежать лишней перерисовки кнопки в случае, если ее ширина не меняется.


Индексные свойства

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

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

property Prop[имя: тип индекса]: тип read имя функции чтения write имя процедуры записи;

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

function getProp(ind: тип индекса): тип;
procedure setProp(ind: тип индекса; v: тип);

Всякий раз, когда мы выполняем присваивание Prop[ind]:=value, вызывается процедура setProp(ind,value), а когда считываем значение Prop[ind], вызывается функция getProp(ind).

Первое индексное свойство, описанное в классе, называется индексным свойством по умолчанию и позволяет пользоваться объектами класса как массивами, т.е. использовать запись a[i], где a - объект класса.

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

type AssocArray=class
private
  words: StringArray; // слова
  nums: IntArray; // количество появлений слов
public
  constructor Create;
  begin
    words:=StringArray.Create;
    nums:=IntArray.Create;
  end;
  procedure setProp(ind: string; value: integer);
  function getProp(ind: string): integer;
  property Items[ind: string]: integer read getProp write setProp;
  property Keys: StringArray read words;
  property Values: IntArray read nums;
end;

procedure AssocArray.setProp(ind: string;
    value: integer);
var i: integer;
begin
i:=words.IndexOf(ind); //
    поиск слова
if i<>0 then
    // если найдено, то
nums[i]:=value
    // установка количества появлений слова
else
    // если не найдено, то
begin
words.add(ind);
    // добавление слова в массив слов
nums.add(value);
    // установка количества появлений слова
end;
end;

function AssocArray.getProp(ind: string):
    integer;
var i: integer;
begin
i:=words.IndexOf(ind);  // поиск слова
if i<>0 then
    // если найдено, то
Result:=nums[i]
    // возвращение количества появлений слова
else
    // если не найдено, то
begin
words.add(ind);
    // добавление слова в массив слов
nums.add(0);
    // установка количества появлений слова равным нулю
Result:=0;
end;
end;

var CountNames: AssocArray;
...
CountNames.Items['крокодил']:=3;
CountNames['бегемот']:=5; // индексное свойство по умолчанию
CountNames['бегемот']:=CountNames['бегемот']+2;

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

Inc(CountNames['бегемот'],2);


Переменная Self

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

type
  A=class
    i: integer;
    constructor Create(i: integer);
    begin
      Self.i:=i;
    end;
  end;

В момент вызова конструктора Create объект будет уже создан. Конструкция Self.i ссылается на поле i этого объекта, а не на параметр i функции Create.


Наследование

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

type MyClass=class(BaseClass)
...
end;

класс MyClass наследуется от класса BaseClass.

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

Имена полей и методов, объявленные в классе, доступны до конца объявления класса, а также во всех его потомках.

Все классы неявно наследуются от класса Object. Этот класс объявлен следующим образом:

type Object=class
  constructor Create;
  destructor Destroy;
  function TypeName: string;
  function ToString: string;
end;

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

var m: MyClass;
...
m:=MyClass.Create;
...
m.Destroy;

В конце работы программы все созданные объекты должны быть разрушены. Поэтому для каждого созданного объекта рекомендуется явно вызвать деструктор. Однако, если этого не сделать, то система Pascal ABC после завершения программы автоматически вызывает деструкторы всех созданных объектов.

Метод TypeName возвращает имя класса объекта, а метод ToString - строковое представление объекта. В классе Object метод ToString также возвращает имя класса объекта, но это поведение может быть переопределено в потомках. Например:

type MyClass=class
  i: integer;
  constructor Create(i: integer);
  begin
    Self.i:=i;
  end;
  function ToString: string;
  begin
    Result:=IntToStr(i);
  end;
end;
var a: MyClass;
...
a:=MyClass.Create(3);
writeln(a.TypeName); // MyClass
writeln(a.ToString); // 3


Видимость членов класса

Каждое поле, метод или свойство класса имеет атрибут, называемый видимостью. В Pascal ABC существуют три типа атрибутов видимости: public (открытый), private (закрытый) и protected (защищенный). К члену класса, имеющему атрибут public, можно обратиться из любого места программы, члены класса с атрибутом private доступны только внутри методов этого класса, члены класса с атрибутом protected доступны внутри методов этого класса и всех его подклассов. Атрибуты видимости могут находиться внутри класса, при этом все дальнейшие члены приобретают этот атрибут. Например:

type
  A=class
  private
    x: integer;
  protected
    a: integer;
  public
    constructor Create(xx: integer);
    begin
      x:=xx; // верно, т.к. мы внутри метода класса, которому принадлежит закрытое поле x
      a:=0; // верно
    end;
    procedure print;
  end;
  B=class(A)
    procedure print;
    begin
      writeln(a); // верно, т.к. a - защищенное поле
      writeln(x); // неверно, т.к. х - закрытое поле
    end;
  end;
...
var a1: A;
...
writeln(a1.x); // неверно, т.к. х - закрытое поле
writeln(a1.a); // неверно, т.к. a - защищенное поле
a1.print; // верно, т.к. print - открытый метод

По умолчанию все члены являются открытыми. В частности, метод print класса B - открытый.

Если x - закрытый или защищенный член класса, то доступ к нему с использованием явного указания объекта невозможен: запись a.x вызовет ошибку при компиляции "поле x недоступно".


Переопределение методов

Метод базового класса может быть переопределен (замещен) в подклассах. Если при этом требуется вызвать метод базового класса, то используется служебное слово inherited (англ.- унаследованный). Например:

type
Person=class
name: string;
age: integer;
constructor Create(nm: string; ag: integer);
begin
name:=nm; age:=ag;
end;
procedure Print;
begin
writeln('Имя: ',name,'  Возраст: ',age);
end;
end;
Student=class(Person)
course, group: integer;
constructor Create(nm: string; ag,c,gr:
integer);
begin
inherited Create(nm,ag);
course:=c; group:=gr;
name:=nm; age:=ag;
end;
procedure Print;
begin
inherited Print;
writeln('Курс: ',course,'  Группа: ',group);
end;
end;

Здесь метод Print производного класса Student вызывает вначале метод Print, унаследованный от базового класса Person, с помощью конструкции inherited Print. Аналогично конструктор Create класса Student вызывает вначале конструктор Create базового класса Person, также используя служебное слово inherited. Следует обратить внимание, что конструктор базового класса вызывается в этом случае как процедура, а не как функция, при этом создания нового объекта не происходит.


Приведение типов объектов

Объект производного класса неявно преобразуется к типу базового класса. Например, если у нас имеется класс

type MyClass=class
  procedure print;
end;

то можно инициализировать переменную класса Object объектом класса MyClass:

var o: Object;
...
o:=MyClass.Create;

Теперь в переменной типа Object хранится адрес объекта MyClass. Это можно проверить, вызвав функцию TypeName класса Object:

writeln(o.TypeName); // будет выведено 'MyClass'

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

Объект базового класса можно явно преобразовать к типу производного класса. Так, в приведенном выше примере, хотя переменная o ссылается на объект типа MyClass, пользоваться методом print, определенным в классе MyClass, через переменную o нельзя. Чтобы это осуществить, объект базового класса должен быть явно преобразован к объекту производного класса:

var m: MyClass;
...
m=MyClass(o);

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

m.print;

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


Операции is и as

Операция is предназначена для проверки того, имеет ли классовая переменная указанный динамический тип. Операция as позволяет безопасно преобразовать переменную одного классового типа к другому классовому типу (в отличие от явного приведения классового типа).

Если a1 - переменная классового типа, а B - тип класса, то выражение a1 is B возвращает True если переменная a1 имеет динамический тип, совпадающий с B или являющийся одним из его потомков, и False в противном случае. Например:

type
  A=class
  end;
  B=class(A)
  end;
var a1: A;
...
a1:=B.Create;
writeln(a1 is B); // True

Если a1 - переменная классового типа, а B - тип класса, то выражение a1 as B возвращает объект класса B, a1 имеет динамический тип B или производный от него и nil в противном случае. Например:

var b1: B;
...
b1:=a1 as B;

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

if a1 is B then
  b1:=B(a1)
else b1:=nil;


Виртуальные методы и полиморфизм

Пусть переопределенный в подклассе метод базового класса имеет тот же список формальных параметров (а для функций - и тип возвращаемого значения). Например:

type
  Base=class
    procedure Print;
    begin
      writeln('Base');
    end;
  end;
  Derived=class(Base)
    procedure Print;
    begin
      writeln('Derived');
    end;
  end;

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

var
  b,b1: Base;
  d: Student;
  ...
  b:=Base.Create;
  d:=Derived.Create;
  b1:=d;
  b.Print; // вызывается Base.Print
  d.Print; // вызывается Derived.Print
  b1.Print;

Какая версия метода Print вызывается в последнем случае - класса Base или класса Derived? В объектно-ориентированных языках программирования возможны две ситуации. Если решение о том, какой метод вызывать, принимается на этапе компиляции на основании типа, заявленного при описании b1, то вызывается метод Base.Print (говорят также, что имеет место раннее связывание имени метода с его телом). Если же решение о том, какой метод вызывать, принимается на этапе выполнения программы в зависимости от реального типа объекта, на который ссылается переменная b1, то вызывается метод Derived.Print (говорят также, что имеет место позднее связывание). Методы, для которых реализуется позднее связывание, называются виртуальными, а способность объекта вызывать через переменную базового класса метод производного класса на основании информации во время выполнения программы называется полиморфизмом.

В языке Pascal ABC все методы (за исключением конструкторов) являются виртуальными, т.е. в последнем случае вызовется функция Derived.Print.

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

type
  Shape=class
    procedure Draw; begin end;
  end;
  Point=class
    procedure Draw; begin ... end;
  end;
  Rectangle=class
    procedure Draw; begin ... end;
  end;
  Circle=class
    procedure Draw; begin ... end;
  end;
var a: array[1..4] of Shape;
...
  a[1]:=Point.Create;
  a[2]:=Rectangle.Create;
  a[3]:=Point.Create;
  a[4]:=Circle.Create;
  for i:=1 to 4 do
    a[i].Draw;

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

Внимание! Если переопределяется private-метод, то цепочка виртуальности ломается, т.е. метод рассматривается как первый с этим именем в новой цепочке виртуальности.


Обработка исключений: обзор

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

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

Если исключение не обработать, то программа завершится с ошибкой. Для обработки исключений используется оператор try ... except ... end.

Пример 1. Обработка неверного ввода данных.

Рассмотрим программу.

var i: integer;
begin
  readln(i);
  writeln(i);
  writeln('Выполнение программы продолжается');
end.

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

Перехватим исключение в блоке try:

var i: integer;
begin
  try
    readln(i);
    writeln(i);
  except
    writeln('Ошибка ввода');
  end;
  writeln('Выполнение программы продолжается');
end.

На этот раз при возникновении ошибки ввода программа не будет завершена, а выполнение будет передано в блок except, после чего выполнение программы продолжится дальше. Таким образом, в последней программе не выполнится лишь оператор writeln(i).

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

Пример 2. Обработка различных исключений.

assign(f,'a.txt');
try
  reset(f);
  c:=a div b;
except
  on EDivByZero do
    writeln('Целочисленное деление на 0');
  on EInOutError do
    writeln('Файл отсутствует');
end;

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

Пример 3. Вложенные операторы try ... except и try ... finally.

assign(f,'a.txt');
try
  reset(f);
  try
    try
      c:=a div b;
    except
      on EDivByZero do
        writeln('Целочисленное деление на 0');
    end;
  finally
    close(f);
  end;
except
  on EInOutError do
    writeln('Файл отсутствует');
end;

Обратим внимание, что в данном примере исключение, связанное c целочисленным делением на 0, обрабатывается в самом внутреннем блоке try, а исключение, связанное с отсутствующим файлом - в самом внешнем. При этом, если файл был открыт, то независимо от возникновения исключения деления на 0 он будет закрыт.


Стандартные классы исключений

Все классы исключений являются потомками класса Exception, имеющего следующий интерфейс:

type
  Exception=class
    Message: string;
    constructor Create(mess: string);
  end;

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

В модуле System определены следующие классы исключений (они не добавляют к классу Exception никакого дополнительного интерфейса):

EAccessViolation - класс исключений для ошибки нарушения защиты доступа.

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

EConvertError - класс исключений для ошибки преобразования данных.

EInOutError - класс исключений для ошибки ввода-вывода.

EIntError - класс исключений для ошибки при работе с целыми.

EDivByZero - класс исключений для ошибки целочисленного деления на 0. Наследник класса EIntError.

ERangeError - класс исключений для ошибки выхода за границы диапазона. Наследник класса EIntError.

EIntOverflow - класс исключений для ошибки целочисленного переполнения. Наследник класса EIntError.

EInvalidCast - класс исключений для ошибки неверного приведения типа.

EInvalidPointer - класс исключений для ошибки при работе с указателями.

EMathError - класс исключений для ошибки при выполнении математической операции.

EInvalidArgument - класс исключений для ошибки неверного аргумента при выполнении математической операции (sqrt(-1)). Наследник класса EMathError.

EInvalidOp - класс исключений для ошибки "Неверная операция". Наследник класса EMathError.

EOverflow - класс исключений для ошибки вещественного переполнения. Наследник класса EMathError.

EUnderflow - класс исключений для ошибки потери значимости при работе с вещественными. Наследник класса EMathError.

EZeroDivide - класс исключений для ошибки вещественного деления на 0. Наследник класса EMathError.

EOutOfMemory - класс исключений для ошибки исчерпания динамической памяти.

EUnknown - класс исключений для неизвестных исключений.


Исключения, определяемые пользователем

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

type EMyException=class(Exception) end;

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

try
  ...
except
  on EMyException do
    writeln('Целочисленное деление на 0');
  on Exception do
    writeln('Файл отсутствует');
end;

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

type
  EFileNotFound = class(Exception)
    fname: string;
    constructor Create(msg,fn: string);
    begin
      inherited Create(msg);
      fname:=fn;
    end;
  end;

...

procedure ReadFile(fname: string);
begin
  if not FileExists(fname) then
    raise EFileNotFound.Create('Файл не найден',fname);
end;

...

try
  ...
except
  on e: EFileNotFound do
    writeln('Файл '+e.fname+' не найден');
end;


Модули

Модули предназначены для разбиения текста программы на несколько файлов. В модулях описываются переменные, константы, типы, классы, процедуры и функции. Для того чтобы эти объекты можно было использовать в вызывающем модуле (которым может быть и основная программа), следует указать имя файла модуля (без расширения .pas) в разделе uses вызывающего модуля. Файл модуля должен находиться либо в том же каталоге, что и основная программа, либо в подкаталоге Units системного каталога программы Pascal ABC.

Модуль в Pascal ABC представляет собой файл со следующим содержанием:

unit имя модуля;
раздел подключения модулей
раздел описаний
раздел инициализации
раздел финализации
end.

Первая строка обязательна и называется заголовком модуля.

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

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

Раздел инициализации состоит из служебного слова initialization, после которого следуют операторы, разделяемые символом "точка с запятой". Операторы из раздела инициализации модуля выполняются до начала основной программы.

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

Раздел финализации может отсутствовать, либо оба раздела инициализации и финализации могут отсутствовать. Раздел инициализации может также начинаться со служебного слова begin, в этом случае раздел финализации отсутствует.

Например:

unit Lib;
uses GraphABC;
const Dim=5;
var Colors: array [1..Dim] of integer;
function RandomColor: integer;
begin
  Result:=RGB(Random(255),Random(255),Random(255));
end;
procedure FillByRandomColor;
var i: integer;
begin
  for i:=1 to Dim do
    Colors[i]:=RandomColor;
end;
initialization
  FillByRandomColor;
end.

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

Циклические ссылки в модулях запрещены. Например, ситуация, когда в в модуле a.pas присутствует строка uses b, а в модуле b.pas - строка uses a, считается ошибочной.


Модуль GraphABC

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

Графические примитивы

Действия с цветом

Действия с пером

Действия с кистью

Действия со шрифтом

Действия с рисунками: описатели

Действия с рисунками: класс Picture

Действия с графическим окном

Задание режимов вывода

Сравнение описателей рисунков и класса Picture приведено здесь.

Процедуры и функции рисования и установки параметров рисования аналогичны методам и свойствам класса TCanvas в Delphi. Например, вместо свойства Canvas.Brush.Color используется пара: процедура SetBrushColor(color) и функция BrushColor.


Графические примитивы

procedure SetPixel(x,y,color: integer);

Закрашивает один пиксел с координатами (x,y) цветом color.

function GetPixel(x,y): integer;

Возвращает текущее значение цвета для пиксела с координатами (x,y).

procedure MoveTo(x,y: integer);

Передвигает невидимое перо к точке с координатами (x,y); эта функция работает в паре с функцией LineTo(x,y).

procedure LineTo(x,y: integer);

Рисует отрезок от текущего положения пера до точки (x,y); координаты пера при этом также становятся равными (x,y).

procedure Line(x1,y1,x2,y2: integer);

Рисует отрезок с началом в точке (x1,y1) и концом в точке (x2,y2).

procedure Circle(x,y,r: integer);

Рисует окружность с центром в точке (x,y) и радиусом r.

procedure Ellipse(x1,y1,x2,y2: integer);

Рисует эллипс, заданный своим описанным прямоугольником с координатами противоположных вершин (x1,y1) и (x2,y2).

procedure Rectangle(x1,y1,x2,y2: integer);

Рисует прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2).

procedure RoundRect(x1,y1,x2,y2,w,h: integer);

Рисует прямоугольник со скругленными краями; (x1,y1) и (x2,y2) задают пару противоположных вершин, а w и h – ширину и высоту эллипса, используемого для скругления краев.

procedure Arc(x,y,r,a1,a2: integer);

Рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки).

procedure Pie(x,y,r,a1,a2: integer);

Рисует сектор окружности, ограниченный дугой (параметры процедуры имеют тот же смысл, что и в процедуре Arc).

procedure Chord(x,y,r,a1,a2: integer);

Рисует фигуру, ограниченную дугой окружности и отрезком, соединяющим ее концы (параметры процедуры имеют тот же смысл, что и в процедуре Arc).

procedure TextOut(x,y: integer; s: string);

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

procedure FloodFill(x,y,color: integer);

Заливает область одного цвета цветом color, начиная с точки (x,y).

procedure FillRect(x1,y1,x2,y2: integer);

Заливает прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2), цветом текущей кисти.

procedure Polygon(var a; n: integer);

Строит ломаную по n точкам, координаты которых заданы в массиве a элементов типа Point.

procedure Polyline(var a; n: integer);

Строит замкнутую ломаную по n точкам, координаты которых заданы в массиве a элементов типа Point.


Цветовые константы и функции для работы с цветом

Модуль GraphABC содержит константы и функции для работы с цветами. Тип ColorType, описывающий цвет, определен следующим образом:

type ColorType=integer;

Стандартные цвета задаются символическими константами:

clBlack – черный
clPurple – фиолетовый
clWhite – белый
clMaroon – темно-красный
clRed – красный
clNavy – темно-синий
clGreen – зеленый
clBrown – коричневый
clBlue – синий
clSkyBlue – голубой
clYellow – желтый
clCream – кремовый 		clAqua – бирюзовый
clOlive – оливковый
clFuchsia – сиреневый
clTeal – сине-зеленый
clGray – темно-серый
clLime – ярко-зеленый
clMoneyGreen – цвет зеленых денег
clLtGray – светло-серый
clDkGray – темно-серый
clMedGray – серый
clSilver – серебряный
Для работы с цветами используются следующие функции.

function RGB(r,g,b: integer): ColorType;

Возвращает целое значение, являющееся кодом цвета, который содержит красную, зеленую и синюю составляющие с интенсивностями r, g и b соответственно (r, g и b – целые в диапазоне от 0 до 255, причем, 0 соответствует минимальной интенсивности, 255 – максимальной).

function GetRed(color: ColorType): integer;

Выделяет красную составляющую из цвета color (целое в диапазоне от 0 до 255);

function GetGreen(color: ColorType): integer;

Выделяет зеленую составляющую из цвета color (целое в диапазоне от 0 до 255);

function GetBlue(color: ColorType): integer;

Выделяет синюю составляющую из цвета color (целое в диапазоне от 0 до 255).


Действия с пером

function PenX: integer;
function PenY: integer;
Возвращают текущие координаты пера.

procedure SetPenColor(color: integer);

Устанавливает цвет пера, задаваемый параметром color.

function PenColor: integer;

Возвращает текущий цвет пера.

procedure SetPenWidth(w: integer);

Устанавливает ширину пера, равную w пикселам.

function PenWidth: integer;

Возвращает текущую ширину пера.

procedure SetPenStyle(ps: integer);

Устанавливает стиль пера, задаваемый параметром ps.

function PenStyle: integer;

Возвращает текущий стиль пера.

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

psSolid
psClear
psDash
psDot
psDashDot
psDashDotDot

procedure SetPenMode(m: integer);

Устанавливает режим пера, задаваемый параметром m.

function PenMode: integer;

Возвращает текущий режим пера. Режим пера определяет, как цвет пера взаимодействует с цветом поверхности.

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

pmCopy – обычный режим; при рисовании цвет поверхности заменяется цветом пера;

pmNot – режим инвертирования; при рисовании цвет поверхности инвертируется (становится негативным), а цвет пера при этом игнорируется.


Действия с кистью

procedure SetBrushColor(color: integer);

Устанавливает цвет кисти, задаваемый параметром color.

function BrushColor: integer;

Возвращает текущий цвет кисти.

procedure SetBrushPicture(fname: string);

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

procedure ClearBrushPicture;

Очищает рисунок-образец, выбранный для кисти.

procedure SetBrushStyle(bs: integer);

Устанавливает стиль кисти, задаваемый параметром bs.

function BrushStyle: integer;

Возвращает текущий стиль кисти.

Стили кисти задаются следующими именованными константами:

bsSolid | bsCross
bsClear | bsDiagCross
bsHorizontal | bsBDiagonal
bsVertical | bsFDiagonal


Действия со шрифтом

procedure SetFontColor(color: integer);

Устанавливает цвет шрифта.

function FontColor: integer;

Возвращает текущий цвет шрифта.

procedure SetFontSize(sz: integer);

Устанавливает размер шрифта в пунктах.

function FontSize: integer;

Возвращает текущий размер шрифта в пунктах.

procedure SetFontName(name: string);

Устанавливает наименование шрифта.

function FontName: string;

Возвращает текущее наименование шрифта.

По умолчанию установлен шрифт, имеющий наименование MS Sans Serif.
Наиболее распространенные шрифты – это Times, Arial и Courier New.
Наименование шрифта можно набирать без учета регистра.

procedure SetFontStyle(fs: integer);

Устанавливает стиль шрифта.

function FontStyle: integer;

Возвращает текущий стиль шрифта.

Стили шрифта задаются следующими именованными константами:

fsNormal – обычный;

fsBold – жирный;

fsItalic – наклонный;

fsBoldItalic – жирный наклонный;

fsUnderline – подчеркнутый;

fsBoldUnderline – жирный подчеркнутый;

fsItalicUnderline – наклонный подчеркнутый;

fsBoldItalicUnderline – жирный наклонный подчеркнутый.

function TextWidth(s: string): integer;

Возвращает ширину строки s в пикселях при текущих настройках шрифта.

function TextHeight(s: string): integer;

Возвращает высоту строки s в пикселях при текущих настройках шрифта.


Действия с рисунками

Работа с рисунками в модуле GraphABC производится либо с помощью описателей (целых чисел, однозначно определяющих рисунок), либо с помощью объектов класса Picture. Работа с помощью описателей позволяет манипулировать рисунками, используя обычные поцедуры и функции и не используя классы.

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

function LoadPicture(fname: string): integer;

n:=LoadPicture(fname) – загружает рисунок из файла с именем fname в оперативную память и возвращает описатель рисунка в целую переменную n; если файл не найден, то возникает ошибка времени выполнения. Загружать можно рисунки в формате .bmp, .jpg или .gif.

procedure SavePicture(n: integer; fname: string);

Сохраняет рисунок с описателем n в файл с именем fname. Рисунки можно сохранять в формате .bmp, .jpg или .gif.

procedure DrawPicture(n,x,y: integer);

Выводит рисунок с описателем n в позицию (x,y) графического окна.

procedure DrawPicture(n,x,y,w,h: integer);

Выводит рисунок с описателем n в позицию (x,y) графического окна, масштабируя его размеры к ширине w и высоте h. Если w<0, то рисунок зеркально отражается относительно вертикальной прямой, проходящей через x, если же h<0, то рисунок зеркально отражается относительно горизонтальной прямой, проходящей через y.

procedure DrawPicture(n: integer; x,y: integer; r: Rect);

Выводит часть рисунка с описателем n, заключенную в прямоугольнике r, в позицию (x,y) графического окна.

procedure DrawPicture(n: integer; x,y,w,h: integer; r: Rect);

Выводит часть рисунка с описателем n, заключенную в прямоугольнике r, в позицию (x,y) графического окна, масштабируя его размеры к ширине w и высоте h. Если w<0, то рисунок зеркально отражается относительно вертикальной прямой, проходящей через x, если же h<0, то рисунок зеркально отражается относительно горизонтальной прямой, проходящей через y.

procedure CopyRect(n: integer; dest: Rect; n1: integer; src: Rect);

Копирует часть рисунка с описателем n1, заключенную в прямоугольнике src, в прямоугольник dest рисунка с описателем n.

procedure DestroyPicture(n: integer);

Удаляет рисунок с описателем n из оперативной памяти, описатель рисунка при этом становится недействительным.

procedure SetPictureSize(n,w,h: integer);

Устанавливает размер рисунка с описателем n равным w на h пикселей.

function PictureWidth(n: integer): integer;

Возвращает ширину рисунка с описателем n.

function PictureHeight(n: integer): integer;

Возвращает высоту рисунка с описателем n.

function PictureTransparent(n: integer): boolean;

Возвращает режим прозрачности рисунка с описателем n.

function CreatePicture(w,h: integer): integer;

Создает рисунок ширины w и высоты h и возвращает его описатель.

function CreatePictureFromRect(r: Rect): integer;

Создает рисунок из прямоугольника r графического окна и возвращает его описатель.

function CreatePictureFromScreenBufferRect(r: Rect): integer;

Создает рисунок из прямоугольника r внеэкранного буфера графического окна и возвращает его описатель.

procedure SetPictureTransparent(n: integer; b: boolean);

Устанавливает (b=True) или отключает (b=False) режим прозрачности при рисовании рисунка с описателем n. Если b=True, то при его рисовании фон не отображается. Фоновым считается цвет левого нижнего пиксела рисунка.

function ImageIntersect(n1,n2: integer): boolean;

Определяет, пересекаются ли изображения на рисунках с описателями n1 и n2. Рисунки должны иметь одинаковый размер. Белый цвет на рисунке считается прозрачным. Изображения на рисунках считаются пересекающимися, если имеется хотя бы один пиксел, который не прозрачен и имеет одни и те же координаты для обоих рисунков.

function StandardImageFolder: string;

Возвращает стандартный каталог для картинок (обычно \Media\Images\).

procedure FlipPictureHorizontal(n);

Зеркально отображает картинку с описателем n относительно горизонтальной оси симметрии.

procedure FlipPictureVertical(n);

Зеркально отображает картинку с описателем n относительно вертикальной оси симметрии.


Действия с графическим окном

procedure ClearWindow;

Очищает графическое окно белым цветом.

procedure ClearWindow(c: ColorType);

Очищает графическое окно цветом c.

function WindowWidth: integer;

Возвращает ширину графического окна.

function WindowHeight: integer;

Возвращает высоту графического окна.

function WindowLeft: integer;

Возвращает отступ графического окна от левого края экрана.

function WindowTop: integer;

Возвращает отступ графического окна от верхнего края экрана.

function WindowCaption: string;

Возвращает заголовок графического окна.

procedure SetWindowWidth(w: integer);

Устанавливает ширину графического окна.

procedure SetWindowHeight(h: integer);

Устанавливает высоту графического окна.

procedure SetWindowLeft(l: integer);

Устанавливает отступ графического окна от левого края экрана.

procedure SetWindowTop(t: integer);

Устанавливает отступ графического окна от верхнего края экрана.

procedure SetWindowSize(w,h: integer);

Устанавливает ширину и высоту графического окна.

procedure SetWindowPos(l,t: integer);

Устанавливает отступ графического окна от левого и верхнего края экрана.

procedure SetWindowCaption(s: string);

Устанавливает заголовок графического окна.

procedure SetWindowTitle(s: string);

Устанавливает заголовок графического окна. Синоним SetWindowCaption.

procedure SaveWindow(fname: string);

Сохраняет содержимое графического окна в файл с именем fname.

procedure LoadWindow(fname: string);

Выводит в графическое окно рисунок из файла с именем fname. Файл ищется вначале в текущем каталоге, а затем в каталоге PascalABC\Media\Images.

procedure FillWindow(fname: string);

Заполняет графическое окно мозаикой из рисунка, содержащегося в файле с именем fname.

procedure FillWindow(n: integer);

Заполняет графическое окно мозаикой из рисунка с описателем n.

procedure CloseWindow;

Закрывает графическое окно.

function ScreenWidth: integer;

Возвращает ширину экрана.

function ScreenHeight: integer;

Возвращает высоту экрана.

procedure CenterWindow;

Центрирует графическое окно по центру экрана.

procedure MaximizeWindow;

Максимизирует графическое окно на экране.

procedure NormalizeWindow;

Восстанавливает положение графического окна на экране.

Все размеры устанавливаются и возвращаются в пикселах.


Задание режимов вывода

procedure SetDrawingSurface(n: integer);

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

procedure SetDrawingSurface(p: Picture);

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

procedure RestoreDrawingSurface;

Устанавливает в качестве канвы для рисования графическое окно.

procedure Redraw;

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

procedure LockDrawing;

Блокирует вывод в графическое окно, осуществляя рисование только во внеэкранном буфере. Для перерисовки графического окна требуется вызвать процедуру Redraw. Если графический вывод перенаправлен в рисунок вызовом процедуры SetDrawingSurface, то не оказывает никакого воздействия на вывод.

procedure UnlockDrawing;

Снимает блокировку вывода в графическое окно.

procedure LockScreenBuffer;

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

procedure UnlockScreenBuffer;

Снимает блокировку вывода во внеэкранный буфер графического окна.

function DrawingIsLocked: boolean;

Возвращает True, если вывод в графическое окно заблокирован, и False в противном случае.

procedure SetRedrawProc(procedure RedrawProc);

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

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

Пример: анимация без мерцания


Класс Picture

Для работы с рисунками в модуле GraphABC используются либо описатели, либо объекты класса Picture.

Класс Picture описывает рисунок, хранящийся в оперативной памяти, и имеет следующий интерфейс:

type
  Picture=class
    constructor Create(w,h: integer);
    constructor Create(fname: string);
    constructor CreateFromRect(r: Rect);
    constructor CreateFromScreenBufferRect(r: Rect);
    destructor Destroy;
    procedure Load(fname: string);
    procedure Save(fname: string);
    procedure SetSize(w,h: integer);
    property Width: integer;
    property Height: integer;
    property Transparent: boolean;
    property NeedDestroy: boolean;
    function Handle: integer;
    function Intersect(p: Picture): boolean;
    procedure Draw(x,y: integer);
    procedure Draw(x,y,w,h: integer);
    procedure Draw(x,y: integer; r: Rect);
    procedure Draw(x,y,w,h: integer; r: Rect);
    procedure CopyRect(dst: Rect; p: Picture; src: Rect);
    procedure FlipHorizontal;
    procedure FlipVertical;
  end;

Конструкторы и деструкторы

constructor Create(w,h: integer);

Создает объект класса Picture ширины w и высоты h. Рисунок может быть скопирован в него из прямоугольной области другого рисунка методом CopyRect. На рисунке может быть также произведено рисование вызовом любых процедур рисования после установки его в качестве поверхности рисования (метод SetDrawingSurface).

constructor Create(fname: string);

Создает объект класса Picture и загружает в него рисунок из файла fname (допустимые форматы файлов: .bmp, .gif, .jpg, .png). Рисунок с именем fname ищется вначале в текущем каталоге, а затем в подкаталоге Media\Images\ каталога программы PascalABC.exe.

constructor CreateFromRect(r: Rect);

Создает объект класса Picture и копирует в него изображение из прямоугольника r на экране. Размер рисунка равен размеру прямоугольника.

constructor CreateFromScreenBufferRect(r: Rect);

Создает объект класса Picture и копирует в него изображение из прямоугольника r внеэкранного буфера. Размер рисунка равен размеру прямоугольника.

destructor Destroy;

Разрушает объект. Если NeedDestroy установлено в True, то рисунок, находящийся в объекте Picture, также разрушается.

Свойства

property Width: integer;

Ширина рисунка.

property Height: integer;

Высота рисунка.

property Transparent: boolean;

Прозрачность рисунка. Если Transparent=True, то при выводе рисунка его фон не отображается. Фоновым считается цвет левого нижнего пиксела рисунка.

property NeedDestroy: boolean;

Определяет, должен ли рисунок разрушаться при вызове деструктора и метода Load. NeedDestroy обычно устанавливается в False, если несколько объектов класса Picture разделяют один рисунок.

Методы

procedure Load(fname: string);

Загружает рисунок из файла с именем fname. Если NeedDestroy установлено в True, то рисунок, находившийся ранее в объекте Picture, разрушается. Рисунок с именем fname ищется вначале в текущем каталоге, а затем в подкаталоге Media\Images\ каталога программы PascalABC.exe.

procedure Save(fname: string);

Сохраняет рисунок в файле с именем fname. Формат рисунка устанавливается расширением имени файла. Допустимые расширения: .bmp, .gif, .jpg, .png.

function Handle: integer;

Возвращает описатель рисунка.

procedure Draw(x,y: integer);

Выводит рисунок в позицию (x,y) графического окна.

procedure Draw(x,y,w,h: integer);

Выводит рисунок в позицию (x,y) графического окна, масштабируя его к размеру (w,h). Если w<0 или h<0, то выводится зеркальное отражение рисунка относительно вертикалоной или горизонтальной оси соответственно.

procedure Draw(x,y: integer; r: Rect);

Выводит часть рисунка, заключенную в прямоугольнике r, в позицию (x,y) графического окна.

procedure Draw(x,y,w,h: integer; src: Rect);

Выводит часть рисунка, заключенную в прямоугольнике r, в позицию (x,y) графического окна, масштабируя ее к размеру (w,h).

procedure CopyRect(dest: Rect; p: Picture; src: Rect);

Копирует в прямоугольник dest текущего рисунка часть рисунка p, заключенную в прямоугольнике src.

procedure FlipHorizontal;

Зеркально отображает картинку относительно горизонтальной оси симметрии.

procedure FlipVertical;

Зеркально отображает картинку относительно вертикальной оси симметрии.


Описатели рисунков и класс Picture

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

Тем не менее, автор программы настоятельно рекомендует использовать именно класс Picture при работе с рисунками, что позволит ученику раньше начать осваивать основные понятия объектно-ориентированного программирования.

Класс Picture полностью написан на Pascal ABC и содержит в своем интерфейсе все подпрограммы работы с рисунками.

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

uses GraphABC;
var n: integer;
begin
  n:=LoadPicture('demo.bmp');
  SetPictureTransparent(n,True);
  DrawPicture(n,0,0);
  DestroyPicture(n);
end.

Эквивалентный пример работы с рисунком как объектом класса Picture выглядит более естественным:

uses GraphABC;
var p: Picture;
begin
  p:=Picture.Create('demo.bmp');
  p.Transparent:=True;
  p.Draw(0,0);
  p.Destroy;
end.


Модуль ABCObjects: обзор

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

Модуль ABCObjects предназначен для раннего обучения основам объектно-ориентированного программирования, а также для реализации графических и анимационных проектов средней сложности. Он полностью написан на Pascal ABC на основе модуля GraphABC и содержится в подпапке Units основной папки программы Pascal ABC.

На основе модуля ABCObjects созданы модули ABCSprites, ABCButtons, ABCChessObjects, ABCHouse, ABCRobots, ABCAdditionalObjects.

Следующие темы помогут изучить возможности модуля ABCObjects:

Быстрое введение

Диаграмма классов

Класс ObjectABC

Создание графических объектов

Динамический массив Objects

Константы, процедуры и функции модуля ABCObjects

Контейнеры графических объектов

Мультикартинки

Спрайты (модуль ABCSprites)

Создание нового типа графического объекта

Ускорение перерисовки графических объектов

Совмещение графического вывода модулей ABCObjects и GraphABC


ABCObjects: быстрое введение

Основными типами графических объектов, определенными в модуле ABCObjects, являются RectangleABC, SquareABC, EllipseABC, CircleABC, TextABC, RegularPolygonABC, StarABC, PictureABC, MultiPictureABC, BoardABC и ContainerABC.

Типы графических объектов представляют собой классы, состоящие из методов и свойств, а также нуждающиеся в конструировании перед первым использованием. Изменение свойств влияет на внешний вид и поведение графических объектов. Например, при изменении свойств Width и Height меняются размеры графического объекта, при изменении свойства Color - цвет графического объекта и т.д. Вызов методов графического объекта возвращает или меняет его характеристики. Например, при вызове метода ToFront графический объект перемещается на передний план, а вызов метода Intersect(g) возвращает, пересекается ли текущий объект с объектом g.

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

Создадим два перекрывающихся графических объекта:

uses ABCObjects;

var
  r: RectangleABC;
  c: CircleABC;

begin
  r:=RectangleABC.Create(70,50,200,100,clMoneyGreen);
  c:=CircleABC.Create(120,80,110,clBlue);
end.

После запуска программы увидим на экране следующее:

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

r.Width:=150;
c.Color:=clRed;
c.MoveOn(30,30);

После запуска программы:

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

c.Number:=8;
r.Text:='Hello';
r.ToFront;

После запуска программы:


Диаграмма классов

На рисунке приведена диаграмма классов модуля ABCObjects.

Класс SpriteABC описан в модуле ABCSprites, однако, приведен на диаграмме как один из важнейших.


Класс ObjectABC

Класс ObjectABC является базовым классом для всех графических объектов. Его основными потомками, определенными в модуле ABCObjects, являются следующие классы: BoundedObjectABC, RectangleABC, SquareABC, EllipseABC, CircleABC, TextABC, RegularPolygonABC, StarABC, PictureABC, MultiPictureABC, BoardABC и ContainerABC.

Класс ObjectABC - абстрактный: объекты этого класса не создаются. Он имеет следующий интерфейс:

ObjectABC=class
constructor Create(x,y,w,h: integer; cl:
    ColorType);
constructor CreateBy(g: ObjectABC);
destructor Destroy;
procedure Draw(x,y: integer);
procedure MoveTo(x,y: integer);
procedure MoveTo(p: Point);
procedure MoveOn(dx,dy: integer);
procedure Move;
procedure Scale(f: real);
procedure ToFront;
procedure ToBack;
function Bounds: Rect;
function Intersect(g: ObjectABC): boolean;
function IntersectRect(r: Rect): boolean;
function PtInside(x,y:integer): boolean;
function Clone: ObjectABC;
property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property Position: Point;
property Center: Point;
property Visible: boolean;
property Color: ColorType;
property Text: string;
property TextVisible: boolean;
property TextScale: real;
property Number: integer;
property RealNumber: real;
property Owner: ContainerABC;
property MouseIndifferent: boolean;
property dx: integer;
property dy: integer;
end;

Конструкторы и деструкторы

constructor Create(x,y,w,h: integer; cl: ColorType);

Создает графический объект ширины w, высоты h и цвета cl в позиции (x,y). После создания графический объект рисуется на экране.

constructor CreateBy(g: ObjectABC);

Создает графический объект, являющийся копией g.

destructor Destroy;

Уничтожает графический объект. В результате уничтожения он удаляется с экрана и из массива Objects.

Свойства

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы

procedure Draw(x,y: integer);

Рисует графический объект в позиции x,y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x,y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.

function Clone: ObjectABC;

Создает клон графического объекта и возвращает его.


ABCObjects: создание графических объектов

Для создания объектов ABCObjects используются следующие конструкторы:

RectangleABC, EllipseABC: constructor Create(x,y,w,h: integer; cl: ColorType);
SquareABC, CircleABC: constructor Create(x,y,w: integer; cl: ColorType);
RoundRectABC: constructor Create(x,y,w,h,rr: integer; cl: ColorType);
RoundSquareABC: constructor Create(x,y,w,rr: integer; cl: ColorType);
TextABC: constructor Create(x,y,pt: integer; cl: ColorType; tx: string);
RegularPolygonABC: constructor Create(x,y,r,nn: integer; cl: ColorType)
StarABC: constructor Create(x,y,r,r1,nn: integer; cl: ColorType);
PictureABC: constructor Create(x,y: integer; fname: string);
MultiPictureABC: constructor Create(x,y: integer; fname: string);
                 constructor Create(x,y,w: integer; fname: string);
BoardABC: constructor Create(x,y,nn,mm,ssz: integer; cl: ColorType);
ContainerABC: constructor Create(x,y: integer);

Например,

s:=StarABC.Create(100,200,90,50,5,clGreen);
r:=RectangleABC.Create(300,300,100,50,clRed);

Для начинающих рекомендуется создавать объекты вызовом не конструкторов, а функций

function CreateRectangleABC(x,y,w,h: integer; cl: ColorType):
    RectangleABC;
function CreateEllipseABC(x,y,w,h: integer; cl: ColorType):
    EllipseABC;
function CreateSquareABC(x,y,w: integer; cl: ColorType): SquareABC;
function CreateCircleABC(x,y,w: integer; cl: ColorType): CircleABC;
function CreateRoundRectABC(x,y,w,h,rr: integer; cl: ColorType):
    RoundRectABC;
function CreateRoundSquareABC(x,y,w,rr: integer; cl: ColorType):
    RoundSquareABC;
function CreateTextABC(x,y,pt: integer; cl: ColorType; tx:
    string): TextABC;
function CreateRegularPolygonABC(x,y,r,nn: integer; cl: ColorType):
    RegularPolygonABC;
function CreateStarABC(x,y,r,r1,nn: integer; cl: ColorType): StarABC;
function CreatePictureABC(x,y,w,h: integer; fname: string):
    PictureABC;
function CreateMultiPictureABC(x,y,w: integer; fname: string):
    MultiPictureABC;
function CreateMultiPictureABC(x,y: integer; fname: string):
    MultiPictureABC;
function CreateBoardABC(x,y,nn,mm,ssz: integer; cl: ColorType):
    BoardABC;
function CreateContainerABC(x,y: integer): ContainerABC;

Например,

s:=CreateStarABC(100,200,90,50,5,clGreen);
r:=CreateRectangleABC(300,300,100,50,clRed);


Динамический массив Objects

В модуле ABCObjects определен динамический массив Objects, который хранит все созданные графические объекты. Он принадлежит к типу ObjectsABCArray, определенному в ABCObjects. Для массива Objects определены всего 2 операции: Objects.Count возвращает количество графических объектов, а Objects[i] возвращает i-тый графический объект (типа ObjectABC, нумерация осуществляется с 1).

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

Пример 1. Броуновское движение объектов.

uses ABCObjects;

var i:integer;

begin
  for i:=1 to 30 do
    CircleABC.Create(Random(WindowWidth),Random(WindowHeight),20,clRandom);
  while True do
    for i:=1 to Objects.Count do
      Objects[i].MoveOn(Random(3)-1,Random(3)-1);
end.

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

Пример 2. Изменение свойств объектов заданного типа.

uses ABCObjects;

var i:integer;

begin
  for i:=1 to 30 do
    case Random(2) of
      0: CircleABC.Create(Random(WindowWidth),Random(WindowHeight),20,clRandom);
      1: RegularPolygonABC.Create(Random(WindowWidth),Random(WindowHeight),20,3,clRandom);
    end;
  while True do
    for i:=1 to 30 do
      if Objects[i] is RegularPolygonABC then
        RegularPolygonABC(Objects[i]).Angle:=RegularPolygonABC(Objects[i]).Angle+1;
end.

В этом примере создается 30 объектов CircleABC или RegularPolygonABC. Затем в бесконечном цикле вращаются только объекты RegularPolygonABC. Вращение достигается увеличением свойства Angle, которое определено только в классе RegularPolygonABC. Для установки принадлежности объекта к классу RegularPolygonABC используется операция is, после чего объект Objects[i] преобразуется к типу RegularPolygonABC при помощи операции приведения типа.

Пример 3. Удаление всех графических объектов, пересекшихся с объектом p:

for i:=Objects.Count downto 1 do
  if (Objects[i]<>p) and (p.Intersects(Objects[i]) then
    Objects[i].Destroy;

В играх часто нужно удалить все графические объекты, которые "настиг" объект p. Для этого следует перебрать все графические объекты за исключением самого p и проверить их на предмет пересечения с p. Удаление осуществляется вызовом деструктора соответствующего объекта. Отметим также, что в результате удаления количество объектов уменьшается, поэтому следует перебирать объекты от конца к началу.


Константы, процедуры и функции модуля ABCObjects

В модуле ABCObjects определены следующие переменные, типы, процедуры и функции:

var Objects: ObjectsABCArray;

Динамический массив графических объектов. Objects.Count возвращает количество графических объектов, а Objects[i] возвращает i-тый графический объект типа ObjectABC. Примеры использования массива Objects - здесь.

type ColorType=integer;

Тип цвета. Желательно в качестве типа переменной, хранящей цвет, использовать именно ColorType.

function ObjectsCount: integer;

Функция, возвращающая количество графических объектов. Синоним Оbjects.Count.

function ObjectUnderPoint(x,y: integer): ObjectABC;

Функция, возвращающая объект, находящийся под точкой (x,y). Если таких объектов несколько, то возвращается самый верхний.

function ObjectUnderPoint(p: Point): ObjectABC;

Функция, возвращающая объект, находящийся под точкой (p.x,p.y). Если таких объектов несколько, то возвращается самый верхний.

function ObjectsIntersects(g1,g2: ObjectABC): boolean;

Функция, возвращающая True, если объекты g1 и g2 пересекаются, и False в противном случае. Для ненулевого g1 вызывает g1.Intersect(g2).

procedure SwapPositions(g1,g2: ObjectABC);

Меняет координаты объектов g1 и g2.

procedure ToFront(g: ObjectABC);

Переносит графический объект g на передний план.

procedure ToBack(g: ObjectABC);

Переносит графический объект g на задний план.

procedure LockDrawingObjects;

Блокирует рисование графических объектов. Возможна лишь перерисовка всего экрана вместе со всеми графическими объектами на нем вызовом RedrawObjects.

procedure UnLockDrawingObjects;

Разблокирует рисование графических объектов.

procedure RedrawObjects;

Перерисовка всего экрана вместе со всеми графическими объектами на нем.

procedure SetMouseDragABCObjects;

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

В модуле ABCObjects также переопределены все цветовые константы из модуля GraphABC и следующие подпрограммы:

function RGB(r,g,b: integer): integer;
function clRandom: integer;
function WindowWidth: integer;
function WindowHeight: integer;
procedure SetWindowWidth(w: integer);
procedure SetWindowHeight(h: integer);
procedure SetWindowCaption(s: string);
procedure SetWindowSize(w,h: integer);

Кроме того, в модуле ABCObjects переопределены следующие подпрограммы и типы из модуля PointRect:

type
  Point = PointRect.Point;
  Rect = PointRect.Rect;
function PointF(x,y: integer): Point;
function RectF(l,t,r,b: integer): Rect;


Контейнеры графических объектов

Класс ContainerABC представляет собой контейнер графических объектов. Он также является потомком ObjectABC, но при создании не содержит ни одного объекта. Он добавляет следующий интерфейс:

procedure Add(g: ObjectABC);
property Count: integer; // количество объектов
property Objects[i: integer]: ObjectABC; // i-тый объект

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

Рассмотрим следующую программу:

uses ABCObjects;

var
  c1,c2: ContainerABC;
  r: CircleABC;

begin
  SetWindowSize(300,300);
  c1:=ContainerABC.Create(50,30);
  c1.Add(RectangleABC.Create(0,0,200,100,clGreen));
  r:=CircleABC.Create(15,15,70,clYellow);
end.

После ее запуска графический экран имеет вид:

Контейнер c1 содержит зеленый прямоугольник, а объект r не имеет владельца (r.Owner=nil). Нетрудно убедиться, что ObjectsCount=2 (контейнер и круг), а c1.Count=1.

Добавим круг в контейнер, дописав в конец программы строчку

c1.Add(r);

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

Круг r теперь принадлежит контейнеру (r.Owner=с2), ObjectsCount=1 (только контейнер), а c1.Count=2. Кроме этого, координаты круга пересчитываются относительно координат контейнера-владельца (они по-прежнему равны (15,15), но относительно левого верхнего угла контейнера c1).

Такой же эффект можно было получить от оператора

r.Owner:=c1;

Создадим второй контейнер c2 и поменяем владельца у r на c2. Для этого допишем в конец строки:

c2:=ContainerABC.Create(50,160);
c2.Add(RectangleABC.Create(0,0,200,100,clMoneyGreen));
r.Owner:=c2;

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

Как мы видим, круг r поменял владельца, и теперь имеет координаты (15,15), но относительно левого верхнего угла нового владельца c2.

Если вместо строчки r.Owner:=c2; написать r.Owner:=nil; , то круг r потеряет владельца и снова будет позиционироваться относительно левого верхнего угла экрана:


Мультикартинки

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

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

Рассмотрим создание мультикартинки из четырех картинок, каждая из которых находится в отдельном файле:

uses ABCObjects,GraphABC;

var p: MultiPictureABC;

begin
  FillWindow('Textures\cheese.jpg');
  p:=MultiPictureABC.Create(50,50,'multi1.bmp');
  p.Add('multi2.bmp');
  p.Add('multi3.bmp');
  p.Add('multi2.bmp');
end.

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

Для смены картинки достаточно изменить свойство CurrentPicture:

p.CurrentPicture:=2;

Можно также циклически перейти к следующей картинке:

p.NextPicture;

или к предыдущей картинке:

p.PrevPicture;

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

while True do
begin
  p.NextPicture;
  Sleep(100);
end;

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

p.Save('multipic.gif');

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

p:=MultiPictureABC.Create(50,50,100,'multipic.gif');

Третий параметр здесь указывает ширину одной картинки.

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


Создание нового типа графического объекта

Создание нового графического объекта проиллюстрировано на примере RectangleABC:

RectangleABC=class(BoundedObjectABC)
  procedure Draw(x,y: integer);
  var z: integer;
  begin
    SetDrawSettings;
    z:=BorderWidth div 2;
    Rectangle(x+z,y+z,x+Width-z,y+Height-z);
  end;
end;

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

constructor Create(x,y,w,h: integer; cl: ColorType);

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


Ускорение перерисовки графических объектов

Для обеспечения быстрой перерисовки используется следующий прием: в начале программы вызывается LockDrawingObjects, а при необходимости перерисовать весь экран – специальная процедура RedrawObjects. Отключается режим вызовом UnLockDrawingObjects.

Следует обратить внимание, что в модуле GraphABC имеются родственные процедуры LockDrawing, UnLockDrawing, и Redraw. Однако, они отвечают за растровую перерисовку без мерцания, в то время как процедуры LockDrawingObjects, UnLockDrawingObjects, и RedrawObjects отвечают только за ускорение перерисовки векторной графики ABCObjects (отсутствие мерцания векторных объектов при их изменении обеспечивается автоматически).


Совмещение графического вывода модулей ABCObjects и GraphABC

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

FillWindow('Textures\aqua.jpg');
c:=CreateCircleABC(100,100,50,clGreen);
r:=CreateRectangleABC(300,300,100,50,clBlue);

Следует иметь в виду, что прорисовка при изменении свойств объектов ABCObjects происходит корректно, но если рисовать вызовом процедур модуля GraphABC, то графические объекты ABCObjects будут затираться. Для восстановления картинки следует либо передвинуть объекты ABCObjects, либо вызвать процедуру RedrawObjects, перерисовывающую все графическое окно.


Класс BoundedObjectABC

Класс BoundedObjectABC является непосредственным потомком класса ObjectABC и базовым классом для всех замкнутых графических объектов. Его основными потомками являются следующие классы: RectangleABC, SquareABC, EllipseABC, CircleABC, RegularPolygonABC, StarABC, BoardABC.

Класс BoundedObjectABC - абстрактный: объекты этого класса не создаются.

Свойства

property BorderColor: ColorType;

Возвращает или задает цвет границы.

property BorderWidth: integer;

Возвращает или задает ширину границы.

property Filled: boolean;

Возвращает True, если объект имеет внутренность, и False в противном случае.

property Bordered: boolean;

Возвращает True, если объект имеет границу, и False в противном случае.

Методы

procedure SetDrawSettings;

Защищенный метод, устанавливающий параметры пера и кисти перед рисованием.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс RectangleABC

Класс RectangleABC является потомком класса BoundedObjectABC и представляет графический объект "прямоугольник". Большинство свойств и методов унаследовано от классов ObjectABC и BoundedObjectABC.

Конструктор

constructor Create(x,y,w,h: integer; cl: ColorType; tx: string);

Создает прямоугольник ширины w, высоты h и цвета cl в позиции (x,y). После создания прямоугольник рисуется на экране.

Свойства, унаследованные от BoundedObjectABC

property BorderColor: ColorType;

Возвращает или задает цвет границы.

property BorderWidth: integer;

Возвращает или задает ширину границы.

property Filled: boolean;

Возвращает True, если объект имеет внутренность, и False в противном случае.

property Bordered: boolean;

Возвращает True, если объект имеет границу, и False в противном случае.

Методы, унаследованные от BoundedObjectABC

procedure SetDrawSettings;

Защищенный метод, устанавливающий параметры пера и кисти перед рисованием.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс SquareABC

Класс SquareABC является потомком класса RectangleABC и представляет графический объект "Квадрат". Все свойства, методы, конструкторы и деструкторы унаследованы от классов ObjectABC и BoundedObjectABC.

Конструктор

constructor Create(x,y,w: integer; cl: ColorType);

Создает квадрат ширины w и цвета cl в позиции (x,y). После создания квадрат рисуется на экране.

Свойства, унаследованные от BoundedObjectABC

property BorderColor: ColorType;

Возвращает или задает цвет границы.

property BorderWidth: integer;

Возвращает или задает ширину границы.

property Filled: boolean;

Возвращает True, если объект имеет внутренность, и False в противном случае.

property Bordered: boolean;

Возвращает True, если объект имеет границу, и False в противном случае.

Методы, унаследованные от BoundedObjectABC

procedure SetDrawSettings;

Защищенный метод, устанавливающий параметры пера и кисти перед рисованием.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс RoundRectABC

Класс RoundRectABC является потомком класса BoundedObjectABC и представляет графический объект "Прямоугольник со скругленными краями". Большинство свойств и методов унаследовано от классов ObjectABC и BoundedObjectABC.

Конструктор

constructor Create(x,y,w,h,r: integer; cl: ColorType);

Создает прямоугольник со скругленными краями ширины w, высоты h, цвета cl и с радиусом скругления r в позиции (x,y). После создания прямоугольник со скругленными краями рисуется на экране.

Свойства

property Radius: integer;

Возвращает или задает радиус скругления.

Свойства, унаследованные от BoundedObjectABC

property BorderColor: ColorType;

Возвращает или задает цвет границы.

property BorderWidth: integer;

Возвращает или задает ширину границы.

property Filled: boolean;

Возвращает True, если объект имеет внутренность, и False в противном случае.

property Bordered: boolean;

Возвращает True, если объект имеет границу, и False в противном случае.

Методы, унаследованные от BoundedObjectABC

procedure SetDrawSettings;

Защищенный метод, устанавливающий параметры пера и кисти перед рисованием.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс RoundSquareABC

Класс RoundSquareABC является потомком класса RoundRectABC и представляет графический объект "Квадрат со скругленными краями". Большинство свойств и методов унаследовано от классов ObjectABC и BoundedObjectABC.

Конструктор

constructor Create(x,y,w,r: integer; cl: ColorType);

Создает квадрат со скругленными краями ширины w, цвета cl и с радиусом скругления r в позиции (x,y). После создания квадрат со скругленными краями рисуется на экране.

Свойства, унаследованные от RoundRectABC

property Radius: integer;

Возвращает или задает радиус скругления.

Свойства, унаследованные от BoundedObjectABC

property BorderColor: ColorType;

Возвращает или задает цвет границы.

property BorderWidth: integer;

Возвращает или задает ширину границы.

property Filled: boolean;

Возвращает True, если объект имеет внутренность, и False в противном случае.

property Bordered: boolean;

Возвращает True, если объект имеет границу, и False в противном случае.

Методы, унаследованные от BoundedObjectABC

procedure SetDrawSettings;

Защищенный метод, устанавливающий параметры пера и кисти перед рисованием.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс EllipseABC

Класс EllipseABC является потомком класса BoundedObjectABC и представляет графический объект "Эллипс". Большинство свойств и методов унаследовано от классов ObjectABC и BoundedObjectABC.

Конструктор

constructor Create(x,y,w,h: integer; cl: ColorType);

Создает эллипс ширины w, высоты h и цвета cl в позиции (x,y). После создания эллипс рисуется на экране.

Свойства, унаследованные от BoundedObjectABC

property BorderColor: ColorType;

Возвращает или задает цвет границы.

property BorderWidth: integer;

Возвращает или задает ширину границы.

property Filled: boolean;

Возвращает True, если объект имеет внутренность, и False в противном случае.

property Bordered: boolean;

Возвращает True, если объект имеет границу, и False в противном случае.

Методы, унаследованные от BoundedObjectABC

procedure SetDrawSettings;

Защищенный метод, устанавливающий параметры пера и кисти перед рисованием.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс CircleABC

Класс CircleABC является потомком класса EllipseABC и представляет графический объект "Круг". Большинство свойств и методов унаследовано от классов ObjectABC и BoundedObjectABC.

Конструктор

constructor Create(x,y,w: integer; cl: ColorType);

Создает круг ширины w и цвета cl в позиции (x,y). После создания круг рисуется на экране.

Свойства, унаследованные от BoundedObjectABC

property BorderColor: ColorType;

Возвращает или задает цвет границы.

property BorderWidth: integer;

Возвращает или задает ширину границы.

property Filled: boolean;

Возвращает True, если объект имеет внутренность, и False в противном случае.

property Bordered: boolean;

Возвращает True, если объект имеет границу, и False в противном случае.

Методы, унаследованные от BoundedObjectABC

procedure SetDrawSettings;

Защищенный метод, устанавливающий параметры пера и кисти перед рисованием.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс RegularPolygonABC

Класс RegularPolygonABC является потомком класса BoundedObjectABC и представляет графический объект "Правильный многоугольник".

Конструктор

constructor Create(x,y,r,n: integer; cl: ColorType);

Создает правильный многоугольник радиуса r с n вершинами и координатами центра (x,y). После создания правильный многоугольник рисуется на экране.

Свойства

property Count: integer;

Возвращает или задает количество вершин правильного многоугольника.

property Radius: integer;

Возвращает или задает радиус правильного многоугольника.

property Angle: real;

Возвращает или задает угол поворота правильного многоугольника относительно центра.

Свойства, унаследованные от BoundedObjectABC

property BorderColor: ColorType;

Возвращает или задает цвет границы.

property BorderWidth: integer;

Возвращает или задает ширину границы.

property Filled: boolean;

Возвращает True, если объект имеет внутренность, и False в противном случае.

property Bordered: boolean;

Возвращает True, если объект имеет границу, и False в противном случае.

Методы, унаследованные от BoundedObjectABC

procedure SetDrawSettings;

Защищенный метод, устанавливающий параметры пера и кисти перед рисованием.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс StarABC

Класс StarABC является потомком класса RegularPolygonABC и представляет графический объект "Правильная звезда".

Конструктор

constructor Create(x,y,r,r1,n: integer; cl: ColorType);

Создает правильную звезду радиуса r, внутреннего радиуса r1, с n вершинами и координатами центра (x,y). После создания правильная звезда рисуется на экране.

Свойства

property InternalRadius: integer;

Возвращает или задает внутренний радиус звезды.

Свойства, унаследованн ые от RegularPolygonA BC

property Count: integer;

Возвращает или задает количество лучей звезды.

property Radius: integer;

Возвращает или задает радиус звезды.

property Angle: real;

Возвращает или задает угол поворота звезды.

Свойства, унаследованные от BoundedObjectABC

property BorderColor: ColorType;

Возвращает или задает цвет границы.

property BorderWidth: integer;

Возвращает или задает ширину границы.

property Filled: boolean;

Возвращает True, если объект имеет внутренность, и False в противном случае.

property Bordered: boolean;

Возвращает True, если объект имеет границу, и False в противном случае.

Методы, унаследованные от BoundedObjectABC

procedure SetDrawSettings;

Защищенный метод, устанавливающий параметры пера и кисти перед рисованием.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс BoardABC

Класс BoardABC является потомком класса BoundedObjectABC и представляет графический объект "Доска". Большинство свойств и методов унаследовано от классов ObjectABC и BoundedObjectABC.

Конструктор

constructor Create(x,y,n,m,sz: integer; cl: ColorType);

Создает доску n на m клеток цвета cl с шириной клетки sz в позиции (x,y). После создания доска рисуется на экране.

Свойства

property DimX: integer;

Возвращает или задает количество клеток по оси X.

property DimY: integer;

Возвращает или задает количество клеток по оси Y.

property CellSize: integer;

Возвращает или задает размер клетки.

Свойства, унаследованные от BoundedObjectABC

property BorderColor: ColorType;

Возвращает или задает цвет границы.

property BorderWidth: integer;

Возвращает или задает ширину границы.

property Filled: boolean;

Возвращает True, если объект имеет внутренность, и False в противном случае.

property Bordered: boolean;

Возвращает True, если объект имеет границу, и False в противном случае.

Методы, унаследованные от BoundedObjectABC

procedure SetDrawSettings;

Защищенный метод, устанавливающий параметры пера и кисти перед рисованием.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс TextABC

Класс TextABC является потомком класса ObjectABC и представляет графический объект "Текст".

Конструктор

constructor Create(x,y,pt: integer; cl: ColorType; tx: string);

Создает текст tx размера pt пунктов цвета cl в позиции (x,y). После создания текст рисуется на экране.

Свойства

property FontName: string;

Возвращает или задает имя используемого шрифта.

property FontSize: integer;

Возвращает или задает размер используемого шрифта в пунктах.

property TransparentBackground: boolean;

Возвращает True, если шрифт имеет прозрачный фон, и False в противном случае.

property BackgroundColor: integer;

Возвращает или задает цвет фона текста.

Свойства, унаследованные от BoundedObjectABC

property BorderColor: ColorType;

Возвращает или задает цвет границы.

property BorderWidth: integer;

Возвращает или задает ширину границы.

property Filled: boolean;

Возвращает True, если объект имеет внутренность, и False в противном случае.

property Bordered: boolean;

Возвращает True, если объект имеет границу, и False в противном случае.

Методы, унаследованные от BoundedObjectABC

procedure SetDrawSettings;

Защищенный метод, устанавливающий параметры пера и кисти перед рисованием.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс PictureABC

Класс PictureABC является потомком класса ObjectABC и представляет графический объект "Изображение".

Конструкторы

constructor Create(x,y: integer; filename: string);

Создает изображение в позиции (x,y), загружая его из файла с именем filename. После создания изображение рисуется на экране. Допустимые форматы файлов: .bmp, .gif, .jpg, .png.

constructor CreateFromPic(x,y: integer; p: Picture);

Создает изображение в позиции (x,y) из объекта p. В этом случае считается, что объект PictureABC не владеет изображением, т.е. в своем деструкторе не разрушает его. Подобный способ создания может быть использован, когда требуется создать несколько объектов PictureABC на основе одного и того же изображения.

Свойства

property Transparent: boolean;

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

property ScaleX: real;

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

property ScaleY: real;

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

Методы

procedure ChangePicture(filename: string);

Меняет изображение, загружая его из файла filename.

procedure Save(filename: string);

Сохраняет изображение в файл filename.

procedure FlipVertical;

Зеркально отображает изображение относительно вертикальной оси.

procedure FlipHorizontal;

Зеркально отображает изображение относительно горизонтальной оси.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс MultiPictureABC

Класс MultiPictureABC является потомком класса PictureABC и представляет графический объект "Набор изображений", содержащий несколько изображений, одно из которых рисуется на экране.

Конструкторы

constructor Create(x,y: integer; filename: string);

Создает набор изображений, состоящий из одного изображения, загружая его из файла с именем filename. После создания изображение рисуется на экране в позиции (x,y). Допустимые форматы файлов: .bmp, .gif, .jpg, .png. Остальные изображения добавляются затем методом Add.

constructor Create(x,y,w: integer; filename: string);

Создает набор изображений, загружая его из файла с именем filename. Файл должен хранить последовательность изображений одного размера, расположенных по горизонтали. Каждое изображение считается имеющим ширину w. Если ширина изображения в файле filename не кратна w, то возникает исключение. После создания первое изображение из набора рисуется на экране в позиции (x,y).

constructor CreateFromPic(x,y,w: integer; p: Picture);

Создает набор изображений из объекта p типа Picture. Объект p должен хранить последовательность изображений одного размера, расположенных по горизонтали. Каждое изображение считается имеющим ширину w. Если ширина изображения в объекте p не кратна w, то возникает исключение. После создания первое изображение из набора рисуется на экране в позиции (x,y). При таком способе создания считается, что объект MultiPictureABC не владеет изображением, т.е. в своем деструкторе не разрушает его. Подобный способ создания может быть использован, когда требуется создать несколько объектов MultiPictureABC на основе одного и того же изображения.

Свойства

property CurrentPicture: integer;

Возвращает или задает текущее изображение в наборе.

property Count: integer;

Возвращает количество изображений в наборе.

Методы

procedure Add(filename: string);

Добавляет изображение к набору, загружая его из файла filename. Изображение должно иметь те же размеры, что и все изображения из набора.

procedure ChangePicture(w: integer; filename: string);

Меняет набор изображений, загружая его из файла filename. Файл должен хранить последовательность изображений одного размера, расположенных по горизонтали. Каждое изображение считается имеющим ширину w.

procedure NextPicture;

Циклически переходит к следующему изображению из набора.

procedure PrevPicture;

Циклически переходит к предыдующему изображению из набора.

Свойства, унаследованные от PictureABC

property Transparent: boolean;

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

property ScaleX: real;

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

property ScaleY: real;

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

Методы, унаследованные от PictureABC

procedure ChangePicture(filename: string);

Меняет изображение, загружая его из файла filename.

procedure Save(filename: string);

Сохраняет изображение в файл filename.

procedure FlipVertical;

Зеркально отображает изображение относительно вертикальной оси.

procedure FlipHorizontal;

Зеркально отображает изображение относительно горизонтальной оси.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Класс ContainerABC

Класс ContainerABC является потомком класса ObjectABC и представляет графический объект "Контейнер графических объектов".

Конструктор

constructor Create(x,y: integer);

Создает контейнер графических объектов в позиции (x,y). Вначале он пуст; для его наполнения следует использовать метод Add. Координаты всех помещаемых в него графических объектов пересчитываются относительно точки (x,y).

Свойства

property Count: integer;

Возвращает количество графических объектов в контейнере.

property Objects[i: integer]: ObjectABC;

Возвращает или задает i-тый графический объект в контейнере.

Методы

procedure Add(g: ObjectABC);

Добавляет в контейнер графический объект g.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Модуль ABCSprites: обзор

Модуль ABCSprites реализует спрайты - анимационные объекты с автоматически меняющимися кадрами. Спрайт представляется классом SpriteABC и является разновидностью мультикартинки MultiPictureABC, однако, обладает двумя дополнительными возможностями:

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

2. Спрайты могут иметь состояния, задаваемые строками. Каждое состояние имеет свой независимый набор кадров, меняющихся циклически. Например, игровой объект в состоянии "Идти" имеет три кадра, а в состоянии "Сидеть" - один кадр (в этом состоянии анимация отсутствует). Переключая состояния, можно моделировать различное поведение игрового объекта.

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

procedure StartSprites;

Запускает анимацию всех спрайтов.

procedure StopSprites;

Останавливает анимацию всех спрайтов.

Как создать спрайт

Пусть изображения, из которых конструируется спрайт, находятся в следующих файлах:

multi1.bmp | multi2.bmp | multi3.bmp | multi4.bmp | multi5.bmp

Наполним спрайт этими изображениями в следующей последовательности:

uses GraphABC,ABCSprites,Events;

var s: SpriteABC;

begin
  s:=SpriteABC.Create(50,50,'multi1.bmp');
  s.Add('multi2.bmp');
  s.Add('multi3.bmp');
  s.Add('multi2.bmp');
  s.Add('multi4.bmp');
  s.Add('multi5.bmp');
end.

Первые четыре кадра образуют состояние спрайта 'fly' (летать), пятый кадр образует состояние 'stand' (стоять) и, наконец, шестой кадр образует состояние 'sit'. Сформируем состояния, вызывая метод AddState, первый параметр которого указывает имя состояния, второй - количество кадров в нем:

  s.AddState('fly',4);
  s.AddState('stand',1);
  s.AddState('sit',1);

Теперь можно переключать состояния, меняя имя состояния через свойство StateName:

  s.StateName:='sit';

Кроме этого, можно переключать состояния, меняя номер состояния через свойство State:

  s.State:=2;

Можно установить скорость анимации спрайта:

  s.Speed:=10;

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

  s.SaveWithInfo('mysprite.png');

После этого спрайт можно будет создавать, используя конструктор CreateFromInfo:

  s:=SpriteABC.CreateFromInfo(50,50,'mysprite.png');

Следует иметь в виду, что спрайты – крайне ресурсоемкие. Желательно делать картинки спрайтов маленькими. Если спрайтов около 20 и они выставлены на максимальную скорость, то даже на достаточно мощных компьютерах приложение начинает подтормаживать, и надо использовать методы ускорения перерисовки объектов LockDrawingObjects и RedrawObjects. При количестве спрайтов 100 и это не помогает – надо уменьшать их скорость или количество.


Класс SpriteABC

Класс SpriteABC является потомком класса MultiPictureABC и представляет графический объект "Спрайт" - анимационный объект с автоматически меняющимися кадрами.

Конструкторы

constructor Create(x,y: integer; filename: string);

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

constructor Create(x,y,w: integer; filename: string);

Создает спрайт, загружая его из файла с именем filename. Файл должен хранить мультикартинку - последовательность изображений одного размера, расположенных по горизонтали. Каждое изображение считается имеющим ширину w. Если ширина изображения в файле filename не кратна w, то возникает исключение. После создания первый кадр спрайта рисуется на экране в позиции (x,y).

constructor CreateFromPic(x,y,w: integer; p: Picture);

Создает спрайт из объекта p типа Picture. Объект p должен хранить мультикартинку - последовательность изображений одного размера, расположенных по горизонтали. Каждое изображение считается имеющим ширину w. Если ширина изображения в объекте p не кратна w, то возникает исключение. После создания первый кадр спрайта рисуется на экране в позиции (x,y). При таком способе создания считается, что объект SpriteABC не владеет изображением, т.е. в своем деструкторе не разрушает его. Подобный способ создания может быть использован, когда требуется создать несколько спрайтов на основе одного и того же изображения.

constructor CreateFromInfo(x,y: integer; filename: string);

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

Свойства

property StateName: string;

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

property State: integer;

Возвращает или задает номер состояния (состояния нумеруются с 1).

property StateCount: integer;

Возвращает количество состояний спрайта.

property Speed: integer;

Возвращает или задает скорость анимации спрайта. Скорость меняется от 1 до 10, по умолчанию скорость равна 5.

property Active: boolean;

Возвращает или задает активность спрайта: True, если спрайт активен (т.е. происходит его анимация), и False в противном случае.

property Frame: integer;

Возвращает или задает текущий кадр в текущем состоянии.

property FrameCount: integer;

Возвращает количество кадров в текущем состоянии.

property FrameBeg: integer;

Возвращает начальный кадр в текущем состоянии.

Методы

procedure AddState(name: string; count: integer);

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

procedure CheckStates;

Контролирует количество кадров в состояниях, сравнивая его сумму с общим количеством кадров. В случае несоответствия генерирует исключение.

procedure Add(filename: string);

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

procedure SaveWithInfo(fname: string);

Сохраняет мультикартинку спрайта в файле filename, а также информационный файл спрайта, имеющий то же имя и расширение .spinfo.

procedure NextFrame;

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

procedure PrevFrame;

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

Свойства, унаследованные от MultiPictureABC

property CurrentPicture: integer;

Возвращает или задает текущее изображение.

property Count: integer;

Возвращает количество кадров спрайта.

Методы, унаследованные от MultiPictureABC

procedure Add(filename: string);

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

procedure ChangePicture(w: integer; filename: string);

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

procedure NextPicture;

Циклически переходит к следующему изображению.

procedure PrevPicture;

Циклически переходит к предыдующему изображению.

Свойства, унаследованные от PictureABC

property Transparent: boolean;

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

property ScaleX: real;

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

property ScaleY: real;

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

Методы, унаследованные от PictureABC

procedure ChangePicture(filename: string);

Меняет изображение, загружая его из файла filename.

procedure Save(filename: string);

Сохраняет изображение в файл filename.

procedure FlipVertical;

Зеркально отображает изображение относительно вертикальной оси.

procedure FlipHorizontal;

Зеркально отображает изображение относительно горизонтальной оси.

Свойства, унаследованные от ObjectABC

property Left: integer;

Возвращает или задает координату по оси X левого края графического объекта.

property Top: integer;

Возвращает или задает координату по оси Y верхнего края графического объекта.

property Width: integer;

Возвращает или задает ширину графического объекта.

property Height: integer;

Возвращает или задает высоту графического объекта.

property Position: Point;

Возвращает или задает позицию левого верхнего угла графического объекта.

property Visible: boolean;

Возвращает или задает видимость графического объекта. По умолчанию установлено в True.

property Color: ColorType;

Возвращает или задает цвет графического объекта.

property Text: string;

Возвращает или задает текст в центре графического объекта. Для текста всегда используется шрифт Arial.

property TextVisible: boolean;

Возвращает или задает видимость текста графического объекта.

property TextScale: real;

Возвращает или задает масштаб текста относительно размеров графического объекта, 0<=TextScale<=1. При TextScale=1 текст занимает всю ширину или высоту объекта. По умолчанию TextScale=0.8.

property Number: integer;

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

property RealNumber: real;

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

property Owner: ContainerABC;

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

property MouseIndifferent: boolean;

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

property dx: integer;

Возвращает или задает X-координату вектора перемещения объекта при вызове метода Move.По умолчанию установлено в 0. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

property dy: integer;

Возвращает или задает Y-координату вектора перемещения объекта при вызове метода Move. Для неподвижных объектов может быть использовано для хранения любой дополнительной информации, связанной с объектом.

Методы, унаследованные от ObjectABC

procedure Draw(x,y: integer);

Рисует графический объект в позиции x, y. Метод не вызывается напрямую. Перерисовка объекта происходит автоматически при изменении его свойств.

procedure MoveTo(x,y: integer);

Перемещает левый верхний угол графического объекта в позицию x, y.

procedure MoveTo(p: Point);

Перемещает левый верхний угол графического объекта в позицию p.x, p.y.

procedure MoveOn(a,b: integer);

Перемещает графический объект на вектор a, b.

procedure Move;

Перемещает графический объект на вектор, задаваемый свойствами dx, dy.

procedure Scale(f: real);

Масштабирует графический объект в f раз (f>1 - увеличение, 0<f<1 - уменьшение).

procedure ToFront;

Переносит графический объект на передний план.

procedure ToBack;

Переносит графический объект на задний план.

function Bounds: Rect;

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

function Intersect(g: ObjectABC): boolean;

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

function IntersectRect(r: Rect): boolean;

Возвращает True, если прямоугольник графического объекта пересекается прямоугольником r, и False в противном случае.

function PtInside(x,y:integer): boolean;

Возвращает True, если точка (x,y) находится внутри графического объекта, и False в противном случае.


Модуль Events

Модуль Events предназначен для создания программ, управляемых событиями. Он работает только в паре с модулем GraphABC. При одновременном подключении модулей GraphABC и Events программа после запуска и выполнения своего основного блока begin/end не завершается, а продолжает выполняться, отслеживая возникающие события. Все события связаны с графическим окном: это события, приходящие от мыши, клавиатуры, события изменения размеров графического окна и событие его закрытия. После закрытия графического окна программа завершается.

Каждому событию соответствует своя процедурная переменная:

Событие | Переменная
нажатие мыши | OnMouseDown
отпускание мыши | OnMouseUp
перемещение мыши | OnMouseMove
нажатие клавиши | OnKeyDown
отпускание клавиши | OnKeyUp
нажатие символьной клавиши | OnKeyPress
изменение размеров графического окна | OnResize
закрытие графического окна | OnClose

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

Переменные, соответствующие событиям, описаны в модуле Events следующим образом:

var
OnMouseDown, OnMouseUp, OnMouseMove: procedure (x,y,mousebutton:
    integer);
OnKeyDown, OnKeyUp: procedure (key: integer);
OnKeyPress: procedure (ch: char);
OnResize, OnClose: procedure;

Параметры x и y в обработчиках OnMouseDown, OnMouseUp и OnMouseMove определяют координаты курсора мыши в момент наступления события, параметр mousebutton равен 0, если кнопка мыши не нажата, 1, если нажата левая кнопка мыши, и 2, если нажата правая кнопка мыши. Параметр key в обработчиках OnKeyDownи OnKeyUp определяет виртуальный код нажатой клавиши. Параметр ch в обработчике OnKeyPress определяет нажатый символ. Если переменная-событие OnKeyPress имеет обработчик, то графическое окно не закрывается по нажатию клавиши Esc.

Например, если определена следующая процедура-обработчик:

procedure MouseDown(x,y,mb: integer);
begin
  write(1);
end;

и в основной программе она привязана к соответствующей переменной-событию:

OnMouseDown:=MouseDown;

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

См. также тему: Примеры событийных программ.


Примеры событийных программ

Пример 1. Программа, осуществляющая рисование мышью в графическом окне.
uses GraphABC,Events;

procedure MouseDown(x,y,mb: integer);
begin
  MoveTo(x,y);
end;

procedure MouseMove(x,y,mb: integer);
begin
  if mb=1 then LineTo(x,y);
end;

begin
  OnMouseDown:=MouseDown;
  OnMouseMove:=MouseMove;
end.

Пример 2. Программа, осуществляющая движение графического окна с помощью клавиатуры.
uses GraphABC,Events;

procedure KeyDown(Key: integer);
begin
  case Key of
VK_Left: SetWindowLeft(WindowLeft-2);
VK_Right: SetWindowLeft(WindowLeft+2);
VK_Up: SetWindowTop(WindowTop-2);
VK_Down: SetWindowTop(WindowTop+2);
  end;
end;

begin
  OnKeyDown:=KeyDown;
end.


Виртуальные коды клавиш

В модуле Events определены следующие именованные целые константы, представляющие виртуальные коды клавиш:

VK_Left
VK_Right
VK_Up
VK_Down
VK_Back
VK_Tab
VK_Return
VK_Escape
VK_Space
VK_PageUp
VK_PageDown
VK_Home
VK_End
VK_Insert
VK_Delete
VK_Control
VK_Shift
VK_Alt 		VK_F1
VK_F2
VK_F3
VK_F4
VK_F5
VK_F6
VK_F7
VK_F8
VK_F9
VK_F10
VK_F11
VK_F12
VK_Pause
VK_CapsLock
VK_NumLock
VK_ScrollLock

Символьные клавиши '0'..'9' и 'A'..'Z' имеют виртуальный код, равный коду соответствующего символа


Модуль VCL

Модуль VCL (Visual Components Library - библиотека визуальных компонентов) содержит компоненты в стиле Delphi, позволяющие разрабатывать приложения с главной формой, на которую могут быть помещены стандартные элементы управления Windows. Приложения этого типа в Pascal ABC называются приложениями Pascal ABC Forms. Они являются событийно управляемыми и завершаются лишь после закрытия главной формы.

Компоненты представляют собой классы, производные от класса Component. Каждый компонент имеет свойства, методы и события.

Изменение свойств влияет на внешний вид и поведение компонентов. Например, при изменении свойства Caption для формы меняется заголовок формы, при изменении свойств Width и Height для кнопки меняются размеры кнопки, при изменении свойства Interval для таймера меняется интервал срабатывания таймера и т.д.

Вызов методов компонентов производит какие-то действия с самими компонентами и часто меняет их свойства. Например, вызов метода SetSize для элемента управления устанавливает его размеры, вызов метода для формы Close закрывает эту форму, вызов метода Execute для окна диалога открывает это окно диалога и т.д.

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

Большинство событий имеются в двух вариантах: обычные и расширенные. Имена расширенных событий отличаются от имен соответствующих обычных событий окончанием Ext, например, OnClick и OnClickExt, OnKeyPress и OnKeyPressExt и т.д. Расширенные события содержат по сравнению с обычными дополнительные параметры. Если определены обработчики для обычного и расширенного события, то вначале вызывается обработчик расширенного события, а затем - обработчик обычного.

Название VCL (библиотека визуальных компонентов) взято из системы Delphi, однако оно не совсем верно: не все компоненты являются визуальными.

Пример простейшей программы Pascal ABC Forms.

Диаграмма классов VCL.

Классификация компонентов.


Пример программы

Рассмотрим пример простейшей программы Pascal ABC Forms.

uses VCL;

var
  MainForm: Form;
  B: Button;

procedure BClick;
begin
  MainForm.Close;
end;

begin
  MainForm:=Form.Create(100,100,300,200);
  MainForm.Caption:='Первое VCL-приложение';
  B:=Button.Create(100,60,100,25);
  B.Caption:='Нажми меня';
  B.OnClick:=BClick;
end.

После подключения модуля VCL описаны переменные главной формы приложения и кнопки. В начале программы вызывается конструктор главной формы и устанавливаются ее свойства (в данном случае свойство Caption - заголовок). Далее вызывается конструктор кнопки (кнопка при этом автоматически помещается на главную форму), устанавливаются ее свойства (в данном случае свойство Caption) и с событием кнопки OnClick связывается обработчик BClick, представляющий собой процедуру без параметров. После завершения выполнения основного блока begin/end автоматически показывается главная форма и программа становится событийно управляемой. При закрытии главной формы автоматически вызываются деструкторы всех компонентов.


Диаграмма классов VCL

На рисунке приведена диаграмма классов модуля VCL.


Классификация компонентов

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

Класс Component является предком всех компонентов VCL (см. наследование).

Класс Control является прямым наследником класса Component. Объекты этого класса являются компонентами, имеющими визуальное представление, и представляют собой оболочки над элементами управления Windows. Большинство потомков класса Control являются оболочками над оконными элементами управления Windows, которые могут получать фокус ввода. В классе Control определено множество свойств, влияющих на отображение элементов: положение, размеры, выравнивание, шрифт, видимость и т.п., а также множество событий, в числе которых - события мыши и клавиатуры.

Все элементы управления (за исключением форм) отображаются на так называемом родительском элементе управления и являются по отношению к нему дочерними элементами управления. Родительские элементы управления принадлежат к классу ContainerControl, выступают в качестве контейнера для других элементов и ответственны за их прорисовку. Родительский элемент управления инициализируется в конструкторе класса Control и доступен через свойство Parent. Это свойство может быть изменено в процессе работы приложения, при этом визуальный компонент будет отображен на новом родителе.

Если родитель не передается как параметр конструктора элемента, то родителем элемента становится главная форма приложения, т.е. элемент отображается на главной форме. Исключение составляют формы: у любого объекта класса Form родитель отсутствует.

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


Класс Component

Object <-- Component

Класс Component является предком всех компонентов VCL. Непосредственными потомками класса Component являются классы Control, Timer, MainMenu, PopupMenu, MenuItem, OpenDialog, SaveDialog, ColorDialog.

Конструкторы

constructor Create;

Свойства

property Tag: integer;

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


Класс Control

Component <-- Control

Класс Control является базовым классом для всех визуальных компонентов. Большинство потомков класса Control являются оболочками над оконными элементами управления Windows, которые могут получать фокус ввода. Наиболее важными непосредственными потомками класса Control являются классы ContainerControl, Button, Label, Edit, RadioButton, CheckBox, ListBox, ComboBox, PaintBox.

Свойства

property Left: integer;

Задает горизонтальную координату левого края элемента относительно родительского элемента.

property Top: integer;

Задает вертикальную координату верхнего края элемента относительно родительского элемента.

property Width: integer;

Задает ширину элемента.

property Height: integer;

Задает высоту элемента.

property ClientWidth: integer;

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

property ClientHeight: integer;

Задает высоту клиентской области элемента.

property Parent: ContainerControl;

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

property Color: ColorType;

Задает цвет фона элемента.

property Hint: string;

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

property Enabled: boolean;

Определяет, реагирует ли элемент на события мыши и клавиатуры. Элементы с Enabled=False отображаются бледным цветом.

property Visible: boolean;

Определяет, является ли элемент видимым.

property Caption: string;

Задает текст заголовка или надписи на элементе.

property Cursor: CursorType;

Определяет вид курсора над элементом.

property Align: AlignType;

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

property PopMenu: PopupMenu;

Задает контекстное меню элемента.

property Font: FontType;

Задает шрифт элемента.

property TabOrder: integer;

Задает порядок передвижения по элементам с помощью клавиши Tab.

property TabStop: boolean;

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

property BevelInner: BevelType;

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

property BevelOuter: BevelType;

Задает тип внешнего скоса элемента.

Конструкторы

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Параметры L, T, W, H задают координаты левого верхнего угла элемента относительно родительского элемента, а также размеры элемента, параметр c определяет свойство Caption элемента, параметр Parent задает родителя элемента.

Методы

procedure SetSize(Width,Height: integer);

Устанавливает ширину и высоту элемента.

procedure SetPos(Left,Top: integer);

Устанавливает координаты левого верхнего угла элемента.

procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

Устанавливает соответствующие свойства элемента.

События

OnClick: procedure;

Возникает при нажатии на элемент.

OnDblClick: procedure;

Возникает при двойном щелчке мыши на элемент.

OnMouseDown: procedure(x,y,button: integer);

Возникает при нажатии кнопки мыши на элементе. Параметры x, y задают координаты курсора мыши относительно левого верхнего угла элемента. Параметр button принимает одно из трех значений: 1 - нажата левая кнопка мыши, 2 - нажата правая кнопка мыши, 3 - нажаты обе кнопки мыши. Можно также использовать символические константы: btLeft=1, btRight=2, btLeft+btRight=3.

OnMouseUp: procedure(x,y,button: integer);

Возникает при отпускании кнопки мыши на элементе.

OnMouseMove: procedure(x,y,button: integer);

Возникает при перемещении мыши над элементом.

OnKeyDown: procedure(key: integer);

Возникает при нажатии клавиши, если элемент имеет фокус ввода.

OnKeyUp: procedure(key: integer);

Возникает при отпускании клавиши, если элемент имеет фокус ввода.

OnKeyPress: procedure(key: char);

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

OnEnter: procedure;

Возникает при получении элементом фокуса ввода.

OnExit: procedure;

Возникает при потере элементом фокуса ввода.

OnResize: procedure;

Возникает при изменении размеров элемента.

Расширенные события

OnClickExt: procedure(Sender: Component);

Возникает при нажатии на элемент. Параметр Sender задает тот элемент, который вызвал событие (источник события), т.е. тот элемент, на который было осуществлено нажатие.

OnDblClickExt: procedure(Sender: Component);

Возникает при двойном щелчке мыши на элемент. Параметр Sender задает элемент, который вызвал событие.

OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);

Возникает при нажатии кнопки мыши на элементе. В параметр Sender передается элемент, на котором была нажата мышь.

OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);

Возникает при отпускании кнопки мыши на элементе.

OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);

Возникает при перемещении мыши над элементом.

OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);

Возникает при нажатии клавиши, если элемент имеет фокус ввода.

OnKeyUpExt: procedure(Sender: Component;  key: integer; Shift: ShiftState);

Возникает при отпускании клавиши, если элемент имеет фокус ввода.

OnKeyPressExt: procedure(Sender: Component; key: char);

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

OnEnterExt: procedure(Sender: Component);

Возникает при получении элементом фокуса ввода.

OnExitExt: procedure(Sender: Component);

Возникает при потере элементом фокуса ввода.

OnResizeExt: procedure(Sender: Component);

Возникает при изменении размеров элемента.


Класс ContainerControl

Control <-- ContainerControl

Класс ContainerControl наследуется от класса Control и является базовым классом для всех визуальных компонентов, которые могут содержать на себе другие визуальные компоненты и выступают для них в качестве родителя. К числу контейнерных компонентов относятся классы Form, Panel, GroupBox, TabSheet, PageControl и ToolBar. Объекты именно этих классов передаются в качестве родителя при создании любого визуального компонента, производного от класса Control. У форм родители отсутствуют.

Родитель компонента обязательно должен создаваться перед созданием самого компонента.

Свойства

property Controls[index: integer]: Control;

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

property ControlsCount: integer;

Определяет количество дочерних элементов в массиве Controls. Свойство доступно только на чтение.


Класс Form

Control <-- ContainerControl <-- Form

Класс Form представляет стандартное окно приложения.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Свойство Caption для формы определяет ее заголовок.

Следующие свойства унаследованы от класса ContainerControl:

property Controls[index: integer]: Control;
property ControlsCount: integer;

Следующие свойства определены в классе Form:

property BorderStyle: FormBorderStyleType;

Задает стиль границы формы. Тип FormBorderStyleType определен следующим образом: FormBorderStyleType=(bsNone,bsSingle,bsSizeable,bsDialog).

property BorderIcons: BorderIconsType;

Задает, какие иконки доступны в заголовке формы. Тип BorderIconsType определен следующим образом: BorderIconsType=set of (biSystemMenu, biMinimize, biMaximize, biHelp) .

property Menu: MainMenu;

Задает главное меню формы.

property ActiveControl: Control;

Задает активный элемент управления на форме.

property WindowState: WindowStateType;

Задает режим отображения формы на экране: обычный, максимизированный (распахнутый на весь экран) или минимизированный (свернутый). Тип WindowStateType определен следующим образом: WindowStateType=(wsNormal, wsMinimized, wsMaximized).

property ModalResult: ModalResultType;

Задает результат, возвращаемый формой после ее отображения методом ShowModal. Свойство ModalResult определено также в классе Button. При нажатии кнопки на модальной форме ее ModalResult присваивается свойству ModalResult формы и если это значение не равно mrNone, то форма закрывается.

property Position: PositionType;

Задает положение формы на экране. Тип PositionType определен следующим образом: PositionType=(poScreenCenter, poDefault). Константы этого типа имеют следующий смысл:

  • poScreenCenter принято по умолчанию и позиционирует форму по центру экрана;
  • poDefault означает, что размеры и положение формы на экране определяются операционной системой.
Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Следующие методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

Следующие методы определены в классе Form:

procedure Show;

Показывает форму.

procedure ShowModal;

Показывает форму в модальном режиме.

procedure Close;

Закрывает форму. При закрытии главной формы приложение завершается.

procedure Hide;

Прячет форму.

procedure SetIcon(s: string);

Меняет иконку формы. Строка s содержит либо имя .ico-файла, либо имя внутреннего ресурса Pascal ABC.

События

Следующие события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Следующие события определены в классе Form:

OnShow: procedure;

Возникает при показе окна формы.

OnHide: procedure;

Возникает, когда форма прячется.

OnClose: procedure;

Возникает при закрытии формы.

OnActivate: procedure;

Возникает при активизации формы.

OnDeactivate: procedure;

Возникает при деактивизации формы.

OnCloseQuery: procedure(var CanClose: boolean);

Возникает при закрытии формы. Если CanClose внутри процедуры получает значение False, то форма не может быть закрыта. Используется, например, для запроса о сохранении несохраненного документа; если пользователь выбирает пункт "Отмена", то форму закрывать не следует.

Расширенные события

Следующие расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);

Следующие расширенные события определены в классе Form:

OnShowExt: procedure(Sender: Component);

Возникает при показе окна формы. Параметр Sender содержит форму, которая инициировала событие.

OnHideExt: procedure(Sender: Component);

Возникает, когда форма прячется.

OnCloseExt: procedure(Sender: Component);

Возникает при закрытии формы.

OnActivateExt: procedure(Sender: Component);

Возникает при активизации формы.

OnDeactivateExt: procedure(Sender: Component);

Возникает при деактивизации формы.

OnCloseQueryExt: procedure(Sender: Component, var CanClose: boolean);

Возникает при закрытии формы. Если CanClose внутри процедуры получает значение False, то форма не может быть закрыта.


Класс Panel

Control <-- ContainerControl <-- Panel

Класс Panel представляет панель. Панель является контейнером для других элементов управления и группирует их вместе.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства унаследованы от класса ContainerControl:

property Controls[index: integer]: Control;
property ControlsCount: integer;

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс GroupBox

Control <-- ContainerControl <-- GroupBox

Класс GroupBox представляет группирующую рамку. Группирующая рамка имеет ту же функциональность, что и панель, но визуально по-другому отображается на экране: она имеет заголовок.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства унаследованы от класса ContainerControl:

property Controls[index: integer]: Control;
property ControlsCount: integer;

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс RadioGroup

Control <-- RadioGroup

Класс RadioGroup представляет группу радиокнопок. Выбранная радиокнопка в группе доступна по индексу ItemIndex.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе RadioGroup:

property Items: StringArray;

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

property ItemsCount: integer;

Определяет количество радиокнопок в группе.

property ItemIndex: integer;

Определяет номер текущей выбранной радиокнопки (если ни одна радиокнопка не выбрана, то ItemIndex=0).

property Strings[i: integer]: string;

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

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс Button

Control <-- Button

Класс Button представляет кнопку.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе Button:

property ModalResult: ModalResultType;

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

procedure SetImage(name: string);

Устанавливает рисунок, изображенный на кнопке. В качестве name указывается имя файла на диске (допускаются .bmp или .ico файлы) либо имя стандартного ресурса (в этом случае расширение не указывается).

procedure SetImage(name: string; N: integer);

Устанавливает рисунок, изображенный на кнопке. Параметр name определяет имя bmp-файла на диске, содержащего несколько рисунков, а параметр N - номер рисунка в этом файле (нумерация производится с 1). Если высота данного файла в пикселах равна H, то ширина должна быть кратна 2*H. Рисунок с номером i имеет размер HxH и располагается в указанном файле с пикселя (i-1)*2*H+1 по горизонтали. Следом за ним с пикселя (i-1)*2*H+1+H должен находиться рисунок, представляющий собой изображение на "запрещенной" кнопке (Enabled=False).

procedure ClearImage;

Удаляет рисунок, установленный методом SetImage.
Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс RadioButton

Control <-- RadioButton

Класс RadioButton представляет радиокнопку (переключатель). Радиокнопки, помещенные на один контейнер компонентов, объединяются в группы. В группе может быть выбрана лишь одна радиокнопка. При выборе радиокнопки остальные радиокнопки освобождаются.

Для выбора радиокнопки программным путем ее свойству Checked следует присвоить True.

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

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе RadioButton:

property Checked: boolean;

Определяет, выбрана ли данная радиокнопка. При изменении этого свойства генерируется событие OnClick.
Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс Checkbox

Control <-- Checkbox

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

Для включения флажка программным путем его свойству Checked следует присвоить True, для выключения - False.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе Checkbox:

property Checked: boolean;

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

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс TextLabel

Control <-- TextLabel

Класс TextLabel (текстовая метка) представляет компоненту для отображения текста.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Свойство Caption определяет надпись на метке.

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс Edit

Control <-- Edit

Класс Edit представляет поле ввода. Поле ввода отображает одну строку текста, позволяя ее редактировать.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Свойство Caption определяет текст в поле ввода.

Следующие свойства определены в классе Edit:

property Text: string;

Свойство Text является синонимом свойства Caption.
Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Следующие события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Следующие события определены в классе Edit:

OnChange: procedure;

Возникает при изменении текста в поле ввода.
Расширенные события

Следующие расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);

Следующие расширенные события определены в классе Edit:

OnChangeExt: procedure(Sender: Component);

Возникает при изменении текста в поле ввода.


Класс SpinEdit

Control <-- Edit <-- SpinEdit

Класс SpinEdit представляет поле для ввода целого значения, совмещенное с двумя кнопками, позволяющими увеличивать и уменьшать это значение.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства унаследованы от класса Edit:

property Text: string;

Следующие свойства определены в классе SpinEdit:

property Value: integer;

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

property Min: integer;

Задает минимальное целое значение, которое пользователь может ввести в компоненте.

property Max: integer;

Задает максимальное целое значение, которое пользователь может ввести в компоненте.

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Следующие события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Следующие события унаследованы от класса Edit:

OnChange: procedure;

Расширенные события

Следующие расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);

Следующие расширенные события унаследованы от класса Edit:

OnChangeExt: procedure(Sender: Component);


Класс TextBox

Control <-- TextBox

Класс TextBox представляет простой текстовый редактор (компонент TMemo в Delphi).

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе TextBox:

property Lines: StringArrayBase;

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

property ScrollBars: ScrollStyleType;

Определяет, имеются ли у редактора полосы прокрутки. Тип ScrollStyleType определен следующим образом: ScrollStyleType=(ssNone,ssHorizontal,ssVertical,ssBoth)

property ReadOnly: boolean;

Определяет, является ли редактор доступным только для чтения.
Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Следующие события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Следующие события определены в классе TextBox:

OnChange: procedure;

Возникает при изменении текста в поле ввода.
Расширенные события

Следующие расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);

Следующие расширенные события определены в классе TextBox:

OnChangeExt: procedure(Sender: Component);

Возникает при изменении текста в поле ввода.


Класс ListBox

Control <-- ListBox

Класс ListBox представляет элемент управления список.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Свойство Caption не оказывает влияние на список.

Следующие свойства определены в классе ListBox:

property Items: StringArrayBase;

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

property ItemsCount: integer;

Определяет количество строк в списке.

property ItemIndex: integer;

Определяет номер текущего выбранного элемента в списке Items (нумерация начинается с 1). Если элемент не выбран, то ItemIndex=0. При изменении значения ItemIndex выбирается строка списка с соответствующим номером.

property Strings[i: integer]: string;

Определяет строку в списке с номером i (нумерация начинается с 1).

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Следующие методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

Следующие методы определены в классе ListBox:

procedure Add(s: string);

Добавляет строку s в конец списка.

procedure Delete(i: integer);

Удаляет строку из позиции i.

procedure Insert(i: integer; s: string);

Вставляет строку s в позицию i.

procedure Clear;

Очищает список.
События

Следующие события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Следующие расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс ComboBox

Control <-- Combo Box

Класс ComboBox представляет элемент управления поле с выпадающим списком.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе ComboBox:

property Text: string;

Определяет текст в поле ввода.

property Items: StringArrayBase;

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

property ItemsCount: integer;

Определяет количество строк в списке.

property ItemIndex: integer;

Определяет номер текущего выбранного элемента в списке Items (нумерация начинается с 1). Если элемент не выбран, то ItemIndex=0. При изменении значения ItemIndex выбирается строка списка с соответствующим номером и свойство Text меняется на значение выбранной строки.

property Strings[i: integer]: string;

Определяет строку в списке с номером i (нумерация начинается с 1).

property Style: ComboBoxStyleType;

Задает стиль выпадающего списка. Тип ComboBoxStyleType определен следующим образом: ComboBoxStyleType=(csDropDown, csDropDownList). Константы этого типа имеют следующий смысл:

  • csDropDown - поле ввода доступно для редактирования, в нем можно вводить строки, отличные от строк в списке;
  • csDropDownList - поле ввода недоступно для редактирования.

property DropDownCount: integer;

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

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Следующие методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

Следующие методы определены в классе ComboBox:

procedure Add(s: string);

Добавляет строку s в конец списка.

procedure Delete(i: integer);

Удаляет строку из позиции i.

procedure Insert(i: integer; s: string);

Вставляет строку s в позицию i.

procedure Clear;

Очищает список.
События

Следующие события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Следующие события определены в классе ComboBox:

OnChange: procedure;

Возникает при изменении текста в поле ввода элемента.

Расширенные события

Следующие расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);

Следующие расширенные события определены в классе ComboBox:

OnChangeExt: procedure(Sender: Component);

Возникает при изменении текста в поле ввода элемента.


Класс Shape

Control <-- Shape

Класс Shape представляет графическую фигуру.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе Shape:

property Pen: PenType;

Определяет перо, которым нарисована граница элемента.

property Brush: BrushType;

Определяет кисть, которой залита внутренность элемента.

property Shape: ShapeType;

Определяет форму элемента. Тип ShapeType определен следующим образом: ShapeType=(stRectangle, stSquare, stRoundRect, stRoundSquare, stEllipse, stCircle).

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Следующие методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Следующие события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Следующие расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс TrackBar

Control <-- TrackBar

Класс TrackBar представляет стандартную линейку значений с бегунком.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе TrackBar:

property Min: integer;

Определяет наименьшее значение бегунка.

property Max: integer;

Определяет наибольшее значение бегунка.

property Position: integer;

Определяет текущее значение бегунка.

property Frequency: integer;

Определяет интервал между делениями, отображаемыми на элементе.

property Orientation: OrientationType;

Определяет ориентацию элемента.

property MarkerSize: integer;

Определяет размер бегунка.

property TickMarks: TickMarksType;

Определяет, как отображать деления на бегунке. Тип TickMarksType определен следующим образом: TickMarksType=(tmBottomRight, tmTopLeft, tmBoth).

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Следующие методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Следующие события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Следующие события определены в классе TrackBar:

OnChange: procedure;

Возникает при изменении положения бегунка.

Расширенные события

Следующие расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);

Следующие расширенные события определены в классе TrackBar:

OnChangeExt: procedure(Sender: Component);

Возникает при изменении положения бегунка.


Класс ProgressBar

Control <-- ProgressBar

Класс ProgressBar представляет индикатор хода выполнения.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе ProgressBar:

property Min: integer;

Определяет наименьшее значение диапазона значений индикатора.

property Max: integer;

Определяет наибольшее значение диапазона значений индикатора.

property Position: integer;

Определяет текущее значение индикатора.

property Orientation: OrientationType;

Задает ориентацию индикатора.

property Smooth: boolean;

Определяет способ отображения индикатора.

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Следующие методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Следующие события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Следующие расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс StatusBar

Control <-- StatusBar

Класс StatusBar представляет строку статуса.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе StatusBar:

property Text: string;

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

property Panels[i: integer]: StatusPanel;

Определяет набор панелей для строки статуса. Индексация производится с 1.

property PanelsCount: integer;

Определяет количество панелей в строке статуса. Вначале создается одна панель. Свойство предназначено только для чтения.

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Следующие методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

Следующие методы определены в классе StatusBar:

procedure Add(text: string);

Добавляет панель с заданным текстом к строке статуса.

procedure Add(text: string; width: integer);

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

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс StatusPanel

Object <-- StatusPanel

Класс StatusPanel представляет панель для строки статуса StatusBar.

Свойства

Следующие свойства определены в классе StatusPanel:

property Text: string;

Определяет текст панели.

property Alignment: AlignmentType;

Определяет выравнивание текста на панели. Тип AlignmentType определен следующим образом: AlignmentType=(taLeftJustify, taRightJustify, taCenter).

property Width: integer;

Определяет ширину панели.

property Bevel: BevelType;

Задает стиль рамки панели.

Конструкторы

Панели создаются только неявно методом Add класса StatusBar.


Класс Splitter

Control <-- Splitter

Класс Splitter представляет разделитель, позволяющий менять ширину или высоту присоединенных элементов управления.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе Splitter:

property MinSize: integer;

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

property AutoSnap: boolean;

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

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс ScrollBox

Control <-- ContainerControl <-- ScrollBox

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

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства унаследованы от класса ContainerControl:

property Controls[index: integer]: Control;
property ControlsCount: integer;

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс SpeedButton

Control <-- SpeedButton

Класс Speed Button представляет кнопку, которая не может иметь фокус. Кнопки SpeedButton могут также объединяться в группы.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе SpeedButton:
property Flat: boolean;

Определяет, является ли кнопка плоской (Flat=True) или имеет рамку (Flat=False).

property GroupIndex: integer;

Определяет номер группы, которой принадлежит кнопка. Если GroupIndex=0, то кнопка работает независимо от других кнопок. Если GroupIndex>0, то кнопка остается нажатой до тех пор, пока пользователь не нажмет другую кнопку этой группы. Кнопки в группе работают как переключатели: при нажатии на одну из них остальные переходят в ненажатое состояние.

property Down: boolean;

Определяет, нажата ли кнопка в группе. Это свойство имеет смысл только для кнопок, принадлежащих группе (GroupIndex>0).

property AllowAllUp: boolean;

Определяет, могут ли все кнопки в группе находиться в ненажатом состоянии. Это свойство имеет смысл только для кнопок, принадлежащих группе (GroupIndex>0).
Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Следующие методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

Следующие методы определены в классе SpeedButton:

procedure SetImage(name: string);

Устанавливает рисунок, изображенный на кнопке. В качестве name указывается имя файла на диске (допускаются .bmp или .ico файлы) либо имя стандартного ресурса (в этом случае расширение не указывается).

procedure SetImage(name: string; N: integer);

Устанавливает рисунок, изображенный на кнопке. Параметр name определяет имя bmp-файла на диске, содержащего несколько рисунков, а параметр N - номер рисунка в этом файле (нумерация производится с 1). Если высота данного файла в пикселах равна H, то ширина должна быть кратна 2*H. Рисунок с номером i имеет размер HxH и располагается в указанном файле с пикселя (i-1)*2*H+1 по горизонтали. Следом за ним с пикселя (i-1)*2*H+1+H должен находиться рисунок, представляющий собой изображение на "запрещенной" кнопке (Enabled=False).

procedure ClearImage;

Удаляет рисунок, установленный методом SetImage.
События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс ColorGrid

Control <-- ColorGrid

Класс ColorGrid представляет панель для выбора двух цветов из 16-ти: цвета переднего плана и цвета заднего плана.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе ColorGrid:
property Style: ColorGridStyleType;

Задает стиль отображения цветовой панели. Тип ColorGridStyleType определен следующим образом: ColorGridStyleType=(cg16x1, cg8x2, cg4x4, cg2x8, cg1x16). Константы этого типа имеют следующий смысл:

  • cg16x1 - 16 цветов в 1 ряд;
  • cg8x2 - по 8 цветов в 2 ряда;
  • cg4x4 - по 4 цвета в 4 ряда;
  • cg2x8 - по 2 цвета в 8 рядов;
  • cg1x16 - по 1 цвету в 16 рядов.
property BackgroundColor: ColorType;

Определяет цвет заднего плана.

property BackgroundIndex: integer;

Определяет номер цвета заднего плана.

property BackgroundEnabled: boolean;

Определяет, доступен ли цвет заднего плана.

property ForegroundColor: ColorType;

Определяет цвет переднего плана.

property ForegroundIndex: integer;

Определяет номер цвета переднего плана.

property ForegroundEnabled: boolean;

Определяет, доступен ли цвет переднего плана.

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс Animate

Control <-- Animate

Класс Animate представляет элемент для отображения стандартной анимации.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе Animate:

property Avi: AVIType;

Определяет стандартную анимацию, отображаемую элементом. Тип AVIType определен следующим образом: AVIType=(aviNone, aviFindFolder, aviFindFile, aviFindComputer, aviCopyFiles, aviCopyFile, aviRecycleFile, aviEmptyRecycle, aviDeleteFile);

property Active: boolean;

Определяет, активна ли анимация.

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс ToolBar

Control <-- ToolBar

Класс Tool Bar представляет панель инструментов. На панели инструментов могут находиться только кнопки ToolButton, создаваемые методом AddButton или методом AddSeparator.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе ToolBar:

property Buttons[i: integer]: ToolButton;

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

property ButtonsCount: integer;

Определяет количество кнопок. Свойство доступно только для чтения.

property Flat: boolean;

Определяет, содержит ли панель инструментов плоские кнопки (Flat=True) или кнопки, имеющие рамку (Flat=False)..
Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Следующие методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

Следующие методы определены в классе ToolBar:

procedure AddSeparator;

Добавляет на панель инструментов разделитель.

procedure AddButton(name: string);

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

procedure AddButton(name: string; n: integer);

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

procedure AddButton(onClick: procedure; name: string);

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

procedure AddButton(onClick: procedure; name: string; n: integer);

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

procedure AddButton(onClickExt: procedure (Sender: Object); name: string);

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

procedure AddButton(onClickExt: procedure (Sender: Object); name: string; n: integer);

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

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс ToolButton

Control <-- ToolButton

Класс ToolB utton представляет кнопку или разделитель на панели инструментов.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе ToolButton:

property Style: ToolButtonStyleType;

Задает стиль кнопки на панели инструментов. Тип ToolButtonStyleType определен следующим образом: ToolButtonStyleType=(tbsButton, tbsSeparator). Константы этого типа имеют следующий смысл:
  • tbsButton - кнопка;
  • tbsSeparator - разделитель.
Конструкторы

Кнопку можно создать только неявно, вызвав метод AddButton или метод AddSeparator класса ToolBar.
Методы

Следующие методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

Следующие методы определены в классе ToolButton:

procedure SetImage(name: string);

Устанавливает для кнопки рисунок, содержащийся в файле или в стандартном ресурсе с именем name.

procedure SetImage(name: string; n: integer);

Устанавливает для кнопки рисунок, содержащийся в файле с именем name. Данный файл должен содержать набор рисунков; n указывает номер рисунка в наборе.

procedure ClearImage;

Удаляет рисунок, установленный методом SetImage.
События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс PageControl

Control <-- PageControl

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

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе PageControl:

property Pages[i: integer]: TabSheet;

Определяет массив страниц.

property PagesCount: integer;

Определяет количество страниц в массиве Pages.

property Style: PageControlStyleType;

Задает стиль вкладок. Тип PageControlStyleType определен следующим образом: PageControlStyleType=(tsTabs, tsButtons, tsFlatButtons). Константы этого типа имеют следующий смысл: tsTabs - обычные вкладки, tsButtons - вкладки в виде кнопок, tsFlatButtons - вкладки в виде плоских кнопок.

property ActivePage: TabSheet;

Определяет активную страницу.

property ActivePageIndex: integer;

Определяет индекс активной страницы (индексация с единицы).
Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Следующие методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

Следующие методы определены в классе PageControl:

procedure Add(name: string);

Добавляет страницу с заголовком name.
События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс TabSheet

Control <-- ContainerControl <-- TabSheet

Класс TabSheet представляет одну страницу в элементе PageControl.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства унаследованы от класса ContainerControl:

property Controls[index: integer]: Control;
property ControlsCount: integer;

Следующие свойства определены в классе TabSheet:

property PageIndex: integer;

Определяет индекс страницы в массиве Pages родительского элемента PageControl.

Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Все методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс MainMenu

Component <-- MainMenu

Класс MainMenu представляет главное меню приложения.

Свойства

property Items[i: integer]: MenuItem;

Определяет массив пунктов меню (индексация производится с единицы).

property ItemsCount: integer;

Определяет количество пунктов меню.

Конструкторы

constructor Create;

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

constructor Create(owner: Form);

Создает главное меню и привязывает его к форме owner.

Методы

procedure Add(caption: string; onСlick: procedure);

Добавляет пункт меню с заголовком caption и обработчиком onСlick.

procedure Add(caption: string; onСlick: procedure; name: string);

Добавляет пункт меню с заголовком caption, обработчиком onСlick и рисунком из файла или стандартного ресурса с именем name.

procedure Add(caption: string; onСlick: procedure; name: string; n: integer);

Добавляет пункт меню с заголовком caption, обработчиком onСlick и рисунком из файла с именем name, содержащего набор рисунков; n указывает номер рисунка в наборе.

procedure Add(caption: string; onСlickExt: procedure (Sender: Component));

Добавляет пункт меню с заголовком caption и расширенным обработчиком onСlickExt.

procedure Add(caption: string; onСlickExt: procedure (Sender: Component); name: string);

Добавляет пункт меню с заголовком caption, расширенным обработчиком onСlickExt и рисунком из файла или стандартного ресурса с именем name.

procedure Add(caption: string; onСlickExt: procedure (Sender: Component); name: string; n: integer);

Добавляет пункт меню с заголовком caption, расширенным обработчиком onСlickExt и рисунком из файла с именем name, содержащего набор рисунков; n указывает номер рисунка в наборе.


Класс PopupMenu

Component <-- PopupMenu

Класс Popup Menu представляет контекстное меню элемента. Чтобы связать с элементом контекстное меню, необходимо свойству PopMenu элемента присвоить объект PopupMenu.

Свойства

property Items[i: integer]: MenuItem;

Определяет массив пунктов меню (индексация производится с единицы).

property ItemsCount: integer;

Определяет количество пунктов меню.

Конструкторы

constructor Create;

Создает выпадающее меню и привязывает его к главной форме приложения.

constructor Create(owner: Control);

Создает выпадающее меню и привязывает его к элементу управления owner.
Методы

procedure Add(caption: string; onСlick: procedure);

Добавляет пункт меню с заголовком caption и обработчиком onСlick.

procedure Add(caption: string; onСlick: procedure; name: string);

Добавляет пункт меню с заголовком caption, обработчиком onСlick и рисунком из файла или стандартного ресурса с именем name.

procedure Add(caption: string; onСlick: procedure; name: string; n: integer);

Добавляет пункт меню с заголовком caption, обработчиком onСlick и рисунком из файла с именем name, содержащего набор рисунков; n указывает номер рисунка в наборе.

procedure Add(caption: string; onСlickExt: procedure (Sender: Component));

Добавляет пункт меню с заголовком caption и расширенным обработчиком onСlickExt.

procedure Add(caption: string; onСlickExt: procedure (Sender: Component); name: string);

Добавляет пункт меню с заголовком caption, расширенным обработчиком onСlickExt и рисунком из файла или стандартного ресурса с именем name.

procedure Add(caption: string; onСlickExt: procedure (Sender: Component); name: string; n: integer);

Добавляет пункт меню с заголовком caption, расширенным обработчиком onСlickExt и рисунком из файла с именем name, содержащего набор рисунков; n указывает номер рисунка в наборе.


Класс MenuItem

Component <-- MenuItem

Класс MenuItem описывает пункт меню.

Свойства

property Items[i: integer]: MenuItem;

Определяет массив пунктов подменю для данного пункта меню.

property ItemsCount: integer;

Определяет количество пунктов подменю.

property Caption: string;

Определяет заголовок пункта меню.

property AutoCheck: boolean;

Определяет, переключается ли флажок автоматически при выборе пункта меню.

property Checked: boolean;

Определяет наличие флажка перед заголовком меню.

property Enabled: boolean;

Определяет, разрешен ли пункт меню.

Конструкторы

Пункты меню MenuItem создаются только неявно методом Add классов MainMenu, PopupMenu, MenuItem.

Методы

procedure SetImage(name: string);

Устанавливает для пункта меню рисунок, содержащийся в файле или в стандартном ресурсе с именем name.

procedure SetImage(name: string; n: integer);

Устанавливает для пункта меню рисунок, содержащийся в файле с именем name. Данный файл должен содержать набор рисунков; n указывает номер рисунка в наборе.

procedure ClearImage;

Удаляет рисунок, установленный методом SetImage.

procedure Add(caption: string; onСlick: procedure);

Добавляет пункт подменю с заголовком caption и обработчиком onСlick.

procedure Add(caption: string; onСlick: procedure; name: string);

Добавляет пункт подменю с заголовком caption, обработчиком onСlick и рисунком из файла или стандартного ресурса с именем name.

procedure Add(caption: string; onСlick: procedure; name: string; n: integer);

Добавляет пункт подменю с заголовком caption, обработчиком onСlick и рисунком из файла с именем name, содержащего набор рисунков; n указывает номер рисунка в наборе.

procedure Add(caption: string; onСlickExt: procedure (Sender: Component));

Добавляет пункт подменю с заголовком caption и расширенным обработчиком onСlickExt.

procedure Add(caption: string; onСlickExt: procedure (Sender: Component); name: string);

Добавляет пункт подменю с заголовком caption, расширенным обработчиком onСlickExt и рисунком из файла или стандартного ресурса с именем name.

procedure Add(caption: string; onСlickExt: procedure (Sender: Component); name: string; n: integer);

Добавляет пункт подменю с заголовком caption, расширенным обработчиком onСlickExt и рисунком из файла с именем name, содержащего набор рисунков; n указывает номер рисунка в наборе.

События

OnClick: procedure;

Возникает при выборе пункта меню.

Расширенные события

OnClickExt: procedure(Sender: Component);

Возникает при выборе пункта меню. Параметр Sender задает выбранный пункт меню.


Класс OpenDialog

Component <-- OpenDialog

Класс OpenDialog описывает стандартное окно диалога открытия файла.

Свойства

property Filter: string;

Определяет типы файлов и соответствующие им маски, доступные в окне диалога. Типы файлов и их маски следует перечислить, разделяя их символом '|'; одному типу файлов может соответствовать несколько масок, разделяемых символом ';'. Например, Filter='Текстовые файлы|*.txt;*.doc|Все файлы|*.*' описывает два типа файлов, доступных в окне диалога: текстовые файлы и все файлы.

property InitialDir: string;

Определяет текущий каталог при открытии окна диалога.

property Title: string;

Определяет заголовок окна диалога.

property FileName: string;

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

Конструкторы

constructor Create;
constructor Create(Filter: string);

Методы

function Execute: boolean;

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


Класс SaveDialog

Component <-- SaveDialog

Класс Save Dialog описывает стандартное окно диалога сохранения файла.

Свойства

property Filter: string;

Определяет типы файлов и соответствующие им маски, доступные в окне диалога. Типы файлов и их маски следует перечислить, разделяя их символом '|'; одному типу файлов может соответствовать несколько масок, разделяемых символом ';'. Например, Filter='Текстовые файлы|*.txt;*.doc|Все файлы|*.*' описывает два типа файлов, доступных в окне диалога: текстовые файлы и все файлы.

property InitialDir: string;

Определяет текущий каталог при открытии окна диалога.

property Title: string;

Определяет заголовок окна диалога.

property FileName: string;

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

Конструкторы

constructor Create;
constructor Create(Filter: string);

Методы

function Execute: boolean;

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


Класс ColorDialog

Component <-- ColorDialog

Класс Color Dialog описывает стандартное окно диалога для выбора цвета.

Свойства

property Color: integer;

Определяет цвет, выбранный в окне диалога

Конструкторы

constructor Create;

Методы

function Execute: boolean;

Отображает окно диалога и возвращает True, если пользователь выбрал цвет, и False в противном случае.


Класс FontDialog

Component <-- FontDialog

Класс Font Dialog описывает стандартное окно диалога для выбора шрифта.

Свойства

property Font: FontType;

Определяет шрифт, выбранный в окне диалога.

Конструкторы

constructor Create;

Методы

function Execute: boolean;

Отображает окно диалога и возвращает True, если пользователь выбрал шрифт, и False в противном случае.


Класс PenType

Object <-- PenType

Класс PenType описывает параметры пера, используемого для рисования линий и кривых.

Свойства

property Color: integer ;

Определяет цвет пера.

property Width: integer;

Определяет ширину пера в пикселах. Ширина пера, отличная от 1, доступна только для сплошного пера, имеющего стиль psSolid.

property Style: PenStyle;

Определяет штриховку пера. Тип PenStyle представляет собой перечислимый тип, константы которого приведены ниже:

psSolid
psClear
psDash
psDot
psDashDot
psDashDotDot

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

property Mode: PenMode;

Определяет, как цвет пера взаимодействует с цветом окна, на котором производится рисование. По умолчанию имеет значение pmCopy. Тип PenMode определен следующим образом: PenMode = (pmBlack, pmWhite, pmNop, pmNot, pmCopy, pmNotCopy, pmMergePenNot, pmMaskPenNot, pmMergeNotPen, pmMaskNotPen, pmMerge, pmNotMerge, pmMask, pmNotMask, pmXor, pmNotXor);

Конструкторы

constructor Create;


Класс BrushType

Object <-- BrushType

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

Свойства

property Color: ColorType;

Определяет цвет кисти.

property Style: BrushStyle;

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

bsSolid | bsCross
bsClear | bsDiagCross
bsHorizontal | bsBDiagonal
bsVertical | bsFDiagonal

Стиль bsClear означает, что кисть полностью прозрачна. Этот стиль используется, когда требуется нарисовать замкнутую фигуру без заливки, т.е. прозрачную внутри.

Конструкторы

constructor Create;

Методы

procedure SetImage(name: string);

Устанавливает для кисти рисунок, содержащийся в файле или в стандартном ресурсе с именем name. Если рисунок для кисти установлен, то стиль кисти игнорируется.

procedure SetImage(b: Bitmap);

Устанавливает для кисти рисунок, содержащийся в объекте типа Bitmap. Если рисунок для кисти установлен, то стиль кисти игнорируется.

procedure ClearImage;

Очищает рисунок кисти, установленный методом SetImage.


Класс FontType

Object <-- FontType

Класс FontType описывает параметры шрифта.

Свойства

property Color: integer;

Определяет цвет шрифта.

property Size: integer;

Определяет размер шрифта в пунктах.

property Name: string;

Определяет наименование шрифта. По умолчанию устанавливается шрифт MS Sans Serif. Наиболее распространенными шрифтами являются Times, Arial и Courier New. Наименование шрифта можно набирать без учета регистра.

property Style: set of FontStyle;

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

type FontStyle=(fsBold, fsItalic, fsUnderline, fsStrikeOut);

Например, для установки жирного наклонного шрифта следует выполнить оператор Style:=[fsBold, fsItalic], а для снятия подчеркивания с сохранением остальных атрибутов - оператор Style:=Style-[fsUnderline].

Конструкторы

constructor Create;


Класс ScreenType

Object <-- ScreenType

Класс ScreenType описывает параметры экрана.

Свойства

property Width: integer;

Определяет ширину экрана в пикселах.

property Height: integer;

Определяет высоту экрана в пикселах.

Конструкторы

При запуске приложения создается объект Screen типа ScreenType. Другие объекты типа ScreenType создавать нельзя.


Класс ApplicationType

Object <-- ApplicationType

Класс ApplicationType описывает параметры приложения.

Свойства

property ShowMainFormAtStart: boolean;

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

property TerminateIfNoMainForm: boolean;

Определяет, завершать ли программу после выполнения ее тела begin/end в случае отсутствия главной формы. Если главная форма присутствует, то после завершения тела основной программы приложение не завершается, а становится событийным. Завершить приложение можно, закрыв главную форму (программно - MainForm.Close или Application.Terminate). Если главная форма отсутствует, то не завершать программу после завершения ее тела может понадобиться, например, если в программе определен таймер.

property MainForm: Form;

Определяет главную форму приложения. Свойство доступно только на чтение.

Конструкторы

При запуске приложения создается объект Application типа ApplicationType. Другие объекты типа ApplicationType создавать нельзя.

Методы

procedure Terminate;

Завершает работу приложения Pascal ABC Forms.

procedure ProcessMessages;

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


Класс Timer

Component <-- Timer

Класс Timer описывает системный таймер.

Свойства

property Interval: integer;

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

property Enabled: boolean;

Определяет, включен ли таймер.

Конструкторы

constructor Create(event: procedure; interval: integer);

Создает таймер с обработчиком event и интервалом срабатывания обработчика interval. Свойство Enabled устанавливается в True, т.е. таймер сразу запускается.

constructor Create(event: procedure; interval: integer; enabled: boolean);

Создает таймер с обработчиком event и интервалом срабатывания обработчика interval. Последний параметр enabled определяет, запускается ли таймер сразу после создания.

constructor Create(eventExt: procedure (Sender: Component); interval: integer);

Создает расширенный таймер с обработчиком eventExt и интервалом срабатывания обработчика interval. Свойство Enabled устанавливается в True, т.е. таймер сразу запускается.

constructor Create(eventExt: procedure (Sender: Component); interval: integer; enabled: boolean);

Создает расширенный таймер с обработчиком eventExt и интервалом срабатывания обработчика interval. Последний параметр enabled определяет, запускается ли таймер сразу после создания.

Методы

procedure Start;

Запускает таймер.

procedure Stop;

Останавливает таймер.
События

OnTimer: procedure;

Возникает, когда закончился интервал времени, заданный свойством Interval.

Расширенные события

OnTimerExt: procedure(Sender: Component);

Возникает, когда закончился интервал времени, заданный свойством Interval.


Класс Bitmap

Object <-- Bitmap

Класс Bitmap описывает рисунок, хранящийся в оперативной памяти.

Свойства

Следующие свойства определены в классе Bitmap:

property Width: integer;

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

property Height: integer;

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

property Canvas: CanvasType;

Определяет канву, с помощью которой можно производить рисование на Bitmapе. Свойство доступно только для чтения.

property TransparentMode: TransparentModeType;

Определяет, должна ли учитываться прозрачность рисунка при рисовании. Тип TransparentModeType определен следующим образом: TransparentModeType=(tmNone,tmAuto,tmColor). Константы перечислимого типа имеют следующий смысл: tmNone - прозрачность не учитывается, tmAuto - в качестве прозрачного выбирается цвет левого нижнего пиксела, tmColor - в качестве прозрачного выбирается цвет TransparentColor.

property TransparentColor: ColorType;

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

Конструкторы

constructor Create;

Создает рисунок размера 1x1 пиксел.

constructor Create(m,n: integer);

Создает рисунок размера mxn пикселов.

constructor Create(fname: string);

Создает рисунок, загружая его содержимое из файла с именем fname.
Методы

Следующие методы определены в классе Bitmap:

procedure LoadFromFile(fname: string);

Загружает рисунок из файла с именем fname.

procedure SaveToFile(fname: string);

Сохраняет рисунок в файл с именем fname.

procedure Clear;

Заливает рисунок белым цветом.


Класс PaintBox

Control <-- PaintBox

Класс PaintBox представляет прямоугольную область, используемую для рисования.

Свойства

Следующие свойства унаследованы от класса Control:

property Left: integer;
property Top: integer;
property Width: integer;
property Height: integer;
property ClientWidth: integer;
property ClientHeight: integer;
property Parent:
    ContainerControl;
property Color: integer;
property Hint: string;
property Enabled: boolean;
property Visible: boolean;
property Caption: string;
property Cursor: integer;
property
    Align: integer;
property
    PopMenu: PopupMenu;
property
    Font: FontType;
property
    TabOrder:
    integer;
property
    TabStop:
    boolean;
property
    BevelInner:
    BevelType;
property
    BevelOuter:
    BevelType;

Следующие свойства определены в классе PaintBox:

property Canvas: CanvasType;

Определяет канву PaintBoxа. Свойство доступно только для чтения.

property Pen: PenType;

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

property Brush: BrushType;

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

property Font: FontType;

Определяет шрифт, используемый для вывода текста.

property PenPos: Point;

Определяет текущую позицию пера.
Конструкторы

Все конструкторы унаследованы от класса Control:

constructor Create;
constructor Create(L,T:
    integer);
constructor Create(L,T,W,H:
    integer);
constructor Create(L,T: integer; c: string);
constructor Create(L,T,W,H: integer; c: string);
constructor Create(Parent: ContainerControl);
constructor Create(Parent: ContainerControl; L,T:
    integer);
constructor Create(Parent: ContainerControl; L,T,W,H:
    integer);
constructor Create(Parent: ContainerControl; L,T: integer;
    c: string);
constructor Create(Parent: ContainerControl; L,T,W,H: integer;
    c: string);

Методы

Следующие методы унаследованы от класса Control:

procedure SetSize(Width,Height: integer);
procedure SetPos(Left,Top: integer);
procedure InitControl(Enabled,Visible:
    boolean; Align: AlignType;
    Cursor: CursorType;
    Color: ColorType; Caption,Hint: string);

В классе PaintBox определены те же методы, что и в классе CanvasType. По-существу, вызов этих методов делегируется внутреннему объекту Canvas.

procedure SetPixel(x,y: integer; color: ColorType);

Закрашивает один пиксел с координатами (x,y) цветом color.

function GetPixel(x,y:integer): ColorType;

Возвращает текущее значение цвета для пиксела с координатами (x,y).

procedure LineTo(x,y: integer);

Рисует отрезок от текущего положения пера до точки (x,y); координаты пера при этом также становятся равными (x,y).

procedure MoveTo(x,y: integer);

Передвигает невидимое перо к точке с координатами (x,y); эта функция работает в паре с функцией LineTo(x,y).

procedure Line(x1,y1,x2,y2: integer);

Рисует отрезок с началом в точке (x1,y1) и концом в точке (x2,y2).

procedure Circle(x,y,r: integer);

Рисует окружность с центром в точке (x,y) и радиусом r.

procedure Ellipse(x1,y1,x2,y2: integer);

Рисует эллипс, заданный своим описанным прямоугольником с координатами противоположных вершин (x1,y1) и (x2,y2).

procedure Rectangle(x1,y1,x2,y2: integer);

Рисует прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2).

procedure RoundRect(x1,y1,x2,y2,w,h: integer);

Рисует прямоугольник со скругленными краями; (x1,y1) и (x2,y2) задают пару противоположных вершин, а w и h – ширину и высоту эллипса, используемого для скругления краев.

procedure FillRect(x1,y1,x2,y2: integer);

Заливает прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2), цветом текущей кисти.

procedure FloodFill(x,y: integer; color: ColorType);

Заливает область одного цвета цветом color, начиная с точки (x,y).

procedure Arc(x,y,r: integer; a1,a2: real);

Рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки).

procedure Pie(x,y,r: integer; a1,a2: real);

Рисует сектор окружности, ограниченный дугой (параметры процедуры имеют тот же смысл, что и в процедуре Arc).

procedure Chord(x,y,r: integer; a1,a2: real);

Рисует фигуру, ограниченную дугой окружности и отрезком, соединяющим ее концы (параметры процедуры имеют тот же смысл, что и в процедуре Arc).

procedure TextOut(x,y: integer; s: string);

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

function TextWidth(s: string): integer;

Определяет ширину в пикселах, необходимую для вывода строки s при текущих настройках шрифта.

function TextHeight(s: string): integer;

Определяет высоту в пикселах, необходимую для вывода строки s при текущих настройках шрифта.

procedure Draw(x,y: integer; pic: Bitmap);

Изображает рисунок, хранящийся в pic; позиция (x,y) задает координаты левого верхнего угла рисунка на канве.

procedure Polygon(var a; n: integer);

Строит ломаную по n точкам, координаты которых заданы в массиве a элементов типа Point.

procedure Polyline(var a; n: integer);

Строит замкнутую ломаную по n точкам, координаты которых заданы в массиве a элементов типа Point.

procedure CopyRect(ToRect: Rect; Canvas: CanvasType; FromRect: Rect);

Копирует часть изображения из прямоугольника FromRect канвы Canvas в прямоугольник ToRect канвы, вызывающей метод CopyRect.

События

Все события унаследованы от класса Control:

OnClick: procedure;
OnDblClick: procedure;
OnMouseDown: procedure(x,y,button: integer);
OnMouseUp: procedure(x,y,button:
    integer);
OnMouseMove: procedure(x,y,button: integer);
OnKeyDown: procedure(key: integer);
OnKeyUp: procedure(key:
    integer);
OnKeyPress: procedure(key:
    char);
OnEnter: procedure;
OnExit: procedure;
OnResize: procedure;

Расширенные события

Все расширенные события унаследованы от класса Control:

OnClickExt: procedure(Sender: Component);
OnDblClickExt: procedure(Sender: Component);
OnMouseDownExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseUpExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnMouseMoveExt: procedure(Sender: Component; Shift: ShiftState; x,y: integer);
OnKeyDownExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyUpExt: procedure(Sender: Component; key: integer; Shift: ShiftState);
OnKeyPressExt: procedure(Sender: Component; key: char);
OnEnterExt: procedure(Sender: Component);
OnExitExt: procedure(Sender: Component);
OnResizeExt: procedure(Sender: Component);


Класс CanvasType

Object <-- CanvasType

Класс CanvasType представляет поверхность рисования некоторого графического объекта, называемую также канвой. Канва имеет ряд графических примитивов, а также такие атрибуты как кисть, перо и шрифт. В Pascal ABC канву имеют лишь объекты классов PaintBox (рисование на экране) и Bitmap (рисование в памяти). Метод CopyRect позволяет копировать участки изображения с одной канвы на другую.

Свойства

Следующие свойства определены в классе CanvasType:

property Pen: PenType;

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

property Brush: BrushType;

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

property Font: FontType;

Определяет шрифт, используемый для вывода текста.

property PenPos: Point;

Определяет текущую позицию пера.
Конструкторы

Канва создается неявно при создании объектов классов PaintBox и Bitmap.
Методы

Следующие методы определены в классе CanvasType:

procedure SetPixel(x,y: integer; color: ColorType);

Закрашивает один пиксел с координатами (x,y) цветом color.

function GetPixel(x,y:integer): ColorType;

Возвращает текущее значение цвета для пиксела с координатами (x,y).

procedure LineTo(x,y: integer);

Рисует отрезок от текущего положения пера до точки (x,y); координаты пера при этом также становятся равными (x,y).

procedure MoveTo(x,y: integer);

Передвигает невидимое перо к точке с координатами (x,y); эта функция работает в паре с функцией LineTo(x,y).

procedure Line(x1,y1,x2,y2: integer);

Рисует отрезок с началом в точке (x1,y1) и концом в точке (x2,y2).

procedure Circle(x,y,r: integer);

Рисует окружность с центром в точке (x,y) и радиусом r.

procedure Ellipse(x1,y1,x2,y2: integer);

Рисует эллипс, заданный своим описанным прямоугольником с координатами противоположных вершин (x1,y1) и (x2,y2).

procedure Rectangle(x1,y1,x2,y2: integer);

Рисует прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2).

procedure RoundRect(x1,y1,x2,y2,w,h: integer);

Рисует прямоугольник со скругленными краями; (x1,y1) и (x2,y2) задают пару противоположных вершин, а w и h – ширину и высоту эллипса, используемого для скругления краев.

procedure FillRect(x1,y1,x2,y2: integer);

Заливает прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2), цветом текущей кисти.

procedure FloodFill(x,y: integer; color: ColorType);

Заливает область одного цвета цветом color, начиная с точки (x,y).

procedure Arc(x,y,r: integer; a1,a2: real);

Рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки).

procedure Pie(x,y,r: integer; a1,a2: real);

Рисует сектор окружности, ограниченный дугой (параметры процедуры имеют тот же смысл, что и в процедуре Arc).

procedure Chord(x,y,r: integer; a1,a2: real);

Рисует фигуру, ограниченную дугой окружности и отрезком, соединяющим ее концы (параметры процедуры имеют тот же смысл, что и в процедуре Arc).

procedure TextOut(x,y: integer; s: string);

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

function TextWidth(s: string): integer;

Определяет ширину в пикселах, необходимую для вывода строки s при текущих настройках шрифта.

function TextHeight(s: string): integer;

Определяет высоту в пикселах, необходимую для вывода строки s при текущих настройках шрифта.

procedure Draw(x,y: integer; pic: Bitmap);

Изображает рисунок, хранящийся в pic; позиция (x,y) задает координаты левого верхнего угла рисунка на канве.

procedure Polygon(var a; n: integer);

Строит ломаную по n точкам, координаты которых заданы в массиве a элементов типа Point.

procedure Polyline(var a; n: integer);

Строит замкнутую ломаную по n точкам, координаты которых заданы в массиве a элементов типа Point.

procedure CopyRect(ToRect: Rect; Canvas: CanvasType; FromRect: Rect);

Копирует часть изображения из прямоугольника FromRect канвы Canvas в прямоугольник ToRect канвы, вызывающей метод CopyRect.


Тип AlignType

Тип AlignType задает выравнивание элемента относительно родительского контейнера. Он определен следующим образом:

type AlignType=(alNone,alTop,alBottom,alLeft,alRight,alClient);

Значения типа AlignType имеют следующий смысл:

  • alNone - выравнивание отсутствует (по умолчанию);
  • alTop - элемент выравнивается по верхнему краю родителя, заполняя всю ширину его клиентской области; при изменении размеров родителя высота элемента не меняется;
  • alBottom - элемент выравнивается по нижнему краю родителя, заполняя всю ширину его клиентской области; при изменении размеров родителя высота элемента не меняется;
  • alLeft - элемент выравнивается по левому краю родителя, заполняя всю высоту его клиентской области; при изменении размеров родителя ширина элемента не меняется;
  • alRight - элемент выравнивается по правому краю родителя, заполняя всю высоту его клиентской области; при изменении размеров родителя ширина элемента не меняется;
  • alClient - элемент занимает все пространство клиентской области родителя.


Тип ModalResultType

Тип ModalResult Type описывает значение, возвращаемое модальный формой (т.е. формой, открытой методом ShowModal). Он определен следующим образом:

type ModalResultType=(mrNone, mrOk, mrYes, mrNo, mrCancel);


Тип ColorType

Тип Color Type описывает цвет. Этот тип определен в Pascal ABC следующим образом:

type ColorType=integer;


Тип ShiftState

Тип ShiftState представляет собой набор флагов, определяющих состояние клавиш Shift, Alt, Ctrl и кнопок мыши в момент наступления события мыши или клавиатуры. Он определен следующим образом:

type ShiftState=set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);

Константы имеют следующий смысл:

ssShift - нажата клавиша Shift;
ssAlt - нажата клавиша Alt;
ssCtrl - нажата клавиша Ctrl;
ssLeft - нажата левая кнопка мыши;
ssRight - нажата правая кнопка мыши;
ssMiddle - нажата средняя кнопка мыши;
ssDouble - совершен двойной щелчок мыши.


Тип BevelType

Тип BevelType описывает скос элемента и определен следующим образом: BevelType=(bvNone, bvLowered, bvRaised).


Тип OrientationType

Тип OrientationType задает вертикальную или горизонтальную ориентацию элемента. Он определен следующим образом:

type OrientationType=(orHorizontal, orVertical);


Тип CursorType

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

crDefault
crNone
crArrow
crCross
crIBeam
crSize
crSizeNESW
crSizeNS
crSizeNWSE
crSizeWE
crUpArrow
crHourGlass
crDrag
crNoDrop
crHSplit
crVSplit
crMultiDrag
crSQLWait
crNo
crAppStart
crHelp
crHandPoint
crSizeAll


Цветовые константы и функции для работы с цветом

Модуль VCL содержит константы и функции для работы с цветами, идентичные определенным в модуле GraphABC. Тип ColorType, описывающий цвет, определен следующим образом:

type ColorType=integer;

Стандартные цвета задаются символическими константами:

clBlack – черный
clPurple – фиолетовый
clWhite – белый
clMaroon – темно-красный
clRed – красный
clNavy – темно-синий
clGreen – зеленый
clBrown – коричневый
clBlue – синий
clSkyBlue – голубой
clYellow – желтый
clCream – кремовый 		clAqua – бирюзовый
clOlive – оливковый
clFuchsia – сиреневый
clTeal – сине-зеленый
clGray – темно-серый
clLime – ярко-зеленый
clMoneyGreen – цвет зеленых денег
clLtGray – светло-серый
clDkGray – темно-серый
clMedGray – серый
clSilver – серебряный
Для работы с цветами используются следующие функции.

function RGB(r,g,b: integer): ColorType;

Возвращает целое значение, являющееся кодом цвета, который содержит красную, зеленую и синюю составляющие с интенсивностями r, g и b соответственно (r, g и b – целые в диапазоне от 0 до 255, причем, 0 соответствует минимальной интенсивности, 255 – максимальной).

function GetRed(color: ColorType): integer;

Выделяет красную составляющую из цвета color (целое в диапазоне от 0 до 255);

function GetGreen(color: ColorType): integer;

Выделяет зеленую составляющую из цвета color (целое в диапазоне от 0 до 255);

function GetBlue(color: ColorType): integer;

Выделяет синюю составляющую из цвета color (целое в диапазоне от 0 до 255).


Модуль Containers

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

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

В Pascal ABC имеется модуль Containers, содержащий следующие структуры данных, реализованные в виде классов: Array (динамический массив), Stack (стек), Queue (очередь) и Set (множество). Каждый контейнер реализован в виде четырех классов, отличающихся типами элементов: integer, real, string или Object. Таким образом, модуль Containers содержит следующие классы:

IntArray
RealArray
StringArray
ObjectArray

IntStack
RealStack
StringStack
ObjectStack

IntQueue
RealQueue
StringQueue
ObjectQueue

IntSet
RealSet
StringSet
ObjectSet

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

В некоторых контейнерах объектов (ObjectArray и ObjectSet) имеется дополнительное поле OwnsObjects логического типа, характеризующее, владеет ли контейнер своими элементами. В конструкторе оно получает значение True, т.е. по умолчанию контейнер владеет своими элементами. Если контейнер владеет своими элементами, то он ответственен за их своевременное разрушение. Например, при вызове деструктора для контейнера объектов автоматически вызываются деструкторы его компонентов, при выполнении метода put(ind,obj) для ObjectArray вначале вызывается деструктор компонента по индексу ind и т.д. Контейнеры ObjectStack и ObjectQueue не владеют своими элементами.


Динамические массивы

Динамические массивы представлены в модуле Containers классами IntArray, RealArray, StringArray и ObjectArray. Они имеют практически одинаковые интерфейсы с небольшими отличиями: в StringArray отсутствуют методы вычисления суммы и среднего элементов, а в ObjectArray, помимо этого, отсутствуют методы поиска минимального и максимального элемента и их индексов, а также методы сортировки и вывода.

Нумерация элементов в динамических массивах начинается с единицы. Если происходит обращение по индексу, находящемуся вне диапазона 1..Size, то программа завершается с ошибкой. Исключение составляет функция Insert, где разрешается вставлять элемент в конец, т.е. по индексу Size+1.

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

Create - конструктор; создает пустой динамический массив;
Create(n) - конструктор; создает динамический массив из n элементов и заполняет их нулевыми значениями;
Destroy - деструктор;
Put(ind,v) - процедура, помещающая элемент v по индексу ind;
Get(ind) - функция, возвращающая элемент, находящийся по индексу ind;
Items[ind] - свойство (по умолчанию), осуществляющее доступ к элементу, находящемуся по индексу ind;
Size - функция, возвращающая количество элементов в массиве;
Count - функция, возвращающая количество элементов в массиве (синоним Size);
Resize(n) - процедура, устанавливающая размер массива равным n.
Add(v) - процедура, добавляющая элемент v в конец массива;
Fill(v) - процедура, заполняющая элементы массива значением v;
Clear - процедура, очищающая массив, делая его размер нулевым;
Insert(ind,v) - процедура, вставляющая элемент v на место с номером ind;
Delete(ind) - процедура, удаляющая элемент с номером ind;
Remove(v) - процедура, удаляющая из массива все элементы со значением v;
Exchange(i1,i2) - процедура, меняющая местами элементы, стоящие на местах i1 и i2;
IndexOf(v) - функция, возвращающая первый индекс элемента v или 0, если такой элемент отсутствует;
LastIndexOf(v) - функция, возвращающая последний индекс элемента v или 0, если такой элемент отсутствует;
Find(v) - функция, возвращающая True, если элемент v содержится в массиве, и False в противном случае;
MinElement - функция, возвращающая минимальный элемент массива; если массив пуст, то возвращает непредсказуемое значение;
MaxElement - функция, возвращающая максимальный элемент массива; если массив пуст, то возвращает непредсказуемое значение;
MinInd - функция, возвращающая индекс первого минимального элемента массива; если массив пуст, то возвращает 0;
MaxInd - функция, возвращающая индекс первого максимального элемента массива; если массив пуст, то возвращает 0;
Sort - процедура, сортирующая элементы в порядке возрастания;
Reverse - процедура, меняющая порядок элементов в массиве на противоположный;
Sum - функция, возвращающая сумму элементов массива;
Average - функция, возвращающая среднее элементов массива;
Print - процедура, выводящая содержимое динамического массива в окно вывода; элементы при выводе разделяются символом пробела;
Println - процедура, выводящая содержимое динамического массива в окно вывода и переводящая курсор на следующую строку; элементы при выводе разделяются символом пробела;
Print(delim)- процедура, выводящая содержимое динамического массива в окно вывода; элементы при выводе разделяются строкой delim;
Println(delim)- процедура, выводящая содержимое динамического массива в окно вывода и переводящая курсор на следующую строку; элементы при выводе разделяются строкой delim;
LoadFromFile(name) - процедура, загружающая содержимое динамического массива из файла с именем name (пока только для StringArray);
SaveToFile(name) - процедура, загружающая содержимое динамического массива из файла с именем name (пока только для StringArray);
ForEach(p) - процедура, вызывающая процедуру p для каждого элемента массива.

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


Интерфейс класса IntArray

IntArray=class
constructor Create;
constructor Create(n: integer);
destructor Destroy;
procedure Put(ind,v: integer);
function Get(ind: integer): integer;
property Items[n: integer]: integer
read Get write Put;
function Size: integer;
function Count: integer;
procedure Resize(n: integer);
procedure Add(v: integer);
procedure Fill(v: integer);
procedure Clear;
procedure Insert(ind,v: integer);
procedure Delete(ind: integer);
procedure Remove(v: integer);
procedure Exchange(i1,i2: integer);
function IndexOf(v: integer): integer;
function LastIndexOf(v: integer): integer;
function Find(v: integer): boolean;
function MinElement: integer;
function MaxElement: integer;
function MinInd: integer;
function MaxInd: integer;
procedure Sort;
procedure Reverse;
function Sum: integer;
function Average: real;
procedure Print;
procedure Println;
procedure Print(delim: string);
procedure Println(delim: string);
end;

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


Интерфейс класса RealArray

RealArray=class
constructor Create;
constructor Create(n: integer);
destructor Destroy;
procedure Put(ind: integer; v: real);
function Get(ind: integer): real;
property Items[n: integer]: real read
Get write Put;
function Size: integer;
function Count: integer;
procedure Resize(n: integer);
procedure Add(v: real);
procedure Fill(v: real);
procedure Clear;
procedure Insert(ind: integer; v: real);
procedure Delete(ind: integer);
procedure Remove(v: real);
procedure Exchange(i1,i2: integer);
function IndexOf(v: real): integer;
function LastIndexOf(v: real): integer;
function Find(v: real): boolean;
function MinElement: real;
function MaxElement: real;
function MinInd: integer;
function MaxInd: integer;
procedure Sort;
procedure Reverse;
function Sum: real;
function Average: real;
procedure Print;
procedure Println;
procedure Print(delim: string);
procedure Println(delim: string);
end;

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


Интерфейс класса StringArray

StringArray=class(StringArrayBase)
// методы, унаследованные от
StringArrayBase
constructor Create;
constructor Create(n: integer);
destructor Destroy;
procedure Put(ind: integer; v: string);
function Get(ind: integer): string;
property Items[n: integer]: string read Get write
Put;
function Size: integer;
function Count: integer;
procedure Resize(n: integer);
procedure Add(v: string);
procedure Fill(v: string);
procedure Clear;
procedure Insert(ind: integer; v: string);
procedure Delete(ind: integer);
procedure Remove(v: string);
procedure Exchange(i1,i2: integer);
function IndexOf(v: string): integer;
function LastIndexOf(v: string): integer;
function Find(v: string): boolean;
function MinElement: string;
function MaxElement: string;
function MinInd: integer;
function MaxInd: integer;
procedure Sort;
procedure Reverse;
procedure Print;
procedure Println;
procedure Print(delim: string);
procedure Println(delim: string);
procedure LoadFromFile(name: string);
procedure SaveToFile(name: string);
// дополнительные методы StringArray
procedure foreach(p: procedure(var
s: string));
end;

Класс StringArrayBase является вспомогательным и используется в модуле VCL в качестве типа свойств, представляющих массивы строк. Он содержит подмножество методов класса StringArray до методов LoadFromFile и SaveToFile включительно.

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


Интерфейс класса ObjectArray

ObjectArray=class
OwnsObjects: boolean;
constructor Create;
constructor Create(n: integer);
destructor Destroy;
procedure Put(ind: integer; v: Object);
function Get(ind: integer): Object;
property Items[n: integer]: Object read Get write
Put;
function Size: integer;
function Count: integer;
procedure Resize(n: integer);
procedure Add(v: Object);
procedure Fill(v: Object);
procedure Clear;
procedure Insert(ind: integer; v: Object);
procedure Delete(ind: integer);
procedure Remove(v: Object);
procedure Exchange(i1,i2: integer);
function IndexOf(v: Object): integer;
function LastIndexOf(v: Object): integer;
function Find(v: Object): boolean;
procedure Sort(Less: function(o1,o2: Object): boolean);
procedure Reverse;
procedure Print;
procedure Println;
procedure Print(delim: string);
procedure Println(delim: string);
end;

Если динамический массив владеет своими элементами, то он вызывает деструкторы элементов при выполнении методов Put, Remove, Fill, Delete, Clear и Destroy.

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

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

В метод Sort передается функция сравнения двух элементов function(o1,o2: Object): boolean, которая возвращает True, если первый элемент o1 меньше второго o2.

Пример использования метода Sort класса ObjectArray


Стеки

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

Поскольку элемент, вставленный последним, при извлечении из стека обрабатывается первым, то говорят, что стек устроен по принципу "последним вошел - первым вышел" (LIFO - Last In First Out).

Стеки представлены в модуле Containers классами IntStack, RealStack, StringStack и ObjectStack.

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

Create - конструктор; создает пустой стек;
Destroy - деструктор;
Push(i) - процедура, помещающая в стек элемент i;
Pop - функция, возвращающая элемент на вершине стека и удаляющая его из стека;
Top - функция, возвращающая элемент на вершине стека;
IsEmpty - функция, возвращающая True или False в зависимости от того, пуст ли стек;


Интерфейс класса IntStack

IntStack=class
  constructor Create;
  destructor Destroy;
  procedure Push(i: integer);
  function Pop: integer;
  function Top: integer;
  function IsEmpty: boolean;
end;

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


Интерфейс класса RealStack

RealStack=class
  constructor Create;
  destructor Destroy;
  procedure Push(r: real);
  function Pop: real;
  function Top: real;
  function IsEmpty: boolean;
end;

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


Интерфейс класса StringStack

StringStack=class
  constructor Create;
  destructor Destroy;
  procedure Push(s: Object);
  function Pop: Object;
  function Top: Object;
  function IsEmpty: boolean;
end;

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


Интерфейс класса ObjectStack

ObjectStack=class
  constructor Create;
  destructor Destroy;
  procedure Push(s: string);
  function Pop: string;
  function Top: string;
  function IsEmpty: boolean;
end;

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


Очереди

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

Поскольку элемент, вставленный первым, при извлечении из очереди также обрабатывается первым, то говорят, что очередь устроена по принципу "первым вошел - первым вышел" (FIFO - First In First Out).

Очереди представлены в модуле Containers классами IntQueue, RealQueue, StringQueue и ObjectQueue.

Далее приводятся методы классов очередей и их назначение.

Create - конструктор; создает пустую очередь;
Destroy - деструктор;
Push(i) - процедура, помещающая в очередь элемент i;
Pop - функция, возвращающая элемент в голове очереди и удаляющая его из стека;
First - функция, возвращающая элемент в голове очереди;
Last - функция, возвращающая элемент в хвосте очереди;
IsEmpty - функция, возвращающая True или False в зависимости от того, пуста ли очередь;


Интерфейс класса IntQueue

IntQueue=class
  constructor Create;
  destructor Destroy;
  procedure Push(i: integer);
  function Pop: integer;
  function First: integer;
  function Last: integer;
  function IsEmpty: boolean;
end;

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


Интерфейс класса RealQueue

RealQueue=class
  constructor Create;
  destructor Destroy;
  procedure Push(r: real);
  function Pop: real;
  function First: real;
  function Last: real;
  function IsEmpty: boolean;
end;

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


Интерфейс класса StringQueue

StringQueue=class
  constructor Create;
  destructor Destroy;
  procedure Push(s: string);
  function Pop: string;
  function First: string;
  function Last: string;
  function IsEmpty: boolean;
end;

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


Интерфейс класса ObjectQueue

ObjectQueue=class
  constructor Create;
  destructor Destroy;
  procedure Push(s: Object);
  function Pop: Object;
  function First: Object;
  function Last: Object;
  function IsEmpty: boolean;
end;

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


Множества

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

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

Множества, представленные в модуле Containers классами IntSet, RealSet, StringSet и ObjectSet, реализованы на базе бинарного дерева, поэтому могут содержать неограниченное число элементов. При этом элементы множества могут быть вещественными, строковыми и вообще представлять собой произвольные объекты.

Далее приводятся методы классов множеств и их назначение.

Create - конструктор; создает пустое множество;
Destroy - деструктор;
Include(i) - процедура, вставляющая во множество элемент i; внутренний указатель при этом переводится на вставленный элемент;
Exclude(i) - процедура, удаляющая элемент i из множества; внутренний указатель при этом становится недействительным;
Find(i) - функция, возвращающая True если элемент принадлежит множеству и False в противном случае; внутренний указатель при этом переводится на найденный элемент, а если элемент не найден, то внутренний указатель получает значение nil;
Delete(i) - процедура, удаляющая элемент i из множества (синоним Exclude(i));
First и Last - функции, возвращающие соответственно первый и последний элементы множества;
Clear - процедура, делающая множество пустым;
IsEmpty - функция, возвращающая True, если множество пустое;
Count - функция, возвращающая количество элементов во множестве;
Union(s1,s2) - процедура, вычисляющая объединение множеств s1 и s2 и записывающая результат в текущее множество;
Intersect(s1,s2) - процедура, вычисляющая пересечение множеств s1 и s2 и записывающая результат в текущее множество;
Difference(s1,s2) - процедура, вычисляющая разность множеств s1 и s2 и записывающая результат в текущее множество;
Embed(s) - функция, возвращающая True, если множество содержится во множестве s, и False в противном случае;
Print - процедура, выводящая содержимое множества в окно вывода; элементы при выводе разделяются символом пробела;
Println - процедура, выводящая содержимое множества в окно вывода и переводящая курсор на следующую строку; элементы при выводе разделяются символом пробела;
Print(delim)- процедура, выводящая содержимое множества в окно вывода; элементы при выводе разделяются строкой delim;
Println(delim)- процедура, выводящая содержимое множества в окно вывода и переводящая курсор на следующую строку; элементы при выводе разделяются строкой delim.

Группа методов, приведенных ниже, позволяет делать итерацию по множеству с помощью внутреннего итератора (указателя):

Reset, MoveFirst - процедуры, переводящие внутренний указатель множества на первый элемент;
MoveLast - процедура, переводящая внутренний указатель множества на последний элемент;
Next - процедура, переводящая внутренний указатель множества на следующий элемент;
Prev - процедура, переводящая внутренний указатель множества на предыдущий элемент;
Current - функция, возвращающая значение текущего элемента множества;
Eos - функция, возвращающая True, если внутренний указатель множества имеет значение nil (это означает, что все элементы множества просмотрены).

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


Интерфейс класса IntSet

IntSet=class
  constructor Create;
  destructor Destroy;
  procedure Include(i: integer);
  procedure Exclude(i: integer);
  function Find(i: integer): boolean;
  procedure Delete(i: integer);
  procedure Reset;
  procedure MoveFirst;
  procedure MoveLast;
  procedure Next;
  procedure Prev;
  function Current: integer;
  function Eos: boolean;
  function First: integer;
  function Last: integer;
  procedure Clear;
  procedure Union(s1,s2: IntSet);
  procedure Intersect(s1,s2: IntSet);
  procedure Difference(s1,s2: IntSet);
  function Embed(s: IntSet): boolean;
  function Count: integer;
  function IsEmpty: boolean;
  procedure Print;
  procedure Println;
  procedure Print(delim: string);
  procedure Println(delim: string);
end;

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


Интерфейс класса RealSet

RealSet=class
  constructor Create;
  destructor Destroy;
  procedure Include(r: real);
  procedure Exclude(r: real);
  function Find(r: real): boolean;
  procedure Delete(r: real);
  procedure Reset;
  procedure MoveFirst;
  procedure MoveLast;
  procedure Next;
  procedure Prev;
  function Current: real;
  function Eos: boolean;
  function First: real;
  function Last: real;
  procedure Clear;
  procedure Union(s1,s2: RealSet);
  procedure Intersect(s1,s2: RealSet);
  procedure Difference(s1,s2: RealSet);
  function Embed(s: RealSet): boolean;
  function Count: integer;
  function IsEmpty: boolean;
  procedure Print;
  procedure Println;
  procedure Print(delim: string);
  procedure Println(delim: string);
end;

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


Интерфейс класса StringSet

StringSet=class
  constructor Create;
  destructor Destroy;
  procedure Include(s: string);
  procedure Exclude(s: string);
  function Find(s: string): boolean;
  procedure Delete(s: string);
  procedure Reset;
  procedure MoveFirst;
  procedure MoveLast;
  procedure Next;
  procedure Prev;
  function Current: string;
  function Eos: boolean;
  function First: string;
  function Last: string;
  procedure Clear;
  procedure Union(s1,s2: StringSet);
  procedure Intersect(s1,s2: StringSet);
  procedure Difference(s1,s2: StringSet);
  function Embed(s: StringSet): boolean;
  function Count: integer;
  function IsEmpty: boolean;
  procedure Print;
  procedure Println;
  procedure Print(delim: string);
  procedure Println(delim: string);
end;

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


Интерфейс класса ObjectSet

ObjectSet=class
  OwnsObjects: boolean;
  constructor Create;
  destructor Destroy;
  procedure Include(o: Object);
  procedure Exclude(o: Object);
  function Find(o: Object): boolean;
  procedure Delete(o: Object);
  procedure Reset;
  procedure MoveFirst;
  procedure MoveLast;
  procedure Next;
  procedure Prev;
  function Current: Object;
  function Eos: boolean;
  function First: Object;
  function Last: Object;
  procedure Clear;
  procedure Union(s1,s2: ObjectSet);
  procedure Intersect(s1,s2: ObjectSet);
  procedure Difference(s1,s2: ObjectSet);
  function Embed(s: ObjectSet): boolean;
  function Count: integer;
  function IsEmpty: boolean;
  procedure Print;
  procedure Println;
  procedure Print(delim: string);
  procedure Println(delim: string);
end;

Если множество владеет своими элементами, то оно вызывает деструкторы элементов при выполнении методов Delete, Clear и Destroy.

При выводе множества объектов с использованием методов Print следует обязательно переопределить метод ToString для каждого типа объекта, входящего во множество.

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


Модули для создания проверяемых заданий: обзор

В системе Pascal ABC можно создавать проверяемые задания для электронного задачника Programming Taskbook, а также для исполнителей Робот и Чертежник.

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

(1) модуль с заданиями должен размещаться в каталоге Units\Tasks системного каталога Pascal ABC;

(2) первая строка (заголовок) данного модуля должна иметь специальный формат:

//PT4LoadInfo//имя_секции==имя_группы|описание|число_задач

При этом раздел имя_секции должен быть пустым при составлении заданий для электронного задачника, для исполнителя Робот он должен содержать текст RB, а для исполнителя Чертежник — DM. Раздел имя_группы должен содержать максимум 5 символов для исполнителей и максимум 7 символов для электронного задачника.

Приведем примеры заголовков:

//PT4LoadInfo//==Beg|Ввод и вывод данных, оператор присваивания|3

//PT4LoadInfo//==PTTasks|Все стандартные задания из задачника PT4|999

//PT4LoadInfo//RB==myc|Мои задания на циклы для Робота|10

//PT4LoadInfo//DM==mypp|Мои задания на процедуры с параметрами для Чертежника|20

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

Следущие темы раскрывают процесс создания заданий:

Модуль RobotMake

Модуль DrawManMake

Модуль PT4Make

Создание заданий для исполнителя Робот

Создание заданий для исполнителя Чертежник

Создание заданий для электронного задачника

Шифрование текстов заданий


Модуль RobotMake

Типы модуля RobotMake

type TInitTaskProc = procedure(n: integer);

Тип процедуры, генерирующей задание с номером n из группы, указанной в вызове процедуры AddGroup.

Процедуры модуля RobotMake

procedure RobotField(szx,szy: integer);

Задает поле Робота размера szx на szy клеток.

procedure HorizontalWall(x,y,len: integer);

Создает горизонтальную стену длины len и координатами левого верхнего угла (x, y).

procedure VerticalWall(x,y,len: integer);

Создает вертикальную стену длины len и координатами левого верхнего угла (x, y).

procedure RobotBegin(x,y: integer);

Задает начальное положение Робота в клетке с координатами (x, y).

procedure RobotEnd(x,y: integer);

Задает конечное положение Робота в клетке с координатами (x, y).

procedure RobotBeginEnd(x,y,x1,y1: integer);

Задает начальное положение Робота в клетке с координатами (x, y) и конечное в клетке с координатами (x1, y1).

procedure Tag(x,y: integer);

Помечает клетку (x, y) для закрашивания.

procedure TagRect(x,y,x1,y1: integer);

Помечает прямоугольник из клеток, задаваемый координатами противоположных вершин прямоугольника (x, y) и (x1, y1), для закрашивания.

procedure MarkPainted(x,y: integer);

Закрашивает клетку (x, y) (в задании некоторые клетки могут быть уже закрашены).

procedure TaskText(s: string);

Задает формулировку текста задания в строке s.

procedure AddGroup(name: string; count: integer; p: TInitTaskProc);

Регистрирует новую группу заданий для исполнителя Робот с именем name, количеством count, указывая p в качестве процедуры постановки заданий. При вызове процедуры Task из основной программы для исполнителя Робот вначале вызывается процедура p с указанным номером задания. Например, если группа заданий была подключена вызовом

AddGroup('mypp',15,MyPPProc);

то при вызове Task('RBmypp7') вначале вызывается процедура MyPPProc(), генерирующая задание с номером 7 из группы mypp.


Модуль DrawManMake

Типы модуля DrawManMake

type TInitTaskProc = procedure(n: integer);

Тип процедуры, генерирующей задание с номером n из группы, указанной в вызове процедуры AddGroup.

Процедуры модуля DrawManMake

procedure DrawManField(szx,szy: integer);

Задает поле Чертежника размера szx на szy клеток.

procedure DoToPoint(x,y: integer);

Перемещает перо Чертежника-постановщика заданий в точку с координатами (x, y).

procedure DoOnVector(dx,dy: integer);

Перемещает перо Чертежника-постановщика заданий в точку с координатами (x, y).

procedure DoPenUp;

Поднимает перо Чертежника-постановщика заданий.

procedure DoPenDown;

Опускает перо Чертежника-постановщика заданий.

procedure TaskText(s: string);

Задает формулировку текста задания в строке s.

procedure AddGroup(name: string; count: integer; p: TInitTaskProc);

Регистрирует новую группу заданий для исполнителя Чертежник с именем name, количеством count, указывая p в качестве процедуры постановки заданий. При вызове процедуры Task из основной программы для исполнителя Чертежник вначале вызывается процедура p с указанным номером задания. Например, если группа заданий была подключена вызовом

AddGroup('mypp',15,MyPPProc);

то при вызове Task('DMmypp7') вначале вызывается процедура MyPPProc(), генерирующая задание с номером 7 из группы mypp.


Модуль PT4Make

Константы и типы модуля PT4Make

type TInitTaskProc = procedure(n: integer);

Тип процедуры, генерирующей задание с номером n из группы, указанной в вызове функции AddGroup.

const
  xCenter = 0;
  xLeft   = 100;
  xRight  = 200;

Константы, отвечающие за выравнивание данных по горизонтали: константа xCenter центрирует текст, связанный с элементом данных, относительно всей экранной строки, константы xLeft и xRight центрируют текст в пределах левой и правой половины экранной строки соответственно. Используются в качестве параметра X в процедурах групп Data и Result.

Процедуры и функции модуля PT4Make

function AddGroup(GroupName, GroupDescription, GroupAuthor, GroupKey: string; TaskCount: integer; InitTaskProc: TInitTaskProc): integer;

Функция, добавляющая новую группу заданий. Параметры: GroupName - имя группы, содержит от 1 до 7 латинских букв или знаков подчеркивания, GroupAuthor - автор группы заданий, GroupKey - текстовый ключ, позволяющий в файле результатов идентифицировать задания, относящиеся к данной группе (может быть пустым), TaskCount - количество заданий в группе, InitTaskProc - процедурная переменная, в которую передается процедура с одним целым параметром типа integer, обеспечивающая постановку всех заданий данной группы. Функция возвращает 0 при успешном подключении группы к задачнику, в противном случае возвращает код ошибки.

procedure StartTask(SubgroupDescription: string);

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

procedure TaskText(S: string; X, Y: Byte);

Данная процедура добавляет к формулировке задания строку S, которая располагается в строке Y (от 1 до 5) раздела формулировки задания, начиная с позиции X (если X равен 0, то строка центрируется). Следует заметить, что имеется возможность добавлять к формулировке более 5 строк; для этого все строки с номерами, большими 5, должны добавляться к формулировке последовательно, причем параметр Y для таких строк надо положить равным 0.

procedure DataB (Cmt: string; B:
    Boolean; X, Y: Byte);
procedure DataN (Cmt: string; N: Integer; X, Y, F1: Byte);
procedure DataN2(Cmt: string; N1, N2: Integer; X, Y, F1:
    Byte);
procedure DataN3(Cmt: string; N1, N2, N3: Integer; X, Y, F1:
    Byte);
procedure DataR (Cmt: string; R: Real; X, Y, F1: Byte);
procedure DataR2(Cmt: string; R1, R2: Real; X, Y, F1: Byte);
procedure DataR3(Cmt: string; R1, R2, R3: Real; X, Y, F1:
    Byte);
procedure DataC (Cmt: string; C: Char; X, Y: Byte);
procedure DataS (Cmt: string; S: string; X, Y: Byte);

Процедуры данной группы добавляют к заданию элементы исходных данных. Добавленные элементы, вместе со строкой-комментарием Cmt, отображаются в разделе исходных данных, начиная с позиции X строки Y (от 1 до 5). Параметр X может принимать три особых значения: 0 (центрирование по горизонтали относительно всей экранной строки), 100 (центрирование по горизонтали относительно левой половины экранной строки ), 200 (центрирование по горизонтали относительно правой половины экранной строки ). Эти значения задаются также константами xCenter, xLeft и xRight.

Параметр F1 определяет ширину поля вывода для числовых данных (выравнивание производится по правому краю поля вывода). Для нечисловых данных поле вывода полагается равным фактической ширине данных.

procedure DataComment(Cmt: string; X, Y: Byte);

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

procedure ResultB (Cmt: string; B:
    Boolean; X, Y: Byte);
procedure ResultN (Cmt: string; N: Integer; X, Y, F1: Byte);
procedure ResultN2(Cmt: string; N1, N2: Integer; X, Y, F1: Byte);
procedure ResultN3(Cmt: string; N1, N2, N3: Integer; X, Y, F1:
    Byte);
procedure ResultR (Cmt: string; R: Real; X, Y, F1: Byte);
procedure ResultR2(Cmt: string; R1, R2: Real; X, Y, F1: Byte);
procedure ResultR3(Cmt: string; R1, R2, R3: Real; X, Y, F1:
    Byte);
procedure ResultC (Cmt: string; C: Char; X, Y: Byte);
procedure ResultS (Cmt: string; S: string; X, Y: Byte);

Процедуры данной группы добавляют к заданию элементы результирующих данных вместе с их контрольными значениями. Комментарии Cmt к результирующим данным сразу отображаются в разделе результатов. Контрольные значения отображаются в разделе «Пример верного решения». Назначение параметров X, Y и F1 — то же, что и для процедур группы Data.

procedure ResultComment(Cmt: string; X, Y: Byte);

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

procedure SetPrecision(N: Byte);

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

procedure SetNumberOfUsedData(N: Byte);

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

procedure SetNumberOfTests(N: Byte);

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

function Center(J,N,K,R: Byte): Byte;

Вспомогательная функция, которая позволяет размещать по центру экранной строки набор из N элементов данных одинаковой ширины. Эта функция возвращает горизонтальную координату, начиная с которой следует выводить J-й элемент набора (J меняется от 1 до N) при условии, что ширина каждого элемента равна K позициям, а между элементами надо указывать по R пробелов. Функция Center используется в качестве параметра X в процедурах групп Data и Result.

Работа с файлами

Имеется возможность включения в каждое учебное задание (в качестве исходных или результирующих данных) до 10 файлов. Кроме текстовых файлов (описатель text) в заданиях можно использовать типизированные файлы, содержащие элементы типа integer, real, double, char, string. Суммарное количество элементов всех используемых в задании файлов не должно превышать 1000 (под элементами текстовых файлов понимаются текстовые строки). Для корректного отображения на экране, а также для правильной проверки результирующих файлов необходимо, чтобы строки в файлах типа file of string и text состояли из не более чем 70 символов.

Процедуры, связанные в файлами, предназначены для использования на этапе формирования учебного задания. Их можно разбить на три группы: 1) процедуры группы dataFile, определяющие исходные файлы; 2) процедуры группы resultFile, определяющие результирующие файлы; 3) процедуры–настройки noEraseNextFile и setFileItemsInLine, влияющие на процесс обработки файлов при формировании задания и на их отображение при выполнении задания. Все эти процедуры следует вызывать после вызова процедуры StartTask.

procedure dataFileN(dataFName:
    string; y,len:byte);
procedure dataFileR(dataFName: string;
    y,len:byte);
procedure dataFileD(dataFName: string;
    y,len:byte);
procedure dataFileC(dataFName: string;
    y,len:byte);
procedure dataFileS(dataFName: string;
    y,len:byte);
procedure dataFileT(dataFName: string;
    y1,y2:byte);

Процедуры dataFile#, где на месте # может стоять N, R, D, C, S, T, позволяют включить в задание в качестве исходного файла один файл типа file of integer, file of real, file of double, file of char, file of string, text соответственно. К моменту вызова процедуры файл, включаемый в задание, должен быть создан, заполнен исходными данными и закрыт. Имя этого файла передается параметром dataFName.

Два других параметра имеют разный смысл для процедур, обрабатывающих типизированные файлы, и для процедуры dataFileT, обрабатывающей текстовые файлы. Для процедур, связанных с типизированными файлами, параметр y указывает номер экранной строки в области исходных данных, в которой будут отображаться элементы данного файла, а параметр len указывает количество позиций, отводимых под отображение одного элемента файла. Если фактическая длина элемента файла оказывается меньше параметра len, то изображение элемента дополняется пробелами; если длина элемента файла окажется больше значения len, то его «выступающая» правая часть будет «скрыта» за изображением следующего элемента файла. При определении параметра len необходимо предусматривать дополнительные позиции для пробелов, служащих разделителями элементов на экране, а в случае строковых и символьных файлов — для апострофов, автоматически добавляемых к каждому элементу при его отображении на экране. Способ отображения вещественных чисел устанавливается, как и для обычных исходных данных, процедурой setPrecision (см. выше); по умолчанию вещественные числа отображаются в формате с фиксированной точкой с двумя знаками в дробной части. Количество элементов, отображаемых на экране, определяется автоматически так, чтобы заполнить по возможности всю строку. Однако при желании это количество можно указать явно с помощью процедуры setFileItemsInLine (см. далее). Отметим, что независимо от количества отображаемых на экранной строке файловых элементов, она целиком отводится под данный файл, и поэтому никакие другие исходные данные на этой строке размещать нельзя.

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

Параметры y, y1, y2 должны принимать значения от 1 до 5 (y и y1 могут также принимать значение 0; этот случай описан в конце данного пункта); значение y1 не должно превышать значение y2. Параметр len должен лежать в диапазоне 1..72.

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

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

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

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

procedure resultFileN(resFName:
    string; y,len:byte);
procedure resultFileR(resFName: string;
    y,len:byte);
procedure resultFileD(resFName: string;
    y,len:byte);
procedure resultFileC(resFName: string;
    y,len:byte);
procedure resultFileS(resFName: string;
    y,len:byte);
procedure resultFileT(resFName: string;
    y1,y2:byte);

Процедуры resultFile#, где на месте # может стоять N, R, D, C, S, T, позволяют включить в задание в качестве результирующего файла один файл типа file of integer, file of real, file of double, file of char, file of string, text соответственно. К моменту вызова процедуры файл, включаемый в задание, должен быть создан, заполнен контрольными данными и закрыт. Под контрольными данными понимаются, как обычно, данные, которые должны содержаться в результирующем файле в случае правильного решения задания.

Смысл параметров процедур группы resultFile совпадает со смыслом соответствующих параметров процедур группы dataFile, за исключением того, что теперь номера экранных строк y, y1, y2 относятся к области результирующих данных. Ограничения на параметры для процедур группы resultFile накладываются те же, что и для процедур группы dataFile.

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

В некоторых ситуациях автоматическое удаление контрольного файла сразу после выполнения процедуры resultFile# оказывается нежелательным (например, если данный файл после переименования и небольшой модификации можно использовать в качестве исходного или другого контрольного файла). Для отмены автоматического удаления контрольного файла предусмотрена процедура noEraseNextFile (п.1.4). Подчеркнем, что после завершения формирования задания все контрольные файлы должны быть обязательно удалены с диска, так как в противном случае они будут в дальнейшем, при выполнении этого задания, приняты за «настоящие» результирующие файлы, созданные самим учащимся.

Как и в случае процедур группы dataFile, отображение некоторых результирующих файлов можно отключить, положив в соответствующих процедурах resultFile# значения параметров y или y1 равными 0. Это, естественно, не отменит сравнения содержимого результирующих файлов с контрольными данными и удаления результирующих файлов при завершении программы. Впрочем, необходимость в отключении отображения содержимого результирующих файлов возникает крайне редко.

procedure noEraseNextFile;

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

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

Как уже было отмечено при описании процедур групп dataFile и resultFile, ситуации, в которых может понадобиться процедура noEraseNextFile, достаточно редки: для исходного файла это оправдано, если он используется при всех тестовых испытаниях задания, а для контрольного файла — если его после переименования и небольшой модификации можно использовать в качестве исходного или другого контрольного файла.

procedure setFileItemsInLine(n: byte);

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

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

Работа с указателями

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

type
  PNode = ^TNode;
  TNode = record
    data : integer;
    next : PNode;
    prev : PNode;
  end;

Этот тип позволяет формировать одно- и двусвязные динамические структуры. Поскольку абсолютное значение указателя не представляет интереса (и, кроме того, может изменяться от запуска к запуску учебного задания), на экране отображается не оно, а условное обозначение указателя: «ptr», снабженное обязательным комментарием, например: P1 = ptr, PA = ptr и т.д. Допустимыми являются номера от 0 до 35; таким образом, учебное задание может содержать до 36 конкретных указателей. Указатели с номерами от 0 до 9 имеют комментарии с цифровым символом (P0 – P9), а указатели с номерами от 10 до 35 — с буквенным (PA – PZ). Если некоторый указатель имеет значение nil, то вместо текста «ptr» отображается текст «nil» (P1 = nil). Комментарий к указателю также

procedure setPointer(np: byte; p: PNode);

Данная процедура позволяет определить в учебном задании указатель под номером np (значение данного указателя при проектировании задания будет равно p, однако при выполнении задания оно может измениться). Все прочие процедуры, связанные с этим указателем, используют не его конкретное значение, а номер np. Номер np должен лежать в диапазоне от 0 до 35; он указывается в обязательном комментарии к данному указателю (см. выше). Если процедура setPointer для указателя с номером n не вызвана, то данный указатель имеет по умолчанию значение nil.

procedure dataP(cmt: string; np: byte; x,y: byte);
procedure resultP(cmt: string; np: byte; x,y: byte);

Эти процедуры помещают указатель с номером np в список исходных или, соответственно, результирующих данных учебного задания и отображают его на экране. При отображении на экране указатель снабжается обязательным комментарием вида «Pnp = », где в позиции np указывается символ, связываемый с указателем (для np от 0 до 9 — соответствующая цифра, для np от 10 до 35 — заглавная латинская буква); само значение указателя на экран не выводится; вместо него указывается одно из двух условных обозначений: ptr для ненулевого указателя и nil для нулевого указателя. Как и все прочие скалярные элементы, указатель может снабжаться дополнительным комментарием cmt: непустой дополнительный комментарий приписывается слева к обязательному (например, вызов процедуры с параметрами cmt = ‘Адрес начала стека: ’, np = 6 приведет к выводу на экран следующей строки: «Адрес начала стека: P6 = ptr»). В процедуре задается также экранная позиция, начиная с которой элемент данных выводится в соответствующую экранную область. Параметр y определяет номер строки (от 1 до 5), параметр x — позицию в строке (от 1 до 78; как обычно, требуется, чтобы элемент данных вместе с комментарием полностью умещался на строке).

procedure dataList(np: byte; x,y: byte);
procedure resultList(np: byte; x,y: byte);

Эти процедуры предназначены для помещения элемента данных типа «динамический список» в набор исходных или, соответственно, результирующих данных, а также для вывода этого элемента на экран. Параметр np задает номер указателя (предварительно определенный процедурой setPointer), который указывает на начало данного списка (то есть на его первый элемент). Если соответствующий указатель равен nil, то список считается пустым. Пустой список на экране не отображается. Элемент данных типа список должен содержать не более 14 элементов типа TNode, причем значения их полей data должны лежать в диапазоне от 10 до 99; в противном случае выдается сообщение об ошибке. Он отображается на двух экранных строках; в первой строке отображаются указатели, входящие в задание и связанные с данным списком (они задаются процедурой showPointer, описанной ниже), во второй строке — значения элементов списка (точнее, их полей data целого типа) и виды связи между элементами. Кроме того, специальные обозначения используются для циклического списка и для элементов результирующего списка, для создания которых при выполнении задания требуется выделить память явным образом (командой New). Приведем примеры:

procedure showPointer(np: byte);

Процедура обеспечивает отображение указателя с номером np при выводе текущего списка. Например, ее вызов вида showPointer(1) обеспечил отображение указателя P1 в примере 1. Если указатель номер np равен nil, то вызов процедуры showPointer игнорируется без вывода сообщения об ошибке. Если указатель номер np не является нулевым и не связан ни с одним из элементов списка (в частности, если он равен nil), то выводится сообщение об ошибке.

Как уже было отмечено, с одним элементом списка можно связать несколько указателей (не более трех для последнего элемента; не более двух для остальных). Порядок вызова процедур showPointer для одного и того же элемента списка является произвольным; при отображении указателей, связанных с одним и тем же элементом, они выводятся в отсортированном порядке (например, P3P6P9). Если количество указателей, связываемых процедурами showPointer с данным элементом, превосходит максимально допустимое (например, с последним элементом связывается 4 различных указателя), то список связанных указателей дополняется символом ошибки «*» (например, P3P6P9*). Символ ошибки выделяется красным цветом.

procedure setNewNode(nNode: byte);

Процедура определяет элемент списка с номером nNode (нумерация ведется от 1) как элемент, который требуется разместить в памяти с помощью процедуры New (подобные элементы выделяются в списке с помощью обрамляющих точек). Данная процедура может применяться только к результирующим спискам (то есть к спискам, которые включаются в задание процедурой resultList). Если результирующий список не содержит элемента с номером nNode, то выдается сообщение об ошибке.

Следует заметить также, что если указатель на элемент списка номер nNode требуется включить в задание (с помощью процедуры setPointer), то это необходимо сделать до вызова процедуры setNewNode.

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

procedure setDisposeNode(nNode : byte);

Процедура определяет элемент списка с номером nNode (нумерация ведется от 1), который требуется удалить из динамической памяти в ходе выполнения задания. Данная процедура может применятся только к исходным спискам (то есть к спискам, которые включаются в задание процедурой dataList). Если исходный список не содержит элемента с номером nNode, то выдается сообщение об ошибке.

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

Образцы слов и предложений

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

const SampleError = '#ERROR?';
MaxLinesCount = 50;
type TSampleLines = array [0..MaxLinesCount -
    1] of string;
function SampleWordCount: integer;     //115
function SampleSentenceCount: integer; //61
function SampleTextCount: integer;     //85
function SampleWord(n: integer): string;
function SampleSentence(n: integer): string;
procedure SampleText(n: integer; var LineCount:
    integer; var Lines: TSampleLines);

Функции, оканчивающиеся словом Count, возвращают количество соответствующих элементов данных. В настоящее время доступно 115 слов, 61 предложение и 85 текстов.

Функции SampleWord и SampleText возвращают соответственно слово или предложение с индексом n (индексирование проводится от 0). Если параметр n является недопустимым, то возвращается строка SampleError.

Процедура SampleText возвращает данные, связанные с текстом, имеющим индекс n (индексирование также проводится от 0): LineCount содержит количество строк в тексте, а сами строки содержатся в массиве Lines типа TSampleLines. Размер массива TSampleLines равен 50, что гарантированно превышает длину максимального текста. Заполняются начальные строки массива (с индексами от 0 до LineCount–1), завершающие строки содержат строку SampleError. Если параметр n указан неверно, то в переменной LineCount возвращается –1, а все элементы массива Lines содержат строку SampleError.

Документирование заданий

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

procedure AddCommentText(Cmt: string);

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

procedure UseCommentText(Group, Subgroup: string);

Данная процедура добавляет к описанию текст описания подгруппы Gubgroup группы Group (если имя подгруппы является пустой строкой, то добавляется описание самой группы Group). Это описание также отделяется от предыдущего описания пробелом. Регистр символов параметров Group и Subgroup может быть произвольным.

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

function SubgroupComment(SubgroupName: string): boolean;

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

procedure CloseGroup;

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

procedure MakeText(Name: string);

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

В качестве параметра Name можно указать либо имя конкретного задания, либо имя группы (без номера задания). При указании конкретного задания генерируется его текст, снабженный заголовком (именем темы и именем автора); при указании группы генерируется текст всех заданий, включенных в эту группу. Процедуру MakeText можно вызывать несколько раз, указывая различные значения параметра Name; в результате созданная html-страница будет содержать тексты всех заданий, указанных при различных запусках процедуры (в том же порядке).

Если при каком-либо вызове будет указано неверное имя группы или неверный номер задания в пределах группы, то выводится сообщение об ошибке, и html-страница не создается.

При успешной генерации html-страницы она сохраняется в файле со стандартным именем PT4Tasks.html в подкаталоге Units\Tasks системного каталога Pascal ABC. Если же такого каталога не существует, то страница сохраняется в рабочем каталоге приложения. Если в выбранном каталоге нельзя создать файл, то выводится сообщение об ошибке.

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


Создание заданий для исполнителя Робот

Опишем последовательность создания группы заданий для исполнителя Робот. Создадим модуль RobTasks.pas со следующим текстом:

unit RobTasks;

interface

uses RobotMake;

implementation

procedure FirstRob;
begin
  TaskText('Закрасить помеченные клетки');
  RobotField(10,6);
  HorizontalWall(0,3,4);
  VerticalWall(4,3,2);
  RobotBegin(1,4);
  VerticalWall(5,1,5);
  HorizontalWall(5,1,4);
  RobotEnd(6,2);
  Tag(6,2);
end;

procedure InitTask(num: integer);
begin
  case num of
1: FirstRob;
  end;
end;

begin
  AddGroup('MyRob', 3, InitTask);
end.

Наберем и запустим основную программу:

uses Robot, RobTasks;
begin
  Task('MyRob1');
end.

Будет выведено следующее задание для Робота:

Добавим задание, в котором конфигурация поля случайна:

procedure SecondRob;
var n,i: integer;
begin
  TaskText('Закрасить клетки под закрашенными');
  n:=Random(4)+7;
  RobotField(n,4);
  RobotBeginEnd(1,3,n,3);
  MarkPainted(n,2);
  Tag(n,3);
  for i:=2 to n-1 do
    if Random(3)=1 then
    begin
      MarkPainted(i,2);
      Tag(i,3);
    end;
end;

Внесем его вызов в процедуру InitTask:

procedure InitTask(num: integer);
begin
  case num of
1: FirstRob;
2: SecondRob;
  end;
end;

Изменим основную программу:

uses Robot, RobTasks;
begin
  Task('MyRob2');
end.

Задание для Робота будет иметь вид:

Чтобы мастер по созданию программ-заготовок "увидел" вновь созданный модуль, добавим в его начало строку

//PT4LoadInfo//RB==myrob|Мои задания для Робота|2

и скопируем модуль в каталог Units\Tasks системного каталога Pascal ABC. После перезагрузки Pascal ABC нажмем кнопку [image] и наберем префикс RB имени задания:

Красной стрелкой отмечена появившаяся группа заданий. Наберем далее myrob1:

После нажатия Enter в рабочем каталоге будет создан новый файл RBMyRob1.pas со следующим содержимым:

uses Robot, RobTasks;

begin
  Task('myrob1');

end.

Можно приступать к решению собственноручно разработанной задачи :)


Создание заданий для исполнителя Чертежник

Опишем последовательность создания группы заданий для исполнителя Чертежник. Создадим модуль DMTasks.pas со следующим текстом:

unit DMTasks;

interface

uses DrawManMake;

implementation

procedure FirstDM;
var i,a: integer;
begin
  TaskText('Начертите, используя цикл');
  DrawManField(14,8);
  DoToPoint(7,7);
  a:=6;
  for i:=1 to 6 do
  begin
    DoPenDown;
    DoOnVector(a,-a);
    DoOnVector(-a,a);
    DoOnVector(-a,-a);
    DoOnVector(a,a);
    Dec(a);
    DoPenUp;
    DoOnVector(0,-1);
  end;
end;

procedure InitTask(num: integer);
begin
  case num of
1: FirstDM;
  end;
end;

begin
  AddGroup('MyDM', 2, InitTask);
end.

Наберем и запустим основную программу:

uses DrawMan, DMTasks;
begin
  Task('MyDM1');
end.

Будет выведено следующее задание для Чертежника:

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

procedure SecondDM;
end;

Внесем его вызов в процедуру InitTask:

procedure InitTask(num: integer);
begin
  case num of
1: FirstDM;
2: SecondDM;
  end;
end;

Изменим основную программу:

uses DrawMan, DMTasks;
begin
  Task('MyDM2');
end.

Задание для Чертежника будет иметь вид:

Чтобы мастер по созданию программ-заготовок "увидел" вновь созданный модуль, добавим в его начало строку

//PT4LoadInfo//RB==mydm|Мои задания для Чертежника|2

и скопируем модуль в каталог Units\Tasks системного каталога Pascal ABC. После перезагрузки Pascal ABC нажмем кнопку [image] и наберем префикс DM имени задания:

Красной стрелкой отмечена появившаяся группа заданий. Наберем далее mydm1:

После нажатия Enter в рабочем каталоге будет создан новый файл DMMydm1.pas со следующим содержимым:

uses Drawman, DMTasks;

begin
  Task('mydm1');

end.

Можно попытаться решить :)


Создание заданий для электронного задачника

Опишем последовательность создания группы заданий для электронного задачника. Создадим модуль PTMini.pas со следующим текстом:

unit PTMini;

interface

uses pt4make;

implementation

procedure FirstMini;
var a,b: real;
begin
  StartTask;
  TaskText('Даны стороны прямоугольника~{a} и~{b}. ',0,2);
  TaskText('Найти его площадь~{S}~=~{a}\*{b} и\ периметр~{P}~=~2\*({a}\;+\;{b}).',0,4);
  a:=(1+Random(100))/10;
  b:=(1+Random(100))/10;
  DataR('a = ',a,xLeft,3,4);
  DataR('b = ',b,xRight,3,4);
  ResultR('S = ',a*b,0,2,4);
  ResultR('P = ',2*(a+b),0,4,4);
  SetNumberOfTests(3);
end;

procedure InitTask(num: integer);
begin
  case num of
1: FirstMini;
  end;
end;

begin
  AddGroup('PTMini', 'Mini: Разные задачи','С. С. Сергеев, 2006', 'qwqfsdf13dfttd', 3, InitTask);
end.

Наберем и запустим основную программу:

uses PT4,PTMini;

begin
  Task('PTMini1');
end.

Будет выведено следующее окно задачника:

Добавим задание на массивы:

procedure SecondMini;
var
  a: array [1..10] of real;
  i,n: integer;
begin
  StartTask;
  TaskText('Дан массив размера~{N}.',0,2);
  TaskText('Вывести его\ элементы в\ обратном порядке.',0,4);
  n:=Random(9)+2;
  for i:=1 to n do
    a[i]:=9.98*Random;
  DataN('N = ',n,0,2,1);
  for i:=1 to n do
    DataR('',a[i],center(i,n,5,2),4,5);
  for i:=1 to n do
    ResultR('',a[n+1-i],center(i,n,5,2),3,5);
  SetNumberOfTests(3);
end;

Внесем его вызов в процедуру InitTask:

procedure InitTask(num: integer);
begin
  case num of
1: FirstMini;
2: SecondMini;
  end;
end;

Изменим основную программу:

uses PT4,PTMini;

begin
  Task('PTMini2');
end.

Задание будет иметь вид:

Чтобы мастер по созданию программ-заготовок "увидел" вновь созданный модуль, добавим в его начало строку

//PT4LoadInfo//==PTMini|Разные задачи|2

и скопируем модуль в каталог Units\Tasks системного каталога Pascal ABC. После перезагрузки Pascal ABC нажмем кнопку [image] и наберем имя задания PTMini2 :

После нажатия Enter в рабочем каталоге будет создан новый файл RBMyRob1.pas со следующим содержимым:

uses PT4,PTMini;

begin
  Task('PTMini2');
end.

Можно приступать к решению :)


Модуль CRT

Модуль CRT предназначен для работы с текстовым окном. Он написан для совместимости с Turbo Pascal. В качестве текстового используется графическое окно модуля GraphABC, при этом запрещено изменение размеров окна и ввод/вывод осуществляется непосредственно в текстовом окне. В результате вывода может осуществляться скроллирование текстового экрана.

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

Константы и переменные модуля CRT

const
  Black=0; Blue=1; Green=2; Cyan=3;
  Red=4; Magenta=5; Brown=6; LightGray=7;
  DarkGray=8; LightBlue=9; LightGreen=10; LightCyan=11;
  LightRed=12; LightMagenta=13; Yellow=14; White=15;

Цветовые константы. Используются для задания цвета символов и цвета фона в процедурах TextColor и TextBackGround и при присваивании переменной TextAttr.

var TextAttr: byte;

Задает цвет символов и цвет фона одновременно. Первые 4 бита отводятся под цвет фона, последние 4 бита - под цвет символов.

Например, присваивание TextAttr:=16*Yellow+Red задает красный цвет символов на желтом фоне.

Процедуры и функции модуля CRT

function ReadKey: char;

Читает символ из буфера клавиатуры.

function KeyPressed: boolean;

Определяет, была ли нажата клавиша.

procedure GotoXY(x,y: integer);

Перемещает курсор в позицию (x,y).

function WhereX: integer;

Возвращает x-координату текущего положения курсора.

function WhereY: integer;

Возвращает y-координату текущего положения курсора.

procedure ClrScr;

Очищает цветом фона все текстовое окно или текущее окно, установленное процедурой window. Устанавливает курсор в левый верхний угол очищенного окна.

procedure Window(x1,y1,x2,y2: integer);

Определяет на экране текущее окно. Устанавливает курсор в левый верхний угол текущего окна

procedure ClrEol;

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

procedure DelLine;

Удаляет строку, содержащую курсор.

procedure InsLine;

Вставляет пустую строку в позиции курсора.

procedure Delay(ms: integer);

Осуществляет задержку на ms миллисекунд.

procedure TextColor(c: byte);

Устанавливает цвет символов.

procedure TextBackGround(c: byte);

Устанавливает цвет фона.

procedure LowVideo;

Включает низкую интенсивность символов.

procedure HighVideo;

Включает высокую интенсивность символов.

procedure HideCursor;

Скрывает текстовый курсор.

procedure ShowCursor;

Делает текстовый курсор видимым.

procedure CRTWindowSize(w,h: integer);

Устанавливает размер текстового окна в символах.

procedure TextSize(sz: integer);

Устанавливает размер символов в пунктах (по умолчанию 10 пунктов).

procedure TextNormal;

Устанавливает нормальный стиль символов.

procedure TextBold;

Устанавливает жирный стиль символов.

procedure ScrollingOff;

Отключает прокрутку при выводе.

procedure ScrollingOff;

Включает прокрутку при выводе.

procedure AssignCRT;

Ничего не делает. Оставлена для совместимости.

procedure Sound(hz: integer);

Ничего не делает. Оставлена для совместимости.

procedure NoSound;

Ничего не делает. Оставлена для совместимости.

procedure TextMode(i: integer);

Ничего не делает. Оставлена для совместимости.


Модуль Utils

Модуль Utils содержит различные вспомогательные процедуры и функции (работа с файлами и каталогами, с датой, форматирование строк и пр.). Ниже приводится интерфейс модуля Utils:

type
DateTime = record
Day, Month, Year, Hour, Minute, Second, Milliseconds:
    integer;
end;
LongSize = record
Megabytes, Bytes: integer;
end;
SearchRec  = record
name: string;
size: integer;
end;
function CreateDir(name: string): boolean;
function DeleteFile(name: string): boolean;
function DirectoryExists(name: string): boolean;
function GetCurrentDir: string;
function RemoveDir(name: string): boolean;
function RenameFile(OldName,NewName: string): boolean;
function SetCurrentDir(name: string): boolean;
procedure ChDir(name: string);
function Milliseconds: integer;
function CompileTime: integer;
function CurrentDateTime: DateTime;
function CompareMem(p1,p2: pointer; len: integer): boolean;
function DiskSize(Drive: integer): LongSize;
function DiskFree(Drive: integer): LongSize;
procedure ShowMessage(s: string);
function PascalABCPath: string;
procedure FreeAndNil(var
    o: Object);
procedure Move(p1,p2: pointer; size: integer);
function FindFirstFile(path: string; var sr: SearchRec):
    boolean;
function FindFirstDirectory(path: string; var sr:
    SearchRec): boolean;
function FindNext(var sr: SearchRec): boolean;
procedure FindClose(var sr: SearchRec);
function ExtractFileName(fname: string): string;
function ExtractFileExt(fname: string): string;
function ExtractFilePath(fname: string): string;
function ChangeFileExt(fname,ext: string): string;

CreateDir(name) - функция, создающая новый каталог с именем name и возвращающая True, если создание прошло успешно, и False в противном случае;

DeleteFile(name) - функция, удаляющая файл с именем name и возвращающая True, если удаление прошло успешно, и False в противном случае;

DirectoryExists(name) - функция, возвращающая True, если каталог с именем name существует, и False в противном случае;

GetCurrentDir - функция, возвращающая имя текущего каталога;

RemoveDir(name) - функция, удаляющая каталог с именем name и возвращающая True, если удаление прошло успешно, и False в противном случае;

RenameFile(OldName,NewName) - функция, переименовывающая файл с именем OldName в файл с именем NewName и возвращающая True, если создание прошло успешно, и False в противном случае;

SetCurrentDir(name) - функция, устанавливающая каталог с именем name текущим и возвращающая True, если текущий каталог был установлен, и False в противном случае;

ChDir(name) - процедура, меняющая текущий каталог на name;

Milliseconds - функция, возвращающая количество миллисекунд с момента начала выполнения программы;

CompileTime - функция, возвращающая количество миллисекунд, затраченное на компиляцию программы;

CurrentDateTime - функция, возвращающая текущие дату и время;

CompareMem(p1,p2,len) - функция, возвращающая True, если два участка памяти длины len байт, на которые указывают p1 и p2, идентичны, и False в противном случае;

DiskSize(Drive) - функция, возвращающая размер диска Drive (1 - диск A:, 2 - диск B:, 3 - диск C: и т.д.); если диск не существует, то в поле Megabytes возвращается 0, а в поле Bytes возвращается -1;

DiskFree(Drive) - функция, возвращающая размер свободного пространства на диске Drive.

PascalABCPath - функция, возвращающая полный путь к файлу PascalABC.exe.

ShowMessage(s) - процедура, показывающая окно с кнопкой OK и сообщением, задаваемым строкой s. Выполнение программы приостанавливается до нажатия кнопки OK.

FreeAndNil(o) - процедура, вызывающая деструктор объекта o в случае если o<>nil и присваивающая o значение nil.

FindFirstFile - функция, инициализирующая поиск файлов в каталоге path, помещающая в переменную sr первый найденный файл и возвращающая True, если поиск оказался успешным, и False в противном случае.

FindFirstDirectory - функция, инициализирующая поиск файлов в каталоге path, помещающая в переменную sr первый найденный каталог и возвращающая True, если поиск оказался успешным, и False в противном случае.

FindNext - функция, помещающая в переменную sr следующий найденный файл (если до этого вызвана функция FindFirstFile) или каталог (если до этого вызвана функция FindFirstDirectory), и возвращающая True, если поиск оказался успешным, и False в противном случае.

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

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

uses Utils;
var sr: SearchRec;
begin
  if FindFirstFile('*.*',sr) then
  begin
    writeln(sr.Name);
    while FindNext(sr) do
      writeln(sr.Name);
  end;
  FindClose(sr);
end.

ExtractFileName(fname) - функция, выделяющающая имя и расширение файла из полного имени файла.

ExtractFileExt(fname) - функция, выделяющающая расширение файла из полного имени файла.

ExtractFilePath(fname) - функция, выделяющающая путь из полного имени файла.

ChangeFileExt(fname,ext) - функция, заменяющающая расширение файла на ext.


Модуль Sounds

Модуль Sounds содержит процедуры и функции для работы со звуком:

n:=LoadSound(fname) – загружает звук из файла с именем fname в оперативную память и возвращает описатель звука в целую переменную n (звуковой файл должен иметь формат .wav);

PlaySound(n) – начинает проигрывание звука с описателем n;

StopSound(n) – останавливает проигрывание звука с описателем n;

RewindSound(n) – "перематывает" звук с описателем n на начало;

DestroySound(n) – удаляет звук с описателем n из оперативной памяти, описатель звука при этом становится недействительным;

SoundIsPlaying(n) – возвращает True если звук с описателем n проигрывается и False в противном случае;

SoundLength(n) – возвращает длительность звука с описателем n в миллисекундах.

Модуль Sounds содержит также класс Sound, имеющий следующий интефейс:

type
  Sound=class
  public
    constructor Create(fname: string);
    destructor Destroy;
    procedure Load(fname: string);
    procedure Play;
    procedure Stop;
    procedure Rewind;
    property IsPlaying: boolean;
    function Length: integer;
  end;

Конструкторы и деструкторы

constructor Create(fname: string);

Создает объект класса Sound и загружает в него звук из файла fname (звуковой файл должен иметь формат .wav). Звук с именем fname ищется вначале в текущем каталоге, а затем в подкаталоге Media\Sounds\ каталога программы PascalABC.exe.

destructor Destroy;

Разрушает объект и содержащийся в нем звук.

Свойства

property IsPlaying: boolean;

Проигрывается ли звук. Присваивание IsPlaying=False эквивалентно вызову Stop, а присваивание IsPlaying=True - вызову Play.

Методы

procedure Load(fname: string);

Загружает звук из файла с именем fname. Звук с именем fname ищется вначале в текущем каталоге, а затем в подкаталоге Media\Sounds\ каталога программы PascalABC.exe. Звук, до этого содержащийся в объекте, разрушается.

procedure Play;

Начинает проигрывание звука.

procedure Stop;

Останавливаетает проигрывание звука.

procedure Rewind;

"Перематывает" звук на начало.

function Length: integer;

Возвращает длительность звука в миллисекундах.

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

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

uses Sounds;

var n: integer;

begin
  n:=LoadSound('b.wav');
  PlaySound(n);
  Sleep(SoundTime(n));
  DestroySound(n);
end.

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

uses Sounds;

var s: Sound;

begin
  s:=Sound.Create('b.wav');
  s.Play;
  Sleep(s.Length);
  s.Destroy;
end.


Модуль Timers

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

Функция CreateTimer(ms,TimerProc) создает таймер, выполняющий каждые ms миллисекунд действие, содержащееся в процедуре без параметров TimerProc, и возвращает его целочисленный описатель. Созданный таймер сразу же запускается.

Функция CreateTimerExt(ms,TimerProcExt) создает таймер, выполняющий каждые ms миллисекунд действие, содержащееся в процедуре с одним целочисленнным параметром TimerProcExt, и возвращает его целочисленный описатель. Созданный таймер сразу же запускается. Целочисленный параметр, передаваемый процедуре TimerProcExt, хранит описатель таймера, вызвавшего эту процедуру.

Процедура StartTimer(n) запускает таймер с описателем n.

Процедура StopTimer(n) останавливает таймер с описателем n.

Процедура SetTimerInterval(n,ms) устанавливает у таймера с описателем n интервал в ms миллисекунд.

Функция TimerInterval(n) возвращает интервал у таймера с описателем n.

Функция TimerEnabled(n) возвращает True, если таймер запущен, и False в противном случае.

Процедура DestroyTimer(n) разрушает таймер с описателем n.

Модуль Timers содержит также класс Timer, имеющий следующий интефейс:

type
Timer=class
constructor Create(ms: integer; TimerProc:
    procedure);
destructor Destroy;
procedure Start;
procedure Stop;
property Enabled: boolean;
property Interval: integer;
function Handle: integer;
end;

Конструкторы и деструкторы

constructor Create(ms: integer; TimerProc: procedure);

Создает таймер, выполняющий каждые ms миллисекунд действие, содержащееся в процедуре без параметров TimerProc. Созданный таймер сразу же запускается.

constructor Create(ms: integer; TimerProc: procedure);

Создает таймер, выполняющий каждые ms миллисекунд действие, содержащееся в процедуре с одним целочисленнным параметром TimerProc. Созданный таймер сразу же запускается. Целочисленный параметр, передаваемый процедуре TimerProcExt, хранит описатель таймера, вызвавшего эту процедуру.

destructor Destroy;

Разрушает объект и содержащийся в нем таймер.

Свойства

property Enabled: boolean;

Запущен ли таймер. Присваивание Enabled=False эквивалентно вызову Stop, а присваивание Enabled=True - вызову Start.

Методы

procedure Start;

Запускает таймер.

procedure Stop;

Останавливаетает таймер.

function Handle: integer;

Возвращает описатель таймера.

Таймеры удобнее рассматривать как объекты класса Timer, в котором собраны все основные действия с таймерами. Такой подход является более удобным и современным, чем подход с описателями таймеров. Единственный его недостаток - необходимость вводить основные понятия, связанные с классами. Подход с описателями позволяет работать с таймерами сразу после рассмотрения темы "Процедуры и функции".

Пример 1

Вариант с описателем таймера

uses Timers,Events;

procedure TimerProc;
begin
  write(1);
end;

var t: integer;
begin
  t:=CreateTimer(200,TimerProc);
end.

Вариант с классом Timer

uses Timers,Events;

procedure TimerProc;
begin
  write(1);
end;

var t: Timer;
begin
  t:=Timer.Create(200,TimerProc);
end.

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

Пример 2

Вариант с описателем таймера

uses Timers, Events;

var t1,t2: integer;
procedure TimerProcExt(n: integer);
begin
  if n=t1 then
    write(1,' ')
  else write(2,' ');
end;

begin
  t1:=CreateTimerExt(200,TimerProcExt);
  t2:=CreateTimerExt(300,TimerProcExt);
end.

Вариант с классом Timer

uses Timers, Events;

var t1,t2: Timer;
procedure TimerProcExt(n: integer);
begin
  if n=t1.Handle then
    write(1,' ')
  else write(2,' ');
end;

begin
  t1:=Timer.Create(200,TimerProcExt);
  t2:=Timer.Create(300,TimerProcExt);
end.


Модуль PointRect

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

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

Point=record
  x,y: integer;
end;
Rect=record
  Left,Top,Right,Bottom: integer;
end;

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

function PointF(x,y: integer): Point;

Возвращает запись типа Point по координатам точки x, y.

function RectF(l,t,r,b: integer): Rect;

Возвращает запись типа Rect по координатам двух противоположных вершин прямоугольника (l,t) и (r,b).

function PtInRect(r: Rect; p: Point): boolean;

Возвращает True, если точка p находится внутри прямоугольника r, и False в противном случае.

function EqualRect(r1,r2: Rect): boolean;

Возвращает True, если прямоугольники r1 и r1 равны, и False в противном случае.

function IntersectRect(r1,r2: Rect): boolean;

Возвращает True, если прямоугольники r1 и r1 пересекаются, и False в противном случае.

procedure OffsetRect(var r: Rect; dx,dy: integer);

Сдвигает прямоугольник r на вектор (dx,dy);

procedure InflateRect(var r: Rect; n: integer);

"Надувает" прямоугольник r на n пикселей; если n отрицательно, то прямоугольник "сдувается".


События при использовании модуля GraphABC

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

uses GraphABC, Events;

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

OnMouseDown (нажатие мыши),
OnMouseUp (отпускание мыши),
OnMouseMove (перемещение мыши),
OnKeyDown (нажатие клавиши),
OnKeyUp (отпускание клавиши),
OnKeyPress (нажатие символьной клавиши),
OnResize (изменение размеров графического окна) и
OnClose (закрытие графического окна).

Переменные-события являются переменными процедурного типа, описанными в модуле Events следующим образом:

var
OnMouseDown, OnMouseUp, OnMouseMove: procedure (x,y,mousebutton:
    integer);
OnKeyDown, OnKeyUp: procedure (key: integer);
OnKeyPress: procedure (ch: char);
OnResize, OnClose: procedure;

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

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

Параметры x и y в обработчиках OnMouseDown, OnMouseUp и OnMouseMove определяют координаты курсора мыши в момент наступления события, параметр mousebutton равен 0, если кнопка мыши не нажата, 1, если нажата левая кнопка мыши, и 2, если нажата правая кнопка мыши. Параметр key в обработчиках OnKeyDown и OnKeyUp определяет виртуальный код нажатой клавиши. Параметр ch в обработчике OnKeyPress определяет нажатый символ.

Если переменная-событие OnKeyPress имеет обработчик, то графическое окно не закрывается по нажатию клавиши Esc.

Пример 1. Рисование мышью.

Пример 2. Движение графического окна с помощью клавиатуры.


Пример 1 событийной программы

Данная программа осуществляет рисование мышью в графическом окне:
uses GraphABC,Events;
procedure MouseDown(x,y,mb: integer);
begin
  MoveTo(x,y);
end;
procedure MouseMove(x,y,mb: integer);
begin
  if mb=1 then LineTo(x,y);
end;
begin
  OnMouseDown:=MouseDown;
  OnMouseMove:=MouseMove
end.


Пример 2 событийной программы

Данная программа осуществляет движение графического окна с помощью клавиатуры:
uses GraphABC,Events;
 procedure KeyDown(Key: integer);
 begin
   case Key of
  VK_Left: SetWindowLeft(WindowLeft-2);
  VK_Right: SetWindowLeft(WindowLeft+2);
  VK_Up: SetWindowTop(WindowTop-2);
  VK_Down: SetWindowTop(WindowTop+2);
   end;
 end;
begin
  OnKeyDown:=KeyDown;
end.


События при использовании модуля VCL

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

Рассмотрим пример простейшей программы Pascal ABC Forms.

uses VCL;

var
  MainForm: Form;
  B: Button;

procedure BClick;
begin
  MainForm.Close;
end;

begin
  MainForm:=Form.Create(100,100,300,200);
  MainForm.Caption:='Первое VCL-приложение';
  B:=Button.Create(100,60,100,25);
  B.Caption:='Нажми меня';
  B.OnClick:=BClick;
end.

Здесь с событием кнопки OnClick связывается обработчик BClick, представляющий собой процедуру без параметров. После завершения выполнения основного блока begin/end программа становится событийно управляемой и завершаются лишь после закрытия главной формы.


Что такое исполнители

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

Традиционно концепция исполнителей используется для быстрого обучения основным конструкциям языка программирования при проведении занятий в средних классах школы. В Pascal ABC реализованы исполнители Робот и Чертежник, описанные в учебнике А.Г. Кушниренко, Г.В.Лебедева и Я.Н.Зайдельмана "Информатика 7-9 классы", М., 2001 г.

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

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

Пример выполнения задания a1 для исполнителя Робот.


Исполнитель Робот

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

Исполнитель Робот и поле, на котором он работает, отображаются следующим образом:

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

Команды исполнителя Робот содержатся в модуле Robot:

Right – перемещает Робота вправо;
Left – перемещает Робота влево;
Up – перемещает Робота вверх;
Down – перемещает Робота вниз;
Paint – закрашивает текущую ячейку;
WallFromLeft – возвращает True если слева от Робота стена;
WallFromRight – возвращает True если справа от Робота стена;
WallFromUp – возвращает True если сверху от Робота стена;
WallFromDown – возвращает True если снизу от Робота стена;
FreeFromLeft – возвращает True если слева от Робота свободно;
FreeFromRight – возвращает True если справа от Робота свободно;
FreeFromUp – возвращает True если сверху от Робота свободно;
FreeFromDown – возвращает True если снизу от Робота свободно;
CellIsPainted – возвращает True если ячейка, в которой находится Робот, закрашена;
CellIsFree – возвращает True если ячейка, в которой находится Робот, не закрашена.

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

uses Robot;
begin
  Task('c1');
end.

Здесь Task - процедура, содержащаяся в модуле Robot и вызывающая задание с указанным именем.

Имеются следующие группы заданий для исполнителя Робот:

a – вводные задания;
c – цикл с параметром;
if – логические выражения;
w – циклы с условием;
сif – циклы + логические выражения;
count – переменные-счетчики;
cc – вложенные циклы;
p – процедуры без параметров;
pp – процедуры с параметрами.

Для создания произвольного поля размера 9 x 11 используется процедура StandardField без параметров, а для создания поля размера N x M - процедура Field(N,M). Робот при этом помещается в центр поля.


Исполнитель Чертежник

Исполнитель Чертежник предназначен для построения рисунков и чертежей на плоскости с координатами. Чертежник имеет перо, которое он может поднимать, опускать и перемещать. При перемещении опущенного пера за ним остается след.

Исполнитель Робот и поле, на котором он работает, отображаются следующим образом:

Здесь маленький квадрат изображает Чертежника, красным цветом изображены отрезки, которые надо нарисовать, а синим - уже нарисованные Чертежником отрезки. Когда перо Чертежника опущено, он изображается квадратом меньшего размера.

Команды исполнителя Чертежник содержатся в модуле Drawman:

ToPoint(x,y)–
перемещает перо Чертежника в точку (x,y);
OnVector(a,b)– перемещает перо
Чертежника на вектор (a,b);
PenUp – поднимает перо Чертежника;
PenDown – опускает перо Чертежника.

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

uses Drawman;

begin
  Task('c1');
end.

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

Здесь Task - процедура, содержащаяся в модуле Drawman и вызывающая задание с указанным именем.

Имеются следующие группы заданий для исполнителя Чертежник:

a – вводные задания;
c – цикл с параметром;
cc – вложенные циклы;
p – процедуры без параметров;
pp – процедуры с параметрами.

Для создания произвольного поля размера 20 x 30 используется процедура StandardField без параметров, а для создания поля размера N x M - процедура Field(N,M).


Общее описание

Электронный задачник Programming Taskbook предназначен для обучения программированию на языках Pascal, Visual Basic, C++, C#. Он содержит 1000 учебных заданий, охватывающих все основные разделы базового курса программирования: от скалярных типов и управляющих операторов до сложных структур данных и рекурсивных алгоритмов.

Автором задачника Programming Taskbook является доцент механико-математического факультета Ростовского государственного университета Михаил Эдуардович Абрамян (mabr@math.rsu.ru).

Версия задачника 4.5 реализована для следующих сред: Borland Pascal 7.0, Borland Delphi 3.0–7.0, Microsoft Visual Basic 5.0–6.0, Borland C++Builder 4.0–5.0, Microsoft Visual C++ 6.0, Microsoft Visual Studio .NET 2003 (языки Visual C++ 7.0, Visual Basic .NET и Visual C# .NET). Кроме того, задачник включен в учебную систему программирования Pascal ABC, образуя единый программный комплекс Pascal ABC & Programming Taskbook.

Задачник Programming Taskbook предоставляет учащимся следующие возможности:

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

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

Задания, помеченные символом «°», можно выполнять в свободно распространяемой бесплатной мини-версии задачника. В мини-версию включены 200 заданий, в том числе все задания групп Begin, Integer, Boolean, а также избранные задания из других разделов задачника. Ниже приводится список всех заданий, включенных в мини-версию задачника:

Begin1–Begin40, Integer1–Integer30, Boolean1–Boolean40, If4, If6, If8, If12, If22, If26, Case4, Case9, For5, For12–For13, For15–For16, For19–For20, For33, For36, While1–While2, While4, While7, While11–While12, While22–While23, Series1, Series15–Series17, Series19, Series21, Series30, Proc4, Proc8, Proc21, Proc25, Proc40, Minmax1, Minmax6, Minmax12, Minmax26, Array7, Array47, Array60, Array68, Array112, Array116, Matrix7, Matrix24, Matrix53, Matrix82, Matrix88, String9–String10, String29, String41, String70, File2, File25, File43, File48, File67, File74, Text1, Text4, Text21, Text34, Text42, Text57, Param1, Param17, Param41, Param51, Recur1, Recur10, Recur14–Recur18, Recur25, Dynamic2–Dynamic3, Dynamic5, Dynamic8, Dynamic10–Dynamic11, Dynamic30, Dynamic49, Dynamic55.

Для того чтобы упростить работу с заданиями, доступными в мини-версии, все эти задания (кроме заданий групп Begin, Integer и Boolean) объединены в особую группу Mix.


Имеющиеся группы заданий

Ниже перечислены все группы заданий, включенные в электронный задачник Programming Taskbook версии 4.5 (в скобках указывается количество заданий в данной группе).

  • Begin — ввод и вывод данных, оператор присваивания (40),
  • Integer — целые числа (30),
  • For — цикл с параметром (40),
  • Boolean — логические выражения (40),
  • If — условный оператор (30),
  • Case — оператор выбора (20),
  • While — цикл с условием (30),
  • Series — последовательности (40),
  • Proc — процедуры и функции (60),
  • Minmax — минимумы и максимумы (30),
  • Array — одномерные массивы (140),
  • Matrix — двумерные массивы (матрицы) (100),
  • String — символы и строки (70),
  • File — типизированные файлы (90),
  • Text — текстовые файлы (60),
  • Param — составные типы данных в процедурах и функциях (70),
  • Recur — рекурсия (30),
  • Dynamic — динамические структуры данных (80),
  • Mix — избранные задания из различных групп задачника (90).


Новые типы и процедуры

Описанные в данном пункте типы и процедуры будут доступны в программе, если к ней с помощью оператора uses подключен модуль PT4 (см. пример программы, использующей задачник Programming Taskbook).

type
  PNode = ^TNode;
  TNode = record
   Data: Integer;
   Next: PNode;
   Prev: PNode;
  end;

Типы PNode и TNode используются в заданиях группы Dynamic. В заданиях на стеки и очереди (Dynamic1–Dynamic28) при работе с записями типа TNode используются только поля Data и Next; в заданиях на двусвязные списки (Dynamic29–Dynamic80) используются все поля записи TNode.

Все исходные и результирующие данные-указатели в заданиях имеют тип PNode; их ввод и вывод должен осуществляться с помощью процедур GetP и PutP (в системе Pascal ABC указатели, как и другие данные, можно получать из задачника и передавать ему с помощью стандартных процедур ввода-вывода read и write).

В программе учащегося не следует повторно описывать типы PNode и TNode.

procedure Task(Name: string);

Процедура инициализирует задание с именем Name. Она должна вызываться в начале программы, выполняющей это задание (до вызова процедур ввода-вывода Get–Put). Если в программе, подключившей модуль PT4, не указана процедура Task, то при запуске программы будет выведено окно с сообщением «Не вызвана процедура Task с именем задания».

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

Имя задания Name должно включать имя темы и порядковый номер в пределах темы (например, 'Mix12'). Регистр букв в имени темы может быть произвольным. Если указана неверная тема задания, то программа выведет сообщение об ошибке, в котором будут перечислены названия всех имеющихся тем. Если указан недопустимый номер задания, то программа выведет сообщение, в котором будет указан диапазон допустимых номеров для данной темы. Если после имени задания в параметре Name указан символ ? (например, 'Mix12?'), то программа будет работать в демонстрационном режиме.

procedure GetB(var X: Boolean);
procedure GetC(var X: Char);
procedure GetN(var X: Integer);
procedure GetP(var X: PNode);
procedure GetR(var X: Real);
procedure GetS(var X: string);

Процедуры обеспечивают ввод исходных данных в программу, выполняющую учебное задание. Они должны вызываться после вызова процедуры Task; в случае их вызова до вызова процедуры Task при запуске программы будет выведено сообщение об ошибке «В начале программы не вызвана процедура Task с именем задания».

Используемая процедура ввода должна соответствовать типу очередного элемента исходных данных; в противном случае выводится сообщение об ошибке «Неверно указан тип при вводе исходных данных» (такое сообщение будет выведено, например, если очередной элемент данных является символом, а для его ввода используется процедура GetN).

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

При использовании задачника в системе Pascal ABC вместо процедур группы Get можно использовать обычные процедуры ввода read.

procedure PutB(X: Boolean);
procedure PutC(X: Char);
procedure PutN(X: Integer);
procedure PutP(X: PNode);
procedure PutR(X: Real);
procedure PutS(X: string);

Процедуры обеспечивают вывод на экран результирующих данных, найденных программой, и сравнение их с контрольными данными (то есть с правильным решением). Как и процедуры группы Get, эти процедуры должны вызываться после вызова процедуры Task; в противном случае при запуске программы будет выведено сообщение об ошибке «В начале программы не вызвана процедура Task с именем задания».

В отличие от процедур группы Get, в качестве параметра процедур группы Put можно указывать не только переменные, но и выражения (в частности, константы соответствующего типа). Используемая процедура должна соответствовать типу очередного элемента результирующих данных, в противном случае выводится сообщение об ошибке «Неверно указан тип при выводе результатов».

Как и в случае процедур группы Get, при вызовах процедур группы Put программа осуществляет контроль за соответствием количества требуемых и выведенных результирующих данных. Если программа выведет недостаточное или избыточное количество результирующих данных, то после проверки этих данных появится сообщение «Выведены не все результирующие данные» или, соответственно, «Попытка вывести лишние результирующие данные».

При использовании задачника в системе Pascal ABC вместо процедур группы Put можно использовать обычные процедуры вывода write.

procedure Dispose(var P: PNode);

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


Окно задачника

При запуске программы, подключившей модуль PT4 и вызвавшей процедуру Task инициализации задания на экране возникает окно задачника Programming Taskbook. Приведем примерный вид этого окна для задания Begin3:

В верхней части этого окна выводится информация о теме, к которой относится выполняемое задание («ВВОД И ВЫВОД ДАННЫХ, ОПЕРАТОР ПРИСВАИВАНИЯ»), название задания, сведения об учащемся, дата и время запуска программы. Символ «°», указанный после названия задания, означает, что данное задание можно выполнять в мини-версии задачника.

Затем следует раздел с формулировкой задания.

Далее располагается раздел с исходными данными. В данном случае это два вещественных числа: a и b, определяющее стороны данного прямоугольника. При необходимости данные могут снабжаться комментариями; в данном случае это тексты «a=» и «b=», предшествующие числам a и b.

Последним разделом является раздел контрольных данных и результатов, содержащий две вкладки: «Пример верного решения» и «Полученные результаты». Если в программе не указан ни один из операторов ввода-вывода, то при запуске программы активной становится вкладка «Пример верного решения» с контрольными (то есть «правильными») результирующими данными. Для переключения между вкладками можно использовать клавиатурную комбинацию Ctrl-Tab.

Чтобы отличить комментарии от данных (как исходных, так и результирующих), используется цветовое выделение: комментарии выводятся светло-серым цветом, данные — желтым. Контрольные данные отображаются тем же цветом, что и комментарии.

В нижней части окна располагается информационная панель и кнопка «Выход». Для выхода из программы надо нажать кнопку «Выход» или клавишу Esc. Можно также нажать клавишу F9, то есть ту же клавишу, которая используется для запуска программы. Таким образом, для проверки программы на нескольких наборах исходных данных достаточно несколько раз нажать F9.

Окно задачника Programming Taskbook можно отобразить на экране без повторного запуска программы: для этого надо выполнить команду меню «Вид | Окно выполненной программы» или нажать клавишу F6. Для того чтобы отличить эту ситуацию от «настоящего» запуска программы, в окне задачника дополнительно выводится текст «Просмотр результатов предыдущего запуска программы». Для закрытия окна задачника в этом случае достаточно еще раз нажать клавишу F6 или клавишу Esc.


Программы-утилиты

Задачник Programming Taskbook включает следующие утилиты, интегрированные в среду Pascal ABC:

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

Каждая из этих утилит вызывается непосредственно из среды Pascal ABC с помощью соответствующих команд меню «Сервис», а также кнопок и горячих клавиш:

  • или Shift-Ctrl-D для PT4Demo,
  • или Shift-Ctrl-L для PT4Load,
  • или Shift-Ctrl-R для PT4Res.


Демонстрационный режим

Для запуска задачника в демонстрационном режиме следует при указании имени задания в процедуре Task дополнить это имя символом ?, например:

Task('Mix12?');

Демонстрационный режим задачника имеет следующие особенности:

  • даже если программа содержит решение задания, это решение не анализируется и информация в файл результатов не заносится;
  • после отображения на экране окна задачника в разделе результатов сразу будет выбрана вкладка «Пример верного решения»;
  • при одном запуске программы можно просмотреть несколько вариантов исходных и контрольных данных; для смены набора данных требуется нажать кнопку «Новые данные» или клавишу пробела;
  • при одном запуске программы можно последовательно просмотреть все задания данной группы; для перехода к заданию с бoльшим номером требуется нажать кнопку «Следующее задание» или клавишу Enter, а для перехода к заданию с меньшим номером требуется нажать кнопку «Предыдущее задание» или клавишу Backspace. Задания перебираются циклически.

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

Для демо-просмотра требуемых групп заданий предназначена также утилита PT4Demo, которая вызывается непосредственно из среды Pascal ABC командой меню «Сервис | Просмотреть задания» (с данной командой связана также кнопка [image] и клавиатурная комбинация Shift-Ctrl-D).

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


Создание шаблона программы

Входящая в состав задачника Programming Taskbook программа-утилита PT4Load позволяет быстро создавать программы-заготовки для выполнения требуемого задания. Эту утилиту можно вызвать непосредственно из среды Pascal ABC командой меню «Сервис | Создать шаблон программы» (с данной командой связана также кнопка [image] и клавиатурная комбинация Shift-Ctrl-L).

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

При вводе допустимого имени задания (то есть имени группы и порядкового номера, например, Begin1) кнопка «Загрузка» становится доступной, и после ее нажатия (или нажатия клавиши Enter) в рабочем каталоге создается файл, содержащий шаблон программы для выполнения выбранного задания (имя файла совпадает с именем задания). Созданная программа-шаблон сразу загружается в редактор Pascal ABC; ее можно немедленно запустить, чтобы увидеть формулировку задания и пример исходных данных.

Приведем пример шаблона, созданного для задания Begin3 (этот шаблон будет записан в файл Begin3.pas):

uses PT4;

begin
   Task('Begin3');

end.

Ввод имени задания для исполнителей Робот и Чертежник имеет следующую особенность: для них надо вначале ввести префикс исполнителя (RB для Робота или DM для Чертежника), после чего ввести имя набора заданий для соответствующего исполнителя и номер этого задания (например, RBa1).

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

Особая группа PAS (последняя в списке групп заданий) позволяет загрузить в редактор любой файл с расширением .pas из рабочего каталога. При вводе имени этой группы и нажатии кнопки «Загрузка» появляется список всех pas-файлов; после выбора любого из этих файлов он немедленно загружается в редактор. Таким образом, использование группы PAS равносильно команде «Файл | Открыть».


Пример выполнения задания

Кратко опишем процесс выполнения заданий на примере задания Begin3 (пошаговый процесс решения этого задания приведен в разделе «Проверяемые задания» (пример 1). В этом разделе также приводятся примеры решения заданий на обработку строк (пример 3), файлов (пример 4) и динамических структур данных (пример 5).

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

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

В данном случае необходимо ввести стороны прямоугольника a и b, являющиеся по условию задания вещественными числами. Для ввода вещественных чисел в задачнике предусмотрена специальная процедура GetR, однако при использовании задачника в среде Pascal ABC можно использовать стандартную процедуру ввода read. После ввода исходных данных их надо использовать для нахождения результирующих данных, в данном случае — площади S и периметра P прямоугольника:

uses PT4;
var a, b, S, P: real;
begin
   Task('Begin3');
   read(a, b);
   S := a*b;
   P := 2*(a+b);
end.

При запуске этой программы будет выдано сообщение об ошибке: «Выведены не все результирующие данные». Для вывода найденных результатов (вещественного типа) в задачнике предусмотрена процедура PutR, однако в среде Pascal ABC можно использовать стандартную процедуру вывода write. Данные надо выводить в том порядке, который указан в формулировке задания:

uses PT4;
var a, b, S, P: real;
begin
   Task('Begin3');
   read(a, b);
   S := a*b;
   P := 2*(a+b);
   write(S, P);
end.

После запуска этого варианта программы информационная панель в окне задачника будет содержать сообщение «Верное решение. Тест номер 1 (из 3)» на зеленом фоне. Таким образом, мы провели первое успешное испытание программы.

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

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

Информация о ходе выполнения каждого задания сохраняется в специальном файле результатов results.abc, содержимое которого можно просмотреть непосредственно из среды Pascal ABC (см. раздел «Просмотр результатов»).


Просмотр результатов

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

Данный файл автоматически создается в рабочем каталоге системы Pascal ABC. При смене рабочего каталога (это можно сделать с помощью программы настройки PABCSetup) в новом рабочем каталоге также создается файл результатов.

Данные хранятся в файле результатов в зашифрованном виде, поэтому его непосредственный просмотр и корректировка невозможны. Для просмотра содержимого файла результатов предназначена встроенная утилита PT4Res, которая вызывается непосредственно из среды Pascal ABC командой меню «Сервис | Просмотреть результаты» (с данной командой связана также кнопка [image] и клавиатурная комбинация Shift-Ctrl-R).

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

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

= Иванов Петр     (C:\PABCWork)
Begin1 a27/09 19:07 Выведены не все результирующие данные.
Begin1 a27/09 19:07 Ошибочное решение.--2
Begin1 a27/09 19:07 Задание выполнено!
For1   a27/09 19:07 Ознакомительный запуск.
For1   a27/09 19:08 Выведены не все результирующие данные.
For1   a27/09 19:10 Ошибочное решение.--3
For1   a27/09 19:13 Задание выполнено!
For5   a27/09 19:15 Неверно указан тип при вводе исходных данных.--2
For5   a27/09 19:16 Выведены не все результирующие данные.
For5   a27/09 19:19 Задание выполнено!
For10  a27/09 19:21 Неверно указан тип при вводе исходных данных.
For10  a27/09 19:22 Ошибочное решение.

(буква a перед датой означает, что задание выполнялось в системе Pascal ABC, а числа в конце некоторых строк указывают на то, что было проведено подряд несколько запусков программы с одинаковым результатом).

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

= Иванов Петр      (C:\PABCWork)
-1- ВРЕМЯ ЗАНЯТИЙ:
27/09(19:07-19:22)[3/16]   ВСЕГО: 0:16 [3/16]
-2- ВЫПОЛНЕННЫЕ ЗАДАНИЯ:
Begin1 a27/09 [4]      For1 a27/09 [6]     For5 a27/09 [4]
-3- НЕЗАВЕРШЕННЫЕ ЗАДАНИЯ:
For10 27/09 [2]
-5- СВОДКА ПО ГРУППАМ ЗАДАНИЙ:
Begin 1      For 2      ВСЕГО: 3

Вариант со сводной информацией может содержать дополнительный раздел «-4- ОСТАЛОСЬ ВЫПОЛНИТЬ:». Этот раздел появляется в случае, если учащийся должен выполнить все задания из некоторого набора заданий (такие наборы индивидуальных заданий могут быть подготовлены преподавателем с помощью дополнительных утилит PABCTeach и VarMaker, входящих в расширенный вариант задачника Programming Taskbook).

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


Ошибки компиляции

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

ожидался символ "точка"
ожидалось описание или begin
end ожидалось
ожидалось присваивание ":="
ожидалось логическое выражение
then ожидалось
ожидалось else или символ "точка с запятой"
ожидалось имя переменной
ожидалось имя переменной, константы или функции
ожидалось имя процедуры
ожидался символ "двоеточие"
ожидался символ "точка с запятой"
ожидалось имя типа
ожидался идентификатор
ожидалось равенство "="
ожидалось константное значение
неизвестный идентификатор
идентификатор не является именем процедуры
ожидался идентификатор, но обнаружено число
попытка присваивания константе
присваивание имени функции вне тела этой функции
неправильное преобразование типов при присваивании
попытка присвоить переменной типа ... выражение типа ...
ожидалось выражение целого типа
"точка с запятой" после do - пустой цикл!
do ожидалось
ожидалось выражение
to или downto ожидалось
условие в цикле while должно иметь тип boolean
условие в цикле repeat должно иметь тип boolean
неверное количество фактических параметров
идентификатор не является именем функции
ожидалась закрывающая скобка ")"
неверное выражение
повторно объявленный идентификатор ...
переполнение стека переменных
переполнение стека процедур
нельзя считывать переменные типа boolean
переполнение стека значений
переполнение стека вызовов процедур
пересечение диапазонов меток в операторе case
неверный диапазон в операторе case
of ожидалось
ожидался символ "]"
ожидалась константа целого типа
ожидалось ".."
ожидался символ "["
нижняя граница индекса массива больше верхней
ожидалось имя массива
операция неприменима к операндам этого типа
массивы размерности > 3 не поддерживаются
нельзя присваивать переменной файлового типа
нельзя использовать writeln для типизированного файла
нельзя использовать readln для типизированного файла
нельзя выводить данные типа "массив". Массивы выводятся поэлементно в цикле
нельзя вводить данные типа "массив". Массивы вводятся поэлементно в цикле
нельзя выводить данные этого типа
нельзя вводить данные этого типа
повторно объявленное поле записи
break вне цикла
continue вне цикла
неверное количество фактических параметров
лишние символы после конца текста программы
ожидался идентификатор, но ... обнаружено
нельзя ставить символ "точка с запятой" перед else в операторе if
ожидался оператор
ожидалась константа целого типа
тип метки не совпадает с типом выражения-переключателя в операторе case
переменная не является массивом
массив имеет другое количество размерностей
переменная не является указателем
переменная не является записью или объектом
неизвестное поле записи
неизвестное поле класса
объект не может вызывать свой конструктор
ожидалось имя функции класса
начальное значение переменной цикла for должно иметь тот же тип, что и переменная цикла
конечное значение переменной цикла for должно иметь тот же тип, что и переменная цикла
функция с именем ... отсутствует в базовом классе
неверное преобразование типов или не var-параметр в параметре ...
процедура-метод не может участвовать в выражении
первый операнд в операции in должен иметь тип char
второй операнд в операции in должен иметь тип char
переменная не является объектом
после имени типа и точки ожидалось имя конструктора класса
неизвестное имя типа ...
при описании переменных следует использовать ":", а не ":="
forward-описания не могут быть вложенными в процедуру или функцию
ожидалось begin
процедура с именем ... отсутствует в базовом классе
выражение слева от точки не является объектом
поле объекта не является именем процедуры
class должен иметь имя типа
идентификатор должен быть именем класса
тип параметра ... не совпадает с типом элементов файла
неклассовый тип в записи "тип.поле"
выход за границы диапазона типа ...
секция инициализации может быть только в модуле
отсутствует BEGIN основной программы
значения этого типа не могут образовывать множество
нельзя запустить модуль
ожидалось выражение типа integer, char или перечислимого типа
строковая переменная должна иметь одну размерность
комплексная переменная может иметь только поля с именами Re или Im
после имени типа и точки ожидалось имя конструктора класса
переменная цикла for должна иметь тип integer, char, byte, интервальный или перечислимый
при приведении типов должен указываться один параметр
явное преобразование типа ... к типу ... запрещено
неоднозначность при поиске перегруженной версии функции
перегруженная функция ... с параметрами указанных типов не найдена
тип ... полностью не определен
нельзя использовать форматы вывода вне процедуры write или writeln
формат вывода должен иметь целый тип
нижняя и верхняя границы интервального типа имеют разные типы
модуль ... не найден
индекс строковой переменной должен иметь целый тип
один из индексов переменной с индексами имеет неверный тип
параметр ... не является переменной
функция не может использоваться для типизированных файлов
неверное преобразование типа ... к типу ... в параметре ...
формат вывода :n неприменим к данным типа ...
формат вывода :n:m применим только к данным типа real или complex
нижняя граница интервального типа больше верхней
множество на базе перечислимого типа должно иметь элементы перечислимого типа с номерами внутри диапазона 0..255
множество на базе интервального типа должно иметь элементы внутри диапазона 0..255
множество на базе недопустимого типа
повторное имя модуля
выражение выбора в операторе case должно иметь тип integer, byte, char, интервальный или перечислимый
ожидалось константное выражение
ожидалось целое выражение
размер строки должен быть положительным
размер строки не может превышать 255 символов
ожидалась константа типа integer, byte, char или перечислимого типа
ожидалась константа типа integer или byte
ожидалось выражение порядкового типа
ожидалось выражение вещественного типа
выражения в диапазоне должны иметь один тип
операнды имеют неприводимые типы
операция in неприменима к типам ... и ...
несовместимые типы ... и ... при выполнении операции in
параметр процедуры New должен быть типизированным указателем
элементы множества должны иметь одинаковый тип
выход за границы диапазона интервального типа
код символа вне диапазона 0..255
ожидался метод класса или end
определение подпрограммы не соответствует forward-объявлению
левый операнд операции is должен быть объектом
правый операнд операции is должен быть типом класса
левый операнд операции as должен быть объектом
правый операнд операции as должен быть типом класса


Ошибки времени выполнения

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

Далее приводится список всех ошибок, которые может выводить система Pascal ABC:

Неверная вещественная операция
Вещественное переполнение
Целочисленное переполнение
Вещественное деление на 0
Целочисленное деление на 0
Ln(0)
Complex: деление на 0

Значение формата вывода не может быть отрицательным
Код символа вне диапазона 0..255
Выход за границы диапазона изменения индекса
Выход за границы диапазона типа ...
Элемент перечислимого типа, используемый для конструирования множества, имеет номер >255
Параметр функции StrToInt не является целым числом
Параметр функции StrToFloat не является вещественным числом

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

Ошибка ввода. Программа завершена
Нельзя выводить данные типа pointer в текстовый файл
Нельзя считывать данные типа boolean из текстового файла
Нельзя считывать данные типа pointer из текстового файла
Ошибка ввода/вывода: нельзя открыть на чтение файл с пустым именем
Ошибка ввода/вывода: ошибка чтения диска
Ошибка ввода/вывода: ошибка записи на диск
Ошибка ввода/вывода: для файловой переменной не выполнена процедура Assign
Ошибка ввода/вывода: файл не открыт
Ошибка ввода/вывода: файл не открыт для ввода
Ошибка ввода/вывода: файл не открыт для вывода
Ошибка ввода/вывода: неверный числовой формат при вводе
Ошибка ввода/вывода: файл уже открыт
Ошибка удаления файла. Видимо, файл не закрыт
Ошибка переименования файла. Видимо, файл не закрыт

Слишком много вложенных вызовов подпрограмм
Переполнение программного стека
Переполнение стека вызовов процедур

Следующие ошибки могут возникать при подключении модулей Robot или Drawman:

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

Следующие ошибки могут возникать при подключении модуля Sounds:

Звук ... уже загружен
Звуковой файл ... отсутствует или имеет неверный формат
Неверный описатель звука при выполнении ...

Следующие ошибки могут возникать при подключении модуля Timers:

Неверный описатель таймера при выполнении ...

Следующие ошибки могут возникать при подключении модуля GraphABC:

Д ля рисунка не вызвана функция LoadPicture
Деверный номер рисунка при выполнении ...
Не удалось открыть файл ...

Если ошибка не распознана системой Pascal ABC, то в качестве сообщения об ошибке выводится:

Непредвиденное исключение ... . Программа завершена


Примеры

В папке Samples содержится множество примеров программ, написанных на Pascal ABC. Эту папку удобно скопировать в рабочую папку (по умолчанию C:\PABCWork). На данной странице приведены некоторые примеры с комментариями. Их можно загружать в редактор и запускать на исполнение прямо из текущего окна. Текст загруженной таким образом программы доступен только для чтения, что отражается в заголовке соответствующей вкладки окончанием "(r)".

Новые программы

gr_SpriteCreation.pas. Создание спрайта с несколькими состояниями.

gr_ManySprites.pas. Несколько объектов-спрайтов на основе одного спрайта.

Игры

15.pas. Игра в 15.

DeleteByMouse.pas. Удаление объектов мышью.

KillThem.pas. Простая стрелялка.

Модуль ABCObjects (для обучения основам объектно-ориентированного программирования)

gr_PictureScale.pas. Иллюстрация свойств ScaleX и ScaleY класса PictureABC.

gr_MovingObjects.pas. Движение случайно сгенерированных объектов.

gr_Intersects1.pas. Попиксельное пересечение объектов.

gr_Text.pas. Использование класса TextABC для создания тени надписи.

gr_Mouse.pas. Перемещение объектов мышью. Составные объекты.

gr_House.pas. Составные объекты. Управление свойствами вложенного объекта. Смена владельца.

gr_Robots.pas. Роботы на клеточном поле.

gr_Star_Rotate.pas. Объект StarABC: вращение.

gr_Clone_Recur.pas. Клонирование составных объектов.

gr_Chess.pas. Шахматная доска и фигуры - простая анимация. Создание фигур с возможностью масштабирования из .WMF-файла. Запрещение реакции объекта на мышь.

gr_Brown_Moving.pas. Броуновское движение.

Модуль GraphABC

Brown_moving.pas. Броуновское движение.

Mosaic.pas. Анимированная мозаика.

Colors.pas. Стандартные цвета.

Graphic2.pas. График функции с возможностью масштабирования.

InflateRect.pas. Демонстрация использования процедуры InflateRect.

MovingObject.pas. Движение картинки.

SetPixel.pas. Демонстрация использования процедуры SetPixel.

Rain.pas. Капли дождя.

Polygon.pas. Многоугольники. Демонстрация использования черепашьей графики.

BrushPicture.pas. Демонстрация кисти, задаваемой картинкой.

Font.pas. Демонстрация использования различных характеристик шрифтов.

TextWH.pas. Демонстрация использования функций TextWidth и TextHeight.

Life.pas. Игра "Жизнь". Реализация с помощью алгоритма хеширования по равномерной сетке (автор идеи - А.Г.Кушниренко).

Fractal_c.pas. Фракталы. Демонстрация использования комплексной арифметики.

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

Matches.pas. Игра "Спички".

SimpleNumbers.pas. Вычисление больших простых целых чисел.

Простейшие события. Модуль Events

MouseWeb.pas. "Паутина". Использование событий OnMouseMove и OnResize. Режим пера pmNot.

MouseDraw.pas. Рисование мышью. Иллюстрация событий OnMouseDown и OnMouseMove.

Event_Key.pas. Использование события OnKeyDown.

Модуль Timers

Timer3.pas. Простейший таймер в консольном режиме.

Timer2.pas. "Собачка", бегающая вслед за мышью.

Модуль Sounds

Sounds3.pas. Иллюстрация всех методов класса Sound в консольном режиме.

SoundsMouse.pas. Извлечение звуков нажатием на мышь.

Модуль Containers

IntArray.pas. Демонстрация возможностей класса "Динамический массив целых".

ObjectArray.pas. Демонстрация возможностей класса "Динамический массив объектов". Владение элементами и своевременный вызов их деструкторов. Переопределение метода ToString для вывода массива объектов на экран.

ObjectArraySort.pas. Сортировка массива объектов по различным критериям.

RealStack.pas. Демонстрация возможностей класса "Стек вещественных".

StringQueue.pas. Демонстрация возможностей класса "Очередь строк".

IntSet.pas. Демонстрация возможностей класса "Множество целых". Итерация по множеству.

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

Объектно-ориентированное программирование

AssocArray.pas. Реализация класса ассоциативного массива.

ClassList.pas. Реализация класса односвязного списка с внутренним итератором.

Figures.pas. Иерархия классов графических фигур. Демонстрация полиморфизма. Клонирование объектов.

Robots.pas. Реализация класса Robot объектов, перемещающихся по клеточному полю Field.

Модуль Sockets

Client.pas, Server.pas. Иллюстрация использования сокетов. Сервер эхом выводит строки, которые вводятся в клиентской программе. Оба придожения завершаются при вводе строки 'Bye'. Каждая программа должна быть запущена из отдельного окна среды Pascal ABC.

Client2.pas, Server2.pas. Клиент управляет Роботом, реализованным на стороне сервера.

Рекурсивные программы

Dragon.pas. Кривая дракона.

Serpinsky.pas. Ковер Серпинского.

ESquares.pas. E-квадраты.

Модуль Utils

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

Модуль VCL. Компонентные программы

Caption.pas. Ввод заголовка формы в поле ввода.

MainMenu.pas. Иллюстрация создания главного меню.

ModalResult.pas. Иллюстрация использования модального результата, возвращаемого окном диалога.

MouseDraw1.pas. Рисование мышью на компоненте PaintBox. Иллюстрация использования интерфейса, состоящего из панели инструментов с опциями и окном для рисования.

PageControl.pas. Иллюстрация возможностей компонента PageControl.

Parent.pas. Иллюстрация свойства Parent.

StatusBar.pas. Иллюстрация возможностей компонента StatusBar.

StringGrid.pas. Иллюстрация возможностей компонента StringGrid.

TrackBar.pas. Изменение цвета панели при помощи трех компонентов TrackBar.

ControlInheritance.pas. Вариант предыдущей программы, где линейка значений и ее метка объединены в новый класс.

Notepad.pas. Простой текстовый редактор.

Graph3D.pas. Визуализация трехмерных поверхностей.

Проекты

BallMain.pas. Проект "Шарики". Различное поведение объектов на клеточном поле. Иллюстрация полиморфизма.

Battle.pas. Модель "Хищник-жертва".

Animals.pas. Игра "Животные". Самообучающаяся программа отгадывает задуманное Вами животное. Задумайте животное и вводите 0 - нет, 1 - да.

MazeGen.pas. Генерация случайного лабиринта..


Шифрование текстов заданий

В настоящее время шифрование текстов разработанных заданий не предусмотрено.

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

Поэтому в настоящее время разрабатывается система шифрования разработанных заданий. Она появится в следующей версии продукта Pascal ABC.