Курс лекций по программированию в Delphi

I СЕМЕСТР
Лекция 1
Тема Элементы интерфейса Delphi.

1. Начало работы
2. Форма
1. Начало работы
Запускается Delphi обычным образом, т. е. выбором из меню Borland Delphi 7 команды Delphi 7.
Вид экрана после запуска Delphi несколько необычен. Вместо одного окна на экране появляются пять:
главное окно Delphi 7;
окно стартовой формы Form 1;
окно редактора свойств объектов Object Inspector;
окно просмотра списка объектов Object TreeView;
окно редактора кода Unitl.pas.
Окно редактора кода почти полностью закрыто окном стартовой формы.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. Вид экрана после запуска Delphi
В главном окне находится меню команд, панели инструментов и палитра компонентов.
Окно стартовой формы (Forml) представляет собой заготовку главного окна разрабатываемого приложения.
Программное обеспечение принято делить на системное и прикладное. Системное программное обеспечение это все то, что составляет операционную систему. Остальные программы принято считать прикладными. Для краткости прикладные программы называют приложениями.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. Главное окно
Окно Object Inspector окно редактора свойств объектов предназначено для редактирования значений свойств объектов. В терминологии визуального проектирования объекты это диалоговые окна и элементы управления (поля ввода и вывода, командные кнопки, переключатели и др.). Свойства объекта это характеристики, определяющие вид, положение и поведение объекта. Например, свойства width и Height задают размер (ширину и высоту) формы, свойства тор и Left положение формы на экране, свойство caption текст заголовка.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. На вкладке Properties перечислены свойства объекта и указаны их значения
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. Окно редактора кода
В окне редактора кода, которое можно увидеть, отодвинув в сторону окно формы, следует набирать текст программы. В начале работы над новым проектом это окно редактора кода содержит сформированный Delphi шаблон программы.
2. Форма
Работа над новым проектом, так в Delphi называется разрабатываемое приложение, начинается с создания стартовой формы. Так на этапе разработки программы называют диалоговые окна.
Стартовая форма создается путем изменения значений свойств формы Form1 и добавления к форме необходимых компонентов (полей ввода и вывода текста, командных кнопок).
Свойства формы определяют ее внешний вид: размер, положение на экране, текст заголовка, вид рамки.
Для просмотра и изменения значений свойств формы и ее компонентов используется окно Object Inspector. В верхней части окна Object Inspector указано имя объекта, значения свойств которого отображается в данный момент. В левой колонке вкладки Properties (Свойства) перечислены свойства объекта, а в правой указаны их значения.
Таблица. Свойства формы (объекта mform)
Свойство
Описание

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

Caption
Текст заголовка

Width
Ширина формы

Height
Высота формы

Top
Расстояние от верхней границы формы до верхней границы экрана

Left
Расстояние от левой границы формы до левой границы экрана

BorderStyle
Вид границы. Граница может быть обычной (bsSizeable), тонкой (bs Single) или отсутствовать (bsNone). Если у окна обычная граница, то во время работы программы пользователь может при помощи мыши изменить размер окна. Изменить размер окна с тонкой границей нельзя. Если граница отсутствует, то на экран во время работы программы будет выведено окно без заголовка. Положение и размер такого окна-во время работы программы изменить нельзя

Borderlcons

Кнопки управления окном. Значение свойства определяет, какие кнопки управления окном будут доступны пользователю во время работы программы. Значение свойства задается путем присвоения значений уточняющим свойствам biSystemMenu, biMinimaze, biMaximaze И biHelp. Свойство biSystemMenu определяет доступность кнопки Свернуть и кнопки системного меню, biMinimaze кнопки Свернуть, biMaximaze кнопки Развернуть, biHelp кнопки вывода справочной информации

Color

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

Icon
Значок в заголовке диалогового окна, обозначающий кнопку вывода системного меню

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

При создании формы в первую очередь следует изменить значение свойства caption (Заголовок). В нашем примере надо заменить текст Form1 на "скорость бега". Чтобы это сделать, нужно в окне Object Inspector щелкнуть мышью на строке Caption, в результате чего будет выделено текущее значение свойства, в строке появится курсор, и можно будет ввести текст "скорость бега" (рис. В12).
Аналогичным образом можно установить значения свойств Height и width, которые определяют высоту и ширину формы. Размер формы и ее положение на экране, а также размер других элементов управления и их положение на поверхности формы задают в пикселах, т. е. точках экрана. Свойствам Height и width надо присвоить значения 250 и 330 соответственно.
Форма это обычное окно. Поэтому его размер можно изменить точно так же, как размер любого другого окна, т. е. захватом и перемещением (с помощью мыши) границы. По окончании перемещения границ автоматически изменятся значения свойств Height и width. Они будут соответствовать установленному размеру формы.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. Установка значения свойства путем ввода значения
Положение диалогового окна на экране после запуска программы соответствует положению формы во время ее разработки, которое определяется значением свойств тор (отступ от верхней границы экрана) и Left (отступ от левой границы экрана). Значения этих свойств также можно задать путем перемещения окна формы при помощи мыши.
При выборе некоторых свойств, например, Borderstyle, справа от текущего значения свойства появляется значок раскрывающегося списка. Очевидно, что значение таких свойств можно задать путем выбора из списка .
Некоторые свойства являются сложными, т. е. их значение определяется совокупностью значений других (уточняющих) свойств. Перед именами сложных свойств стоит значок "+", при щелчке на котором раскрывается список уточняющих свойств. Например, свойство BorderIcons определяет, какие кнопки управления окном будут доступны во время работы программы. Так, если свойству biMaximize присвоить значение False, то во время работы программы кнопки Развернуть в заголовке окна не будет.


Лекция 2
Тема Визуальные компоненты Delphi и их общие свойства.
1. Стандартные компоненты
2. Страница Additional
3. Страница System

1. Стандартные компоненты
На первой странице Палитры Компонент размещены 14 объектов (рис.8) определенно важных для использования. Мало кто обойдется длительное время без кнопок, списков, окон ввода и т.д. Все эти объекты такая же часть Windows, как мышь или окно.
Набор и порядок компонент на каждой странице являются конфигурируемыми. Так, Вы можете добавить к имеющимся компонентам новые, изменить их количество и порядок. Это можно сделать, вызвав всплывающее меню (нажать правую кнопку мыши, когда указатель над Палитрой).
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис.8: Компоненты, расположенные на первой странице Палитры.
Стандартные компоненты Delphi перечислены ниже с некоторыми комментариями по их применению. При изучении данных компонент было бы полезно иметь под рукой компьютер с тем, чтобы посмотреть, как они работают и как ими манипулировать.
Курсор - не компонент, просто пиктограмма для быстрой отмены выбора какого-либо объекта.
TMainMenu позволяет Вам поместить главное меню в программу. При помещении TMainMenu на форму это выглядит, как просто иконка. Иконки данного типа называют "невидимыми компонентом", поскольку они невидимы во время выполнения программы. Создание меню включает три шага: (1) помещение TMainMenu на форму, (2) вызов Дизайнера Меню через свойство Items в Инспекторе Объектов, (3) определение пунктов меню в Дизайнере Меню.
TPopupMenu позволяет создавать всплывающие меню. Этот тип меню появляется по щелчку правой кнопки мыши на объекте, к которому привязано данное меню. У всех видимых объектов имеется свойство PopupMenu, где и указывается нужное меню. Создается PopupMenu аналогично главному меню.
TLabel служит для отображения текста на экране. Вы можете изменить шрифт и цвет метки, если дважды щелкнете на свойство Font в Инспекторе Объектов. Вы увидите, что это легко сделать и во время выполнения программы, написав всего одну строчку кода.
TEdit - стандартный управляющий элемент Windows для ввода. Он может быть использован для отображения короткого фрагмента текста и позволяет пользователю вводить текст во время выполнения программы.
TMemo - иная форма TEdit. Подразумевает работу с большими текстами. TMemo может переносить слова, сохранять в ClipBoard фрагменты текста и восстанавливать их, и другие основные функции редактора. TMemo имеет ограничения на объем текста в 32Кб, это составляет 10-20 страниц. (Есть VBX и “родные” компоненты Delphi, где этот предел снят).
TButton позволяет выполнить какие-либо действия при нажатии кнопки во время выполнения программы. В Delphi все делается очень просто. Поместив TButton на форму, Вы по двойному щелчку можете создать заготовку обработчика события нажатия кнопки. Далее нужно заполнить заготовку кодом:
procedure TForm1.Button1Click(Sender: TObject);
begin
MessageDlg('Are you there?',mtConfirmation,mbYesNoCancel,0);
end;
TCheckBox отображает строку текста с маленьким окошком рядом. В окошке можно поставить отметку, которая означает, что что-то выбрано. Например, если посмотреть окно диалога настроек компилятора (пункт меню Options | Project, страница Compiler), то можно увидеть, что оно состоит преимущественно из CheckBox’ов.
TRadioButton позволяет выбрать только одну опцию из нескольких. Если Вы опять откроете диалог Options | Project и выберете страницу Linker Options, то Вы можете видеть, что секции Map file и Link buffer file состоят из наборов RadioButton.
TListBox нужен для показа прокручиваемого списка. Классический пример ListBox’а в среде Windows - выбор файла из списка в пункте меню File | Open многих приложений. Названия файлов или директорий и находятся в ListBox’е.
TComboBox во многом напоминает ListBox, за исключением того, что позволяет водить информацию в маленьком поле ввода сверху ListBox. Есть несколько типов ComboBox, но наиболее популярен спадающий вниз (drop-down combo box), который можно видеть внизу окна диалога выбора файла.
TScrollbar - полоса прокрутки, появляется автоматически в объектах редактирования, ListBox’ах при необходимости прокрутки текста для просмотра.
TGroupBox используется для визуальных целей и для указания Windows, каков порядок перемещения по компонентам на форме (при нажатии клавиши TAB).
TRadioGroup используется аналогично TGroupBox, для группировки объектов TRadioButton.
TPanel - управляющий элемент, похожий на TGroupBox, используется в декоративных целях. Чтобы использовать TPanel, просто поместите его на форму и затем положите другие компоненты на него. Теперь при перемещении TPanel будут передвигаться и эти компоненты. TPanel используется также для создания линейки инструментов и окна статуса.
Это полный список объектов на первой странице Палитры Компонент. Если Вам нужна дополнительная информация, то выберите на Палитре объект и нажмите клавишу F1 - появится Справочник с полным описанием данного объекта.
2. Страница Additional
На странице Standard представлены управляющие элементы, появившиеся в Windows 3.0. На странице Additional размещены объекты, позволяющие создать более красивый пользовательский интерфейс программы.
[ Cкачайте файл, чтобы посмотреть картинку ]
Список компонент:
TBitBtn - кнопка вроде TButton, однако на ней можно разместить картинку (glyph). TBitBtn имеет несколько предопределенных типов (bkClose, bkOK и др), при выборе которых кнопка принимает соответствующий вид. Кроме того, нажатие кнопки на модальном окне (Form2.ShowModal) приводит к закрытию окна с соответствующим модальным результатом (Form2.ModalResult).
TSpeedButton - кнопка для создания панели быстрого доступа к командам (SpeedBar). Пример - SpeedBar слева от Палитры Компонент в среде Delphi. Обычно на данную кнопку помещается только картинка (glyph).
TTabSet - горизонтальные закладки. Обычно используется вместе с TNoteBook для создания многостраничных окон. Название страниц можно задать в свойстве Tabs. Но проще это сделать в программе при создании формы (OnCreate) :
TabSet1.Tabs := Notebook1.Pages;
А для того, чтобы при выборе закладки страницы перелистывались нужно в обработчике события OnClick для TTabSet написать:
Notebook1.PageIndex := TabSet1.TabIndex;
TNoteBook - используется для создания многостраничного диалога, на каждой странице располагается свой набор объектов. Используется совместно с TTabSet.
TTabbedNotebook - многостраничный диалог со встроенными закладками, в данном случае - закладки сверху.
TMaskEdit - аналог TEdit, но с возможностью форматированного ввода. Формат определяется в свойстве EditMask. В редакторе свойств для EditMask есть заготовки некоторых форматов: даты, валюты и т.п. Спец. символы для маски можно посмотреть в Справочнике.
TOutline - используется для представления иерархических отношений связанных данных. Например - дерево директорий.
TStringGrid - служит для представления текстовых данных в виде таблицы. Доступ к каждому элементу таблицы происходит через свойство Cell.
TDrawGrid - служит для представления данных любого типа в виде таблицы. Доступ к каждому элементу таблицы происходит через свойство CellRect.
TImage - отображает графическое изображение на форме. Воспринимает форматы BMP, ICO, WMF. Если картинку подключить во время дизайна программы, то она прикомпилируется к EXE файлу.
TShape - служит для отображения простейших графических объектов на форме: окружность, квадрат и т.п.
TBevel - элемент для рельефного оформления интерфейса.
THeader - элемент оформления для создания заголовков с изменяемыми размерами для таблиц.
TScrollBox - позволяет создать на форме прокручиваемую область с размерами большими, нежели экран. На этой области можно разместить свои объекты.
3. Страница System
[ Cкачайте файл, чтобы посмотреть картинку ]
Страница представляет набор компонент для доступа к некоторым системным сервисам типа таймер, DDE, OLE и т.п.
TTimer - таймер, событие OnTimer периодически вызывается через промежуток времени, указанный в свойстве Interval. Период времени может составлять от 1 до 65535 мс.
TPaintBox - место для рисования. В обработчики событий, связанных с мышкой передаются относительные координаты мышки в TPaintBox, а не абсолютные в форме.
TFileListBox - специализированный ListBox, в котором отображаются файлы из указанной директории (св-во Directory). На названия файлов можно наложить маску, для этого служит св-во Mask. Кроме того, в св-ве FileEdit можно указать объект TEdit для редактирования маски.
TDirectoryListBox - специализированный ListBox, в котором отображается структура директорий текущего диска. В св-ве FileList можно указать TFileListBox, который будет автоматически отслеживать переход в другую директорию.
TDriveComboBox - специализированный ComboBox для выбора текущего диска. Имеет свойство DirList, в котором можно указать TDirectoryListBox, который будет отслеживать переход на другой диск.
TFilterComboBox - специализированный ComboBox для выбора маски имени файлов. Список масок определяется в свойстве Filter. В свойстве FileList указывается TFileListBox, на который устанавливается маска.
!!!! С помощью последних четырех компонент (TFileListBox, TDirectoryListBox, TDriveComboBox, TFilterComboBox) можно построить свой собственный диалог выбора файла, причем для этого не потребуется написать ни одной строчки кода.
TMediaPlayer - служит для управления мултимедйными устройствами (типа CD-ROM, MIDI и т.п.). Выполнен в виде панели управления с кнопками Play, Stop, Record и др. Для воспроизведения может понадобиться как соответствующее оборудование, так и программное обеспечение. Подключение устройств и установка ПО производится в среде Windows. Например, для воспроизведения видео, записанного в формате AVI, в потребуется установить ПО MicroSoft Video (в Windows 3.0, 3.1, WFW 3.11).
TOLEContainer - контейнер, содержащий OLE объекты. Поддерживается OLE 2.02 Подробнее об этом - в последующих уроках.

Лекция 3
Тема Состав приложений.
1. Консольное приложение
2. Обмен информацией
3. Сохранение программы

1. Консольное приложение
. С помощью системы Delphi 7можно создавать приложения Windows практически
неограниченной сложности, использующие графический интерфейс. Однако для тех, кто только начинает знакомство с основными операторами Паскаля, имеется возможность создания простых программ в стиле MS-DOS (в качестве учебных). Это так называемые консольные приложения. Внешне они выглядят как программы с текстовым интерфейсом, но способны обращаться к большинству функций Windows.
Чтобы создать консольное приложение, надо дать команду File > New > Other (Файл > Создать > Другое) и в диалоговом окне New Items (Создание программы) выбрать значок Console Application (Консольное приложение).
Система Delphi автоматически сгенерирует в текстовом редакторе исходный код – заготовку будущего приложения.
program Projectl; {$APPTYPE CONSOLE}
uses sysutils;
begin
{TODO -oUser -cConsole Main Insert code here}
end.

Код начинается с заголовка программы, состоящего из ключевого слова program и атоматически сгенерированного названия Projectl1.
Далее в виде комментария следует директива компилятора. Она отличается от обычного комментария тем, что сразу за символом { следует символ $, а следом слово, задающее определенную настройку компилятора. Хотя настройки компилятора можно задавать и непосредственно в среде Delphi 7, нужные настройки не всегда могут быть включены разработчиком вручную, поэтому лучше явно указывать их в тексте там, где они обязательно требуются.
Деректива {$APPTYPE CONSOLE} говорит компилятору, что данная программа представляет собой консольное приложение.
Следующая строка задает подключение стандартного модуля SysUtils с помощью ключевого слова uses.
Далее идет собственно программа для нее подготовлен логический блок, внутри которого система Delphi 7 добавила комментарий Insert user code here (Вставьте сюда свой исходный текст).
2. Обмен информацией
Так как создаваемая программа консольная, общаться с пользователем с помощью графического интерфейса она не может. Для этого нужны более простые средства обмена информацией с человеком.
В Паскале имеются две стандартные процедуры ReadLn (для ввода данных) и WriteLn (для записи данных), которые могут использоваться в консольных приложениях. Первая процедура выполняет ввод значения с клавиатуры и его передачу в переменную, которая указана в качестве параметра (можно указать и список переменных тогда при вводе соответствующие им значения надо разделять пробелами), Вторая процедура выводит одно или несколько значений переменных или выражений в текущую строку экрана, разделяя их пробелами.
Процедура ReadLn требует, чтобы человек после окончания ввода нажал клавишу ENTER. а процедура WriteLn после окончания вывода значений осуществляет перевод курсора на следующую строку. Другая процедура вывода, Write, не выполняет такого перевода и продолжает вывод данных в текущую строку.
У процедуры ReadLn может не быть ни одного параметра. Тогда при ее выполнении программа просто ожидает, когда пользователь нажмет клавишу ENTER. Если не указан ни один параметр процедуры WriteLn, то на экране произойдет пропуск одной пустой строчки.
Для первого, пробного запуска в главный логический блок программы можно поместить один оператор ReadLn тогда программа просто высветит черное консольное окно и закроется, когда будет нажата клавиша ENTER.
begin
ReadLn
end.
Обратите внимание: точку с запятой перед ключевым словом end можно не ставить.
3. Сохранение программы
Перед первым запуском программы ее исходный текст необходимо сохранить. Для этого щелкните на командной кнопке Save Alt (Сохранить все) на панели инструментов.
Система Delphi 7 попросит указать место для сохранения главного файла Projectl. Укажите любую подходящую папку.
Компиляция и запуск программы
Чтобы откомпилировать и сразу запустить данную программу, достаточно нажать клавишу F9. В папке, где был сохранен файл с исходным текстом, появится исполнимый файл программы Projectl.exe. Она будет тут же автоматически запущена та среды Delphi 7, На экране откроется окно консольного приложения.
После нажатия клавиши ENTER управление будет передано обратно в оболочку Delphi 7.



Лекция 4
Тема Программирование линейных алгоритмов.
1. Числовые типы данных
2. Символьный и строковый типы данных
3. Переменные и константы
4. Математические функции

1. Числовые типы данных
Язык Delphi поддерживает семь целых типов данных: shortint, smailint, Longint, Int64, Byte, word и Longword, описание которых приведено в табл. 1.1.
Тип
Диапазон
Формат

Shortint
-128-127
8 битов

Smallint
-32 768 - 32 767
16 битов

Longint
-2 147 483 648 - 2 147 483 647
32 бита

Int64
-263- 263 - 1
64 бита

Byte
0-255
8 битов, беззнаковый

Word
0-65 535
16 битов, беззнаковый

Longword
0 - 4 294 967 295
32 бита, беззнаковый


Object Pascal поддерживает и наиболее универсальный целый тип - Integer, который Эквивалентен Longint.
 Вещественный тип
Язык Delphi поддерживает шесть вещественных типов: Reai48, single, Double, Extended, comp, Currency. Типы различаются между собой диапазо-ном допустимых значений, количеством значащих цифр и количеством байтов, необходимых для хранения данных в памяти компьютера (табл. 1.2).
Тип
Диапазон
Значащих цифр
Байтов

Real48
2.9x 10-39-1.7x1038
11-12
06

Single
1.5 x 10-45-3.4х 1038
7-8
04

Double
5.0x10-324 -1.7x10308
15-16
08

Extended
3.6x10-4951 -1.1 х104932
19-20
10

Comp
263+1 - 263-1
19-20
08

Currency
-922 337 203 685 477.5808 --922 337 203 685 477.5807
19-20
08


Язык Delphi поддерживает и наиболее универсальный вещественный тип - Real, который э квивалентен Double
2. Символьный и строковый типы данных
Язык Delphi поддерживает два символьных типа: Ansichar и Widechar:
тип Ansichar это символы в кодировке ANSI, которым соответствуют числа в диапазоне от 0 до 255;
тип widechar это символы в кодировке Unicode, им соответствуют числа от 0 до 65 535.
Object Pascal поддерживает и наиболее универсальный символьный тип - Char, который эквивалентен Ansichar.
Строковый тип
Язык Delphi поддерживает три строковых типа: shortstring, Longstring
WideString:
тип shortstring представляет собой статически размещаемые в памяти компьютера строки длиной от 0 до 255 символов;
тип Longstring представляет собой динамически размещаемые в памяти строки, длина которых ограничена только объемом свободной памяти;
тип WideString представляет собой динамически размещаемые в памяти строки, длина которых ограничена только объемом свободной памяти. Каждый символ строки типа WideString является Unicode-символом.
В языке Delphi для обозначения строкового типа допускается использование идентификатора string. Тип string эквивалентен типу shortstring.
3. Переменные и константы
Переменная это область памяти, в которой находятся данные, которыми оперирует программа.
Первым символом в имени переменной должна быть буква. Пробел в имени переменной использовать нельзя.
Следует обратить внимание на то, что компилятор языка Delphi не различает прописные и строчные буквы в именах переменных, поэтому имена SUMMA, Summa и summa обозначают одну и ту же переменную.
В языке Delphi каждая переменная перед использованием должна быть объявлена. С помощью объявления устанавливается не только факт существования переменной, но и задается ее тип, чем указывается и диапазон допустимых значений.
В общем виде инструкция объявления переменной выглядит так:
Имя : тип;
Пример:
а : Real; b : Real; i : Integer;
а,b,с : Real; x1,x2 : Real;
Константы
В языке Delphi существует два вида констант: обычные и именованные.
Обычная константа это целое или дробное число, строка символов или отдельный символ, логическое значение.
Именованная константа
Именованная константа это имя (идентификатор), которое в программе используется вместо самой константы.
Именованная константа, как и переменная, перед использованием должна быть объявлена. В общем виде инструкция объявления именованной константы выглядит следующим образом:
константа = значение;
Именованные константы объявляются в программе в разделе объявления констант, который начинается словом const. Ниже приведен пример объявления именованных констант (целой, строковой и дробной).
const
Bound = 10;
Title = 'Скорость бега';
pi = 3.1415926;
После объявления именованной константы в программе вместо самой константы можно использовать ее имя.
В отличие от переменной, при объявлении константы тип явно не указывают. Тип константы определяется ее видом, например:
125 константа целого типа;
0.0 константа вещественного типа;
' выполнить ' строковая константа;
' \' символьная константа.
4. Математические функции
Таблица 1.6. Математические функции
Функция
Значение

Аbs (n)
Абсолютное значение n

Sqrt (n)
Квадратный корень из n

Sqr (n)
Квадрат n

Sin (n)
Синус n

Cos (n)
Косинус n

Arctan (n)
Арктангенс n

Ехр(n)
Экспонента n

Ln(n)
Натуральный логарифм n

Random(n)
Случайное целое число в диапазоне от 0 до n- 1


Функции преобразования
Функции преобразования (табл. 1.7) наиболее часто используются в инструкциях, обеспечивающих ввод и вывод информации. Например, для того чтобы вывести в поле вывода (компонент Label) диалогового окна значение переменной типа real, необходимо преобразовать число в строку символов, изображающую данное число. Это можно сделать при помощи функции FloatToStr, которая возвращает строковое представление значения выражения, указанного в качестве параметра функции.
Например, инструкция Labeii.caption := FioatTostr(x) выводит значе-ние переменной х в поле Labeii.
Таблица 1.7. Функции преобразования
Функция
Значение функции

Chr(n) IntToStr (k)
Символ, код которого равен n Строка, являющаяся изображением целого k

FloatToStr (n)
Строка, являющаяся изображением вещественного n

FloatToStrF(n, f , k,m)
Строка, являющаяся изображением вещественного п. При вызове функции указывают: f формат (способ изображения); k точность (нужное общее количество цифр); m количество цифр после десятичной точки

StrToInt (s)
Целое, изображением которого является строка s

StrToFloat (s)
Вещественное, изображением которого является строка s

Round (n)
Целое, полученное путем округления n по известным правилам

Trunc (n)
Целое, полученное путем отбрасывания дробной части n

Frac(n)
Дробное, представляющее собой дробную часть вещественного n

Int (n)
Дробное, представляющее собой целую часть вещественного n


Лекция 5
Тема Программирование линейных алгоритмов.
Ввод данных
Вывод результатов
Вывод в поле диалогового окна
1.Ввод данных
Наиболее просто программа может получить исходные данные из окна ввода или из поля редактирования (компонент Edit).
А) Ввод из окна ввода
Окно ввода это стандартное диалоговое окно, которое появляется на экране в результате вызова функции inputBox. Значение функции inputBox строка, которую ввел пользователь.
В общем виде инструкция ввода данных с использованием функции inputBox выглядит так:
Переменная := InputBox(Заголовок, Подсказка, Значение);
где:
Переменная переменная строкового типа, значение которой должно быть получено от пользователя;
Заголовок текст заголовка окна ввода; П подсказка текст поясняющего сообщения;
Значение текст, который будет находиться в поле ввода, когда окно ввода появится на экране.
Ниже в качестве примера приведена инструкция, используя которую можно получить исходные данные для программы пересчета веса из фунтов в килограммы. Окно ввода, соответствующее этой инструкции, приведено на рис. 1.5.
s:=InputBox('Фунты-килограммы','Введите вес в фунтах','0');
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 1.5. Пример окна ввода
Если во время работы программы пользователь введет строку и щелкнет на кнопке ОК, то значением функции inputBox будет введенная строка. Если будет сделан щелчок на кнопке Cancel, то значением функции будет строка, переданная функции в качестве параметра значение.
Следует еще раз обратить внимание на то, что значение функции inputBox строкового (string) типа. Поэтому если программе надо получить число, то введенная строка должна быть преобразована в число при помощи соответствующей функции преобразования. Например, фрагмент программы пересчета веса из фунтов в килограммы, обеспечивающий ввод исходных данных из окна ввода, может выглядеть так:
s := InputBox('Фунты-килограммы1,'Введите вес в фунтах',''); funt := StrToFloat(s);
б) Ввод из поля редактирования
Поле редактирования это компонент Edit. Ввод данных из поля редактирования осуществляется обращением к свойству Text.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 1.6. Компонент Edit1 используется для ввода данных
На рис. 1.6 приведен вид диалогового окна программы пересчета веса из фунтов в килограммы. Компонент Editl используется для ввода исходных данных. Инструкция ввода данных в этом случае будет иметь вид:
Funt := StrToFloat(Editl.Text);
2. Вывод результатов
Наиболее просто программа может вывести результат своей работы в окно сообщения или в поле вывода (компонент Label) диалогового окна.
Вывод в окно сообщения
Окна сообщений используются для привлечения внимания пользователя. При помощи окна сообщения программа может, к примеру, проинформировать об ошибке в исходных данных или запросить подтверждение выполнения необратимой операции, например, удаления файла.
Вывести на экран окно с сообщением можно при помощи процедуры ShowMessage или функции MessageDlg.
Процедура ShowMessage выводит на экран окно с текстом и командной кнопкой ОК.
В общем виде инструкция вызова процедуры ShowMessage выглядит так:
ShowMessage(Сообщение);
где сообщение текст, который будет выведен в окне.
На рис. 1.7 приведен вид окна сообщения, полученного в результате выполнения инструкции:
ShowMessage('Введите вес в фунтах.');
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 1.7. Пример окна сообщения
Следует обратить внимание на то, что в заголовке окна сообщения, выводимого процедурой ShowMessage, указано название приложения, которое задается на вкладке Application окна Project Options. Если название приложения не задано, то в заголовке будет имя исполняемого файла.
Функция MessageDig более универсальная. Она позволяет поместить в окно с сообщением один из стандартных значков, например "Внимание", задать количество и тип командных кнопок и определить, какую из кнопок нажал пользователь. На рис. 1.8 приведено окно, выведенное в результате выполнения инструкции
r:=MessageDlg('Файл '+ FName + ' будет удален.', mtWarning, [mbOk,mbCancel] , 0) ;
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 1.8. Пример окна сообщения
Значение функции MessageDlg число, проверив значение которого, можно определить, выбором какой командной кнопки был завершен диалог.
В общем виде обращение к функции MessageDig выглядит так:
Выбор: = MessageDlg( Сообщение, Тип, Кнопки, КонтекстСправки)
где:
Сообщение текст сообщения;
Тип тип сообщения. Сообщение может быть информационным, предупреждающим или сообщением о критической ошибке. Каждому типу сообщения соответствует определенный значок. Тип сообщения задается именованной константой (табл. 1.8);
Кнопки список кнопок, отображаемых в окне сообщения. Список может состоять из нескольких разделенных запятыми именованных констант (табл. 1.9). Весь список заключается в квадратные скобки.
Таблица 1.8. Константы функции MessageDlg
Константа
Тип сообщения
Значок

mtWarning
Внимание
[ Cкачайте файл, чтобы посмотреть картинку ]

mtError
Ошибка
[ Cкачайте файл, чтобы посмотреть картинку ]

mt Information
Информация
[ Cкачайте файл, чтобы посмотреть картинку ]

mtConfirmation
Подтверждение
[ Cкачайте файл, чтобы посмотреть картинку ]

mtCustom
Обычное
Без значка


  Таблица 1.9. Константы функции MessageDlg
Константа
Кнопка
Константа
Кнопка

mbYes
Yes
mb Abort
Abort

mbNo
No
mbRetry
Retry

mbOK
OK
mblgnore
Ignore

mbCancel
Cancel
mbAll
All

mbHelp
Help




Например, для того чтобы в окне сообщения появились кнопки ОК и Cancel, список Кнопки должен быть таким:
[mbOK,mbCancel]
Кроме приведенных констант можно использовать константы: mbokcancel, mbYesNoCancel и mbAbortRetryIgnore. Эти константы определяют наиболее часто используемые в диалоговых окнах комбинации командных кнопок.
контекстСправки параметр, определяющий раздел справочной системы, который появится на экране, если пользователь нажмет клавишу . Если вывод справки не предусмотрен, то значение параметра КонтекстСправки должно быть равно нулю.
Значение, возвращаемое функцией MessageDig (табл. 1.10), позволяет определить, какая из командных кнопок была нажата пользователем.
Таблица 1.10. Значения функции MessageDlg
Значение функции MessageDig
Диалог завершен нажатием кнопки

mrAbort
Abort

mrYes
Yes

mrOk
Ok

mrRetry
Retry

mrNo
No

mrCancel
Cancel

mrIgnore
Ignore

mrAll
All


3. Вывод в поле диалогового окна
Часть диалогового окна, предназначенная для вывода информации, называется полем вывода, или полем метки. Поле вывода это компонент Label.
Содержимое поля вывода определяется значением свойства Caption. Изменить значение свойства Caption, как и большинства свойств других компонентов, можно как во время разработки формы приложения, так и во время работы программы.
Для того чтобы во время работы программы изменить содержимое поля вывода, например, вывести в поле результат работы программы, нужно присвоить свойству новое значение.
На рис. 1.9 изображено диалоговое окно программы пересчета веса из фунтов в килограммы. Окно содержит два компонента Label. Компонент Label1 обеспечивает вывод информационного сообщения, компонент Label2 вывод результата работы программы.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 1.9. Поле Label2 предназначено для вывода результата работы программы
Свойство Caption символьного типа. Поэтому для того, чтобы во время работы программы вывести в поле метки числовое значение, нужно преобразовать число в строку, например, При при помощи фуекции FloatToStr или IntToStr.
Ниже в качестве примера приведена инструкция из программы пересчета веса из фунтов в килограммы, которая используется для вывода результата расчета.
Label2.Caption:= FloatToStr(kg)+' кг';

Лекция 6
Тема Программирование разветвляющихся алгоритмов.
1 Инструкция if
2. Инструкция case

1 Инструкция if
Инструкция if позволяет выбрать один из двух возможных вариантов развития программы. Выбор осуществляется в зависимости от выполнения условия.
В общем виде инструкция if записывается так:

if условие then
begin
// здесь инструкции, которые надо выполнить,
// если условие истинно.
end
else
begin
// здесь инструкции, которые надо выполнить, // если условие ложно. end;
Обратите внимание, что перед else (после end) точка с запятой не ставится.

Пример1
Рассмотрим программу вычисления стоимости междугородного телефонного разговора.
Стоимость междугородного разговора по телефону в выходные дни ниже, чем в обычные. Если день недели суббота или воскресенье, то стоимость уменьшается на величину скидки. Цена минуты разговора и величина скидки задаются в тексте программы как константы. Вид диалогового окна программы приведен на рис. 1
[ Cкачайте файл, чтобы посмотреть картинку ]
Компонент
Назначение

Edit1
Edit2
Label1, Label
Label3
Button1
Для ввода длительности разговора в минутах
Для ввода номера дня недели 2
Для вывода пояснительного текста о назначении полей ввода
Для вывода результата вычисления стоимости разговора
Для активизации процедуры вычисления стоимости разговора



Листинг . Вычисление стоимости телефонного разговора
implementation
($R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
const
PAY =0.15; // цена одной минуты разговора 0.15 рубля
DISCOUNT = 0.2; // скидка 20 процентов
var
Time:Real; // длительность разговора
Day:integer; // день недели
Summa:real; // стоимость разговора
begin
// получить исходные данные
Time:=StrToFloat(Editl.Text) ;
Day:=StrToInt(Edit2.Text);
// Вычислить стоимость разговора
Summa:= PAY*Time;
// Если день суббота или воскресенье, то уменьшить
// стоимость на величину скидки
if (Day = 6) OR (Day = 7)
then Surama:=Summa*(1 - DISCOUNT);
// вывод результата вычисления
label3.caption:='K оплате '
+ FloatToStr(Summa) + 'руб.'; end;
end.

Пример2
Программа запрашивает вес и рост, вычисляет оптимальное значение, сравнивает его с реальным весом и выводит соответствующее сообщение.
[ Cкачайте файл, чтобы посмотреть картинку ]

Листинг.Контроль веса
implementation
($R *.DFM}
procedure TForml.ButtonlClick(Sender: TObject);
var
w:real; { вес } h:real; { рост } opt:real;
{ оптимальный вес }
d:real;
{ отклонение от оптимального веса }
begin
w:=StrToFloat(Editl.text);
h:=StrToInt(Edit2.Text);
opt:=h-100;
if w=opt then
Label3.caption:='Bu в хорошей форме!'
else
if w < opt then
begin
d:=opt-w;
Labels.caption:='Вам надо поправиться, на '
+ FloatToStr(d)+ 'кг.';
end
else
begin
d:=w-opt;
Labels.caption:='Haдo немного похудеть, на '
+ FloatTostr(d)+ ' кг.';
end;
end;
end.
В приведенном примере множественный выбор реализован при помощи
двух инструкций if, одна из которых "вложена" в другую.

2 Инструкция case
В языке Delphi есть инструкция case, которая позволяет эффективно реализовать множественный выбор. В общем виде она записывается следующим образом:
case Селектор of список1:
begin
{ инструкции 1 } end; список2:
begin
{ инструкции 2 } end; списокМ:
begin
{ инструкции N }
end;
else
begin
{ инструкции )
end;
end;
где:
Селектор выражение, значение которого определяет дальнейший ход выполнения программы (т. е. последовательность инструкций, которая будет выполнена);
Список N список констант. Если константы представляют собой диапазон чисел, то вместо списка можно указать первую и последнюю константу диапазона, разделив их двумя точками. Например, список 1, 2, 3, 4, 5, 6 может быть заменен диапазоном 1..6.
Выполняется инструкция case следующим образом:
1. Сначала вычисляется значение выражения-селектора.
2. Значение выражения-селектора последовательно сравнивается с константами из списков констант.
3. Если значение выражения совпадает с константой из списка, то выполняется соответствующая этому списку группа инструкций. На этом выполнение инструкции саsе завершается.
4. Если значение выражения-селектора не совпадает ни с одной константой из всех списков, то выполняется последовательность инструкций, следующая за else.
Синтаксис инструкции case позволяет не писать else и соответствующую последовательность инструкций. В этом случае, если значение выражения не совпадает ни с одной константой из всех списков, то выполняется следующая за case инструкция программы.

Алгоритм, реализуемый инструкцией case Ниже приведены примеры инструкции case.
case n_day of
1,2,3,4,5: day:='Рабочий день. ' ;
6: day:='Cyббoтa!';
7: day:='Воскресенье!';
end;
case n_day of
1..5: day:='Рабочий день.';
6: day:='Суббота!';
7: day:='Воскресенье!';
end;
case n_day of
6: day:='Суббота!';
7: day:='Воскресенье!';
else day:='Рабочий день.';
end;

Лекция 7
Тема Программирование циклических алгоритмов
Инструкция For
Инструкция While
Инструкция Repeat
1. Инструкция for
Инструкция for используется в том случае, если некоторую последовательность действий (инструкций программы) надо выполнить несколько раз, причем число повторений заранее известно.
В общем виде инструкция for записывается следующим образом:
for счетчик := нач_знач to кон_знач do begin
// инструкции, которые надо выполнить несколько раз
end
Переменная счетчик, выражения нач_знач и кон_знач должны быть целого типа.
Количество повторений инструкций цикла можно вычислить по формуле
(кон_знач нач_знач + l).
Примеры:
for i:=l to 10 do begin
label1.caption:=label1.caption + '*'; end;
for i: =1 to n do s := s+i;
Примечание
Если между begin и end находится только одна инструкция, то слова begin и end можно не писать.
Задача1: Пусть нужно написать программу, которая вычисляет значение функции у = 5х2 - 7 в точках 1, -0.5, 0, 0.5 и 1
Процедура, обеспечивающая решение поставленной задачи, может выглядеть так:
procedure TForm1.ButtonlClick(Sender: TObject);
var
у: real; // значение функции
x: real; // аргумент функции
dx: real; // приращение аргумента
st: string; // изображение таблицы
i : integer; // счетчик циклов
begin
st:=''; x := -1; dx := 0.5;
for i:=l to 5 do begin
у := 5*x*x -7;
st := st+ FloatToStr(x)+' '+ FloatToStr(y)+chr(13); x :=x + dx; end;
Label1.Caption := st;
end;


Задача2
Рассмотрим программу, которая вычисляет сумму первых 10 элементов ряда: 1 + + 1/3 + ... (значение i-го элемента ряда связано с его номером формулой 1//). Диалоговое окно программы должно содержать, по крайней мере, два компонента: поле метки (Label1) и командную кнопку (Buttonl).
Вычисление суммы ряда и вывод результата выполняет процедура обработки события Onclick, текст которой приведен ниже. После вычисления очередного элемента ряда процедура выводит в поле Labell номер элемента и его значение в поле метки формы, предназначенное для вывода результата.
procedure TForm1.ButtonlClick(Sender: TObject);
var
i:integer; { номер элемента ряда }
elem:real;
{ значение элемента ряда }
summ:real;
{ сумма элементов ряда )
begin
summ:=0;
label Leapt ion: = ' ' ;
for i:=l to 10 do begin
elem:=l/i;
label1.caption:=labell.caption+
IntToStr(i)+' '+FloatToStr(elem)+#13; sunrn: =summ+elem;
end;
label1.caption:=label1.caption+
'Сумма ряда:'+FloatToStr(summ);
end;
Если в инструкции for вместо слова to записать downto, то после очередного выполнения инструкций тела цикла значение счетчика будет не увеличиваться, а уменьшаться.
2. Инструкция while
Инструкция (цикл) while используется в том случае, если некоторую последовательность действий (инструкций программы) надо выполнить несколько раз, причем необходимое число повторений во время разработки программы неизвестно и может быть определено только во время работы программы.

Типичными примерами использования цикла while являются вычисления с заданной точностью, поиск в массиве или в файле.
В общем виде инструкция while записывается следующим образом:
while условие do begin
// инструкции, которые надо выполнить несколько раз
end
где условие выражение логического типа, определяющее условие выполнения инструкций цикла.
1. Инструкция while выполняется следующим образом:
2. Сначала вычисляется значение выражения условие.
3. Если значение выражения условие равно False (условие не выполняется), то на этом выполнение инструкции while завершается.
4. Если значение выражения условие равно True (условие выполняется), то выполняются расположенные между begin и end инструкции тела цикла. После этого снова проверяется выполнение условия. Если условие выполняется, то инструкции цикла выполняются еще раз. И так до тех пор, пока условие не станет ложным (False).
Алгоритм, соответствующий инструкции while, представлен на рис. 2.14.
Внимание! Для того чтобы инструкции цикла while, которые находятся между begin и end, были выполнены хотя бы один раз, необходимо, чтобы перед выполнением инструкции while значение выражения условие было истинно.
Для того чтобы цикл завершился, нужно, чтобы последовательность инструкций между begin и end влияла на значение выражения условие (изменяла значения переменных, входящих в выражение условие).
3. Инструкция repeat
Инструкция repeat, как и инструкция while, используется в программе в том случае, если необходимо выполнить повторные вычисления (организовать цикл), но число повторений во время разработки программы неизвестно и может быть определено только во время работы программы, т. е. определяется ходом вычислений.
В общем виде инструкция repeat записывается следующим образом:
repeat
// инструкции unti1 условие
где условие выражение логического типа, определяющее условие завершения цикла.
Инструкция repeat выполняется следующим образом:
1. Сначала выполняются находящиеся между repeat и until инструкции тела цикла.
2. Затем вычисляется значение выражения условие. Если условие ложно (значение выражения условие равно False), то инструкции тела цикла выполняются еще раз.
3. Если условие истинно (значение выражения условие равно True), то выполнение цикла прекращается.
Таким образом, инструкции цикла, находящиеся между repeat и unti1, выполняются до тех пор, пока условие ложно (значение выражения условие равно False).
Внимание!
Инструкции цикла, находящиеся между repeat и until, выполняются как минимум один раз. Для того чтобы цикл завершился, необходимо, чтобы инструкции цикла, располагающиеся между repeat и until, изменяли значения переменных, входящих в выражение условие.
В качестве примера использования инструкции repeat рассмотрим программу, которая проверяет, является ли введенное пользователем число простым (как известно, число называется простым, если оно делится только на единицу и само на себя). Например, число 21 обычное (делится на 3), а число 17 простое (делится только на 1 и на 17).
Проверить, является ли число п простым, можно делением числа п на два, на три и т. д. до п и проверкой остатка после каждого деления. Если после очередного деления остаток равен нулю, то это означает, что найдено число, на которое п делится без остатка. Сравнив п и число, на которое п разделилось без остатка, можно определить, является ли п простым числом.
Форма приложения Простое число изображена на рис. 2.17, программа приведена в листинге 2.7.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 2.17. Форма приложения Простое число
Листинг 2.7. Простое число
unit simple_;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton; // кнопка Проверить
Label1: TLabel;
Edit1: TEdit; // поле ввода числа
Label2: TLabe1; // поле вывода результата
procedure ButtonlClickfSender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ButtonlClick(Sender: TObject) ;
var
n: integer; // проверяемое число d: integer; // делитель
r: integer; // остаток от деления п на d
begin
n:=StrToInt(Editl.text);
d := 2; // сначала будем делить на два
repeat
r := n mod d;
if r <> 0 // n не разделилось нацело на d
then d := d + 1;
until r = 0; // найдено число, на которое п разделилось без остатка
label2.caption:=Edit1.text;
if d = n
then Iabel2.caption:=label2.caption + ' простое число.'
else label2.caption:=label2.caption + ' обычное число.';
end;
end.




Лекция 8
Тема Примеры разработки программ.
1. Инструкция goto
2. Задачи
1. Инструкция goto
Инструкции if и case используются для перехода к последовательности инструкций программы в зависимости от некоторого условия. Поэтому их иногда называют инструкциями условного перехода. Помимо этих инструкций управления ходом выполнения программы существует еще одна инструкция безусловного перехода goto.
В общем виде инструкция goto записывается следующим образом:
goto Метка
где метка это идентификатор, находящийся перед инструкцией, которая должна быть выполнена после инструкции goto.
Метка, используемая в инструкции goto, должна быть объявлена в разделе меток, который начинается словом label и располагается перед разделом объявления переменных.
В программе метка ставится перед инструкцией, к которой должен быть выполнен переход в результате выполнения инструкции goto. Сразу после метки ставится двоеточие.
В листинге приведен вариант процедуры проверки числа, в которой инструкция goto используется для завершения процедуры в том случае, если пользователь введет неверные данные.
Листинг. Простое число (использование инструкции goto)
procedure TForm1.Button1Click(Sender: TObject);
label // раздел объявления меток
bye; var
n: integer; // проверяемое число
d: integer; // делитель
r: integer; // остаток от деления п на d
begin
n:=StrToInt(Editl.text);
if n <= 0 then begin
MessageDlg('Число должно быть больше нуля.',
mtError, [mbOk] , 0) ; Editl.text:= ";
goto bye;
end;
// введено положительное число
d:= 2; // сначала будем делить на два
repeat
r:= n mod d;
if r <> 0 // n не разделилось нацело на d
then d:= d + 1;
unti1 r = 0;
label2.caption:=Editl.text;
if d = n
then label2.caption:=label2.caption
+ ' простое число.'
else label2.caption:=label2.caption
+' обычное число.';
bye:
end;
В литературе по программированию можно встретить суждения о недопустимости применения инструкции goto, поскольку она приводит к запутанности программ. Однако с категоричностью таких утверждений согласиться нельзя. В некоторых случаях применение инструкции goto вполне оправдано. Приведенный пример, где инструкция goto используется для аварийного завершения процедуры, относится именно к таким случаям.
Задача Рассмотрим программу, которая вычисляет значение числа л с точностью, задаваемой пользователем во время работы программы. В основе алгоритма вычисления лежит тот факт, что сумма ряда 1 - 1/3 + 1/5 -1/7 + 1/9 + ... приближается к значению л/4 при достаточно большом количестве членов ряда.
Каждый член ряда с номером n вычисляется по формуле: 1/(2*n - 1) и умножается на минус один, если n четное (определить, является ли п четным, можно проверкой остатка от деления п на 2). Вычисление заканчивается тогда, когда значение очередного члена ряда становится меньше, чем заданная точность вычисления.
Вид диалогового окна программы во время ее работы приведен на рис. 2.15. Пользователь вводит точность вычисления в поле ввода (Editi). После щелчка на командной кнопке Вычислить (Buttonl) программа вычисляет значение числа л и выводит результат в поле метки (Labeii).
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 2.15. Диалоговое окно программы Вычисление ПИ
Листинг 2. 6. Вычисление числа п
unit pi_; interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit; // точность вычисления
Button1: TButton; // кнопка Вычислить
Label1: TLabel;
Label2: TLabel; // поле вывода результата
procedure ButtonlClick(Sender: TObject); private
{ Private declarations }
public
{ Public declarations )
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
pi:real; // вычисляемое значение ПИ
t:real; // точность вычисления
n:integer; // номер члена ряда
elem:real; // значение члена ряда
begin
pi := 0;
n := 1;
t := StrToFloat(editl.text) ;
elem := 1; // чтобы начать цикл
while elem >= t do
begin
elem := 1 / (2*n - 1) ; if n MOD 2=0
then pi := pi elem else pi := pi + elem; n := n + 1;
end;
pi: = pi * 4; labell.caption:= 'ПИ равно '+ FloatToStr(pi) + #13
+ 'Просуммировано '+IntTostr(n)+' членов ряда.'; end;
end.
2. Задачи
1.Вычмслить значение функции у=x2+\x-5\.
2. Вычислить стоимость 10 дисков, если стоимость за 1 диск 5 рублей, а при наличие дисконтной карты скидка 15%.
3. Используя инструкцию case, вывести название дня недели в зависимости от его номера..
4 Вычислить значение функции у=sin(x), в точках.
5 Определить является ли введенное число простым.

Лекция 9
Тема Массивы. Записи.
Объявление массива
Вывод массива
Ввод массива
Поиск максимального (мини)
1. Объявление массива
Имя: array [нижний_индекс. .верхний_индекс] of тип
где:
имя имя массива;
array зарезервированное слово языка Delphi, обозначающее, что объявляемое имя является именем массива;
нижний_индекс и верхний_и«декс целые константы, определяющие диапазон изменения индекса элементов массива и, неявно, количество элементов (размер) массива;
тип тип элементов массива.
Примеры объявления массивов:
temper:array[1..31] of real;
коef:array[0. .2] of integer;
name:array[1..30] of string[25];
Для того чтобы в программе использовать элемент массива, надо указать имя массива и номер элемента (индекс), заключив индекс в квадратные скобки. В качестве индекса можно использовать константу или выражение целого типа, например:
team [ 1] := 'Зенит';
ShowMessage(name[n+1]);
temper[i] := StrToFloat(Edit1.text);
2 Вывод массива
В качестве примера на рис. 1 приведено диалоговое окно приложения, которое демонстрирует инициализацию и процесс вывода значений элементов массива в поле метки. Программа выводит пронумерованный список футбольных команд. Следует обратить внимание, что для того чтобы список команд выглядел действительно как список, свойству Label1.AutoSize нужно присвоить значение False (присвойте свойству Label1.AutoSize значение True и посмотрите, как будет работать программа). Текст программы приведен в листинге 5.1.

Рис.1. Форма и диалоговое окно приложения Вывод массива
Листинг 1. Инициализация и вывод массива
implementation
($R *.dfm}
const
NT = 5;
var
team: array[1..NT] of string[10] =
('Зенит','Динамо','Ротор','Спартак','СКА'
procedure TForml.ButtonlClick(Sender: TObject);
var
st:string; // список команд
i:integer; // индекс, номер элемента массива
begin
// формирование списка для отображения в форме
for i:=l to NT do st := st + IntToStr(i)+ ' '
+ team[i] + #13; // вывод списка Label1.Caption := st;
end;
3. Ввод массива
Очевидно, что последовательность чисел удобно вводить в строку таблицы, где каждое число находится в отдельной ячейке. Ниже рассматриваются два варианта организации ввода массива с использованием компонентов StringGrid И Memo.
Использование компонента StringGrid
Для ввода массива удобно использовать компонент StringGrid. Значок компонента StringGrid находится на вкладке Additional
[ Cкачайте файл, чтобы посмотреть картинку ]
Компонент StringGrid представляет собой таблицу, ячейки которой содержат строки символов. В табл. 1 перечислены некоторые свойства компонента StringGrid.
Таблица 1. Свойства компонента StringGrid
Свойство
Определяет

ColCount
Количество колонок таблицы

RowCount
Количество строк таблицы

Cells
Соответствующий таблице двумерный массив. Ячейка таблицы, находящаяся на пересечении столбца номер col и строки номер row определяется элементом cells [col, row]

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

FixedRows
Количество зафиксированных сверху строк таблицы. Зафиксированные строки выделяются цветом и при вертикальной прокрутке таблицы остаются на месте

Options . goEditing
Признак допустимости редактирования содержимого ячеек таблицы. True редактирование разрешено, False запрещено

Options . goTab
Разрешает (True) или запрещает (False) использование клавиши <Таb> для перемещения курсора в следующую ячейку таблицы

Options GoAlways- Show Editor
Признак нахождения компонента в режиме редактирования. Если значение свойства False, то для того, чтобы в ячейке появился курсор, надо начать набирать текст, нажать клавишу или сделать щелчок мышью

DefaultColWidth
Ширину колонок таблицы

DefaultRowHeight
Высоту строк таблицы

GridLineWidth
Ширину линий, ограничивающих ячейки таблицы

Left
Расстояние от левой границы поля таблицы до левой границы формы

Top
Расстояние от верхней границы поля таблицы до верхней границы формы

Height
Высоту поля таблицы

Width
Ширину поля таблицы

Font
Шрифт, используемый для отображения содержимого ячеек таблицы

ParentFont
Признак наследования характеристик шрифта формы


В качестве примера использования компонента stringGrid для ввода массива рассмотрим программу, которая вычисляет среднее арифметическое значение элементов массива. Диалоговое окно программы приведено на рис. 2. Компонент stringGrid используется для ввода массива, компоненты Label1 и Label2 для вывода пояснительного текста и результата расчета, Buttoni для запуска процесса расчета.
[ Cкачайте файл, чтобы посмотреть картинку ]
Добавляется компонент stringGrid в форму точно так же, как и другие компоненты. После добавления компонента к форме нужно выполнить его настройку в соответствии с табл. 2. Значения свойств Height и width следует при помощи мыши установить такими, чтобы размер компонента был равен размеру строки.
Таблица 5.2. Значения свойств компонента StringGrid1
Свойство
Значение

ColCount
5

FixedCols
0

RowCount
1

DefaultRowHeight
24

Height
24

DefaultColWidth
64

Width
328

Options . goEditing
True

Options . AlwaysShowEditing
True

Options .goTabs
True


Листинг 2. Ввод и обработка массива целых чисел
implementation
{$R *.dfm}
procedure TForml.ButtonlClick(Sender: TObject); var
a : array[1..5] of integer; // массив
summ: integer; // сумма элементов
sr: real; // среднее арифметическое
i: integer; // индекс
begin
// ввод массива
// считаем, что если ячейка пустая, то соответствующий
// ей элемент массива равен нулю
for i:= 1 to 5 do
if Length(StringGridl.Cells[i-1, 0]) <>0
then a[i] := StrToInt(StringGridl.Cells[i-1,0])
else a[i] := 0;
// обработка массива
summ := 0;
for i :=1 to 5 do
summ := summ + a[i]; sr := summ / 5;
У вывод результата Label2.Caption :=
'Сумма элементов: ' + IntToStr(summ)
+ #13+ 'Среднее арифметическое: ' + FloatToStr(sr);
end;
end.
Использование компонента Memo
В некоторых случаях для ввода массива можно использовать компонент Memo. Компонент Memo позволяет вводить текст, состоящий из достаточно большого количества строк, поэтому его удобно использовать для ввода символьного массива. Компонент Memo добавляется в форму обычным образом. Значок компонента находится на вкладке Standard
Таблица .3. Свойства компонента Memo
Свойство
Определяет

Name
Имя компонента. Используется в программе для доступа к свойствам компонента

Text
Текст, находящийся в поле Memo. Рассматривается как единое целое

Lines
Текст, находящийся в поле Memo. Рассматривается как совокупность строк. Доступ к строке осуществляется по номеру

Lines .Count
Количество строк текста в поле Memo

Left
Расстояние от левой границы поля до левой границы формы

Top
Расстояние от верхней границы поля до верхней границы формы

Height
Высоту поля

Width
Ширину поля

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

ParentFont
Признак наследования свойств шрифта родительской формы


При использовании компонента Memo для ввода массива значение каждого элемента массива следует вводить в отдельной строке и после ввода каждого элемента массива нажимать клавишу .
Получить доступ к находящейся в поле Memo строке текста можно при помощи свойства Lines, указав в квадратных скобках номер нужной строки (строки нумеруются с нуля).
Основной цикл процедуры ввода символьного массива из компонента Memo может выглядеть так:
for i:=l to SIZE do
a [ i ]:= Memol.Lines[i];
где:
SIZE именованная константа, определяющая размер массива;
а массив; Memol имя Memo-компонента;Lines свойство компонента Memo, представляющее собой массив, каждый элемент которого содержит одну строку находящегося в поле Memo текста.
Листинг 5. Ввод массива строк из компонента Memo
implementation
($R *.DFM}
procedure TForml .ButtonlClick(Sender: TObject);
const
SIZE=5; // размер массива var
a:array[l..SIZE]of string[30]; //массив
n: integer; // количество строк, введенных в поле Memo
i:integer; // индекс элемента массива
st:string;
begin
n:=Memo1.Lines.Count;
if n = 0 then begin
ShowMessage('Исходные данные не введены!');
Exit; // выход из процедуры обработки события
end;
// в поле Memo есть текст
if n > SIZE then begin
ShowMessage('Количество строк превышает размер массива.');
n:=SIZE; // будем вводить только первые SIZE строк
end;
for i:=1 to n do
a[i]:=Form1.Memol.Lines[i-1]; // строки Memo пронумерованы с нуля
// вывод массива в окно сообщения
if n > 0 then begin
st:='Введенный массив:'+#13;
for i: =1 to n do
st:=st+IntToStr(i)+' '+ a[i]+f13; ShowMessage(st);
end;
end;
end.
Основную работу выполняет процедура TForm1.Button1Click, которая сначала проверяет, есть ли в поле Memo1 текст. Если текст есть (в этом случае значение свойства Lines.Count больше нуля), то процедура сравнивает количество введенных строк и размер массива. Если это количество превышает размер массива, то программа изменяет значение п, тем самым подготавливает ввод только первых SIZE строк.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 7. Массив, введенный из Memo-поля
 
4. Поиск минимального (максимального) элемента массива
Сначала делается предположение, что первый элемент массива является минимальным (максимальным), затем остальные элементы массива последовательно сравниваются с этим элементом. Если во время очередной проверки обнаруживается, что проверяемый элемент меньше (больше) принятого за минимальный (максимальный), то этот элемент становится минимальным (максимальным) и продолжается проверка оставшихся элементов.
Диалоговое окно приложения поиска минимального элемента массива содержит соответствующим образом настроенный компонент stringGridi, который применяется для ввода элементов массива, два поля меток (Label1 и Labeia), использующиеся для вывода информационного сообщения и результата работы программы, и командную кнопку (Buttonl), при щелчке на которой выполняется поиск минимального элемента массива. В табл. приведены значения свойств компонента stringGridi.
Таблица Значения свойств компонента stringGrid1
Свойство
Значение

ColCount
005

FixedCols
000

RowCount
001

DefaultRowHeight
024

Height
024

DefaultColWidth
064

Width
328

Options . goEditing
True

Options . AlwaysShowEditing
True

Options .goTabs
True

Листинг. Поиск минимального элемента массива
procedure TForm1.ButtonlClick(Sender: TObject);
const
SIZE=5;
var
a:array[l..SIZE]of integer; // массив целых
min:integer; // номер минимального элемента массива
i:integer; // номер элемента, сравниваемого с минимальным
begin
// ввод массива for i:=1 to SIZE do
a[i]:=StrToInt(StringGridl.Cells[i-1,0]);
// поиск минимального элемента
min:=1; // пусть первый элемент минимальный
for i:=2 to SIZE do
if a[i]< a[min]then min:=i;
// вывод результата
label2.caption:='Минимальный элемент массива:'
+IntToStr(a[min] +#13+'Номер элемента:'+ IntToStr(min);
end;
end.
Поиск в массиве заданного элемента
Поиск осуществляется последовательным сравнением элементов массива с образцом до тех пор, пока не будет найден элемент, равный образцу, или не будут проверены все элементы. Алгоритм простого перебора применяется, если элементы массива не упорядочены.
Алгоритм простого перебора
Цикл завершается, если в массиве обнаружен элемент, равный образцу (в этом случае значение переменной found равно true), или если проверены все элементы массива. По завершении цикла по значению переменной found можно определить, успешен поиск или нет.
[ Cкачайте файл, чтобы посмотреть картинку ]
Щелчок на командной кнопке Поиск (Buttoni) запускает процедуру TForm1.Button1Click (ее текст приведен в листинге 5.7), которая из компонента stringGridi вводит массив, а из поля редактирования Edit2 число (образец). Затем выполняется проверка, содержит ли массив введенное число. После завершения проверки процедура showMessage выводит сообщение о результате поиска.
Листинг 5.7. Поиск в массиве
procedure TForml.ButtonlClick(Sender: TObject);
const
SIZE=5; var
a: array[1..SIZE] of integer; //массив
obr: integer; // образец для поиска
found: boolean; // TRUE совпадение образца с элементом
// массива
i: integer; // индекс элемента массива
begin
// ввод массива for i:=l to SIZE do
a[i] := StrToInt(StringGridl.Cells[i-1,0]);
// ввод образца для поиска
obr := StrToInt(edit2.text);
// поиск
found := FALSE; // пусть нужного элемента в массиве нет
i:= 1;
repeat
if a[i] = obr
then found := TRUE else i := i+1;
until (i > SIZE) or (found = TRUE);
if found
then ShowMessage('Совпадение с элементом номер '
+IntToStr(i)+#13+'Поиск успешен.')
else ShowMessage('Совпадений с образцом нет.');
end;
end.


Лекция 10
Тема Многомерные массивы

Описание двумерного массива
Действия с несколькими массивами.
Обработка двумерного массива

1 Описание двумерного массива
В повседневной жизни довольно часто приходится иметь дело с информацией, которая представлена в табличной форме. Например, результат деятельности некоторой фирмы, торгующей автомобилями, может быть представлен в виде табл.
Колонки и (или) строки таблицы, как правило, состоят из однородной информации. Поэтому в программе, обрабатывающей табличные данные, имеет смысл использовать массивы для хранения и обработки таблиц.
В общем виде инструкция объявления двумерного массива выглядит так:
Имя: array[ НижняяГраница1..ВерхняяГраница1,
НижняяГраница2..ВерхняяГраница2] of Тип
где:
Имя имя массива;
array слово языка Delphi, указывающее, что объявляемый элемент данных является массивом;
НижняяГраница1, ВерхняяГраница1, НижпяяГраница2, ВерхняяГраница2 целые константы, определяющие диапазон изменения индексов и, следовательно, число элементов массива;
Тип тип элементов массива.
Пример:
itog: array [1..12, 1..6] of integer
Количество элементов двумерного массива можно вычислить по формуле:
(ВГ1-НГ1+1) х (ВГ2-НГ2+1):
где:
ВГ1 и ВГ2 верхняя граница первого и второго индексов;
НГ1 и НГ2 нижняя граница первого и второго индексов. Таким образом, массив itog состоит из 60 элементов типа integer.
Для того чтобы использовать элемент массива, нужно указать имя массива и индексы элемента. Первый индекс обычно соответствует номеру строки таблицы, второй номеру колонки. При работе с таблицами (массивами) удобно использовать инструкцию for. Например, фрагмент программы, вычисляющий количество проданных за год автомобилей одного наименования, выглядит так:
s := 0;
for j := 1 to 12 do
s := s + itog[2,j];
Следующий фрагмент программы вычисляет сумму элементов массива
s:=0;
for i := 1 to 6 do // шесть моделей автомобилей
for j := 1 to 12 do //12 месяцев s := s + itog[i,j];
В приведенном фрагменте программы каждый раз, когда внутренний цикл (цикл по j) завершается, во внешнем цикле значение i увеличивается на единицу и внутренний цикл выполняется вновь. Таким образом, к текущему значению переменной s последовательно прибавляются значения элементов массива itog: itog[l,l], itog[l,2], ..., itog[l,12], itog[2,l], itog[2,2], ..., itog[2,12] и т. д.
2 Действия с несколькими массивами
Организовать сложение элементов двух массивов.
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
Обработка двумерного массива
Программа должна вычислить общее количество медалей, завоеванных представителями каждой страны, и соответствующее количество очков (баллов), которое вычисляется по следующему правилу: за каждую золотую медаль команда получает семь очков, за серебряную шесть очков, за бронзовую пять очков.

Таблица 1. Значения свойства компонента StringGrid1
Свойство
Значение

Name
Tab1

ColCount
6

RowCount
14

FixedCols
0

FixedRows
1

Options . goEditing
TRUE

DefaultColWidth
65

DefaultRowHeight
14

GridLineWidth
1






procedure TForm1.FormActivate(Sender: TObject);
begin
tabl.Cells[0,0]:='Страна';
tabl.Cells[1,0]:='Золотых';
tabl.Cells[2,0]:='Серебряных';
tabl.Cells[3,0]:='Бронзовых';
tabl.Cells[4,0]:='Всего';
tabl.Cells[5,0]:='Баллов';
tabl.Cells[0,1]:='Австралия';
tabl.Cells[0,2]:='Белоруссия';
tabl.Cells[0,3]:='Великобритания';

tabl.Cells[0,13]:='Япония';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
c,r:integer; // номер колонки и строки таблицы
s:integer; // всего медалей у команды
p:integer; // очков у команды
m:integer; // номер строки с максимальным количеством очков
buf:array[0..5] of string; // буфер для обмена строк
i:integer; // номер строки используется во время сортировки
begin
for r:=1 to tabl.rowcount do // обработать все строки
begin
s:=0; // вычисляем общее кол-во медалей
for c:=1 to 3 do
if tabl.cells[c,r] <> ''
then s:=s+StrToInt(tabl.cells[c,r])
else tabl.cells[c,r]:='0';
// вычисляем количество очков
p:=7*StrToInt(tabl.cells[1,r])+6*StrToInt(tabl.cells[2,r])+5*StrToInt(tabl.cells[3,r]);
// вывод результата
tabl.cells[4,r]:=IntToStr(s); // всего медалей
tabl.cells[5,r]:=IntToStr(p); // очков
end; // сортировка таблицы по убыванию в соответствие с количеством баллов (по содержимому 5-ого столбца), сортировка методом выбора
for r:=1 to tabl.rowcount-1 do
begin
m:=r; // максимальный элемент - в r-ой строке
for i:=r to tabl.rowcount-1 do
if StrToInt(tabl.cells[5,i])>StrToInt(tabl.cells[5,m])
then m:=i;
if r <> m then
begin // обменяем r-ую и m-ую строки таблицы
for c:=0 to 5 do
begin
buf[c]:=tabl.Cells[c,r];
tabl.Cells[c,r]:=tabl.Cells[c,m];
tabl.Cells[c,m]:=buf[c];
end; end; end; end; end.
Сначала для каждой страны программа вычисляет общее количество медалей и соответствующее количество очков. Затем, используя метод простого выбора, программа выполняет сортировку таблицы по убыванию количества набранных очков. Во время сортировки для обмена строк таблицы используется строковый массив buf, индекс которого, как и индекс столбца таблицы, меняется от нуля до пяти (см. инструкцию объявления массива в тексте программы). Такой прием позволяет наиболее просто выполнить копирование замещаемой строки в буфер и замещение строки содержимым буфера.

На рис. 2 приведено диалоговое окно программы после завершения процесса обработки массива.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 2. Окно программы Итоги олимпиады



Лекция 11
Тема Программирование алгоритмов с использованием строк.
Символы
Строки

Символы
Для хранения и обработки символов используются переменные типа Ansichar и wideChar. Тип Ansichar представляет собой набор ANSI-символов, з котором каждый символ кодируется восьмиразрядным двоичным числом (байтом). Тип wideChar представляет собой набор символов в кодировке Unicode, в которой каждый символ кодируется двумя байтами.
Для обеспечения совместимости с предыдущими версиями поддерживается тип Char, эквивалентный AnsiChar.
Значением переменной символьного типа может быть любой отображаемый символ:
буква русского или латинского алфавитов;
цифра;
знак препинания;
И специальный символ, например, "новая строка".
Переменная символьного типа должна быть объявлена в разделе объявления переменных. Инструкция объявления символьной переменной в общем виде выглядит так:
Имя: char;
где:
имя имя переменной символьного типа;
char ключевое слово обозначения символьного типа.
Примеры:
otv: char; ch: char;
Как и любая переменная программы, переменная типа char может получить значение в результате выполнения инструкции присваивания. Если переменная типа char получает значение в результате выполнения операции присваивания, то справа от знака := должно стоять выражение типа char, например, переменная типа char или символьная константа символ, заключенный в кавычки.
В результате выполнения инструкций c1 := '*';
с2 := c1;
переменная c1 получает значение присваиванием значения константы, а переменная с2 присваиванием значения переменной cl (предполагается, что переменные c1 и с2 являются переменными символьного типа).
Переменную типа char можно сравнить с другой переменной типа char или с символьной константой. Сравнение основано на том, что каждому символу поставлено в соответствие число (см. приложение 2), причем символу 'о' соответствует число меньшее, чем символу У, символу 'А' меньшее, чем 'в', символу V меньшее, чем а. Таким образом, можно записать:
'0'<'1'<..<'9'<..<'A'<'B'<..<'Z'<'a'<'b'<..<'z'
Символам русского алфавита соответствуют числа большие, чем символам латинского алфавита, при этом справедливо следующее:
'А'<'Б'<'В'<..<'Ю'<'Я'<'а'<'б'<'в'<...<'э'<'ю'<'я'
В тексте программы вместо символа можно указать его код, поставив перед числом оператор #. Например, вместо константы 'в' можно записать #193. Такой способ записи, как правило, используют для записи служебных символов или символов, которые во время набора программы нельзя ввести с клавиатуры. К примеру, часто используемый при записи сообщений символ "новая строка" записывается так: #13.
В программах обработки символьной информации часто используют функции chr и Ord. Значением функции chr является символ, код которого указан в качестве параметра. Например, в результате выполнения инструкции c:=chr(32) переменной с будет присвоено значение пробел. Функция ord позволяет определить код символа, который передается ей в качестве параметра. Например, в результате выполнения инструкции k:=ord('*') переменная k будет содержать число 42 код символа *.
Программа, текст которой приведен в листинге, выводит таблицу кодировки букв русского алфавита. Вид окна программы представлен на рис..
Основную работу выполняет процедура обработки события OnActivate, которая формирует и выводит в поле метки (Label1) таблицу. Событие OnActivate происходит при активизации формы приложения, и поэтому процедура TForm1.FormActivate выполняется автоматически, сразу после появления формы на экране.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. Форма приложения во время работы
Листинг. Таблица символов
implementation
{$R *.DFM}
procedure TForm1.FormActivate(Sender: TObject);
var
st:string; // таблица формируется как строка символов
dec: byte; // код символа
i,j:integer; // номер строки и колонки таблицы
begin
st:='';
dec:=192;
for i:=0 to 15 do // шестнадцать строк
begin
dec:=i + 192;
for j:=1 to 4 do // четыре колонки
begin
st:=st+chr(dec)+'-'+IntToStr(dec)+' '; dec:=dec + 16;
end;
st:=st + #13; // переход к новой строке экрана
end;
Label1.caption:=st;
end;
end.
Форма приложения Таблица символов содержит только один компонент -поле метки (Label1l). Для того чтобы колонки таблицы имели одинаковую ширину, свойству Label1.Font.Name следует присвоить имя шрифта, у которого все символы имеют одинаковую ширину, например, courier New cyr.
Вид окна приложения во время работы приведен на рис.
2. Строки
Строки могут быть представлены следующими типами: shortstring, Longstring и widestring. Различаются эти типы предельно допустимой длиной строки, способом выделения памяти для переменных и методом кодировки символов.
Переменной типа shortstring память выделяется статически, т. е. до начала выполнения программы, и количество символов такой строки не может превышать 255. Переменным типа Longstring и widestring память выделяется динамически во время работы программы, поэтому длина таких строк практически не ограничена.
Помимо перечисленных выше типов можно применять универсальный cтроковый тип String. Тип String эквивалентен типу Shortstring.
Переменная строкового типа должна быть объявлена в разделе объявления переменных. Инструкция объявления в общем виде выглядит так:
Имя: String;
или
Имя: String [длина]
где:
имя имя переменной;
string ключевое слово обозначения строкового типа;
длина константа целого типа, которая задает максимально допустимую длину строки.
Пример объявления переменных строкового типа:
name: string[30];
buff: string;
Если в объявлении строковой переменной длина строки не указана, то ее длина задается равной 255 символам, т. е. объявления
stroka: string [255]; stroka: string;
эквивалентны.
В тексте программы последовательность символов, являющаяся строкой (строковой константой), заключается в одинарные кавычки. Например, чтобы присвоить строковой переменной parol значение, нужно записать:
parol:= 'Большой секрет';
или
parol:= '2001';
Следует обратить внимание, что инструкция parol:=2001; неверная, т.к. тип константы не соответствует типу переменной. Во время компиляции этой инструкции будет выведено сообщение: incompatible types: 'Char' and 'Integer' (типы Char и Integer несовместимы).
Используя операции =, <, >, <=, >= и о, переменную типа string можно сравнить с другой переменной типа string или со строковой константой. Строки сравниваются посимвольно, начиная с первого символа. Если все символы сравниваемых строк одинаковые, то такие строки считаются равными. Если в одинаковых позициях строк находятся разные символы, большей считается та строка, у которой в этой позиции находится символ с большим кодом. В табл. приведены примеры сравнения строк.
Таблица . Сравнение строк
Строка 1
Строка 2
Результат сравнения

Иванов
Иванов
Строки равны

Васильев
Васильев
Строка 1 больше строки 2

Алексеев
Петров
Строка 1 меньше строки 2

Иванова
Иванов
Строка 1 больше строки 2

Кроме операции сравнения, к строковым переменным и константам можно применить операцию сложения, в результате выполнения которой получается новая строка. Например, в результате выполнения инструкций
f irst__name: ='Иван' ;
last_name:='Иванов';
ful_name:=first_name+last_name;
переменная fui_name получит значение 'Иван Иванов'.
Операции со строками
В языке Delphi есть несколько полезных при работе со строками функций и процедур. Ниже приведено их краткое описание и примеры использования.
Функция length
Функция length возвращает длину строки. У этой функции один параметр выражение строкового типа. Значением функции length (целое число) является количество символов, из которых состоит строка.
Например, в результате выполнения инструкций
n:=length('Иванов');
m:=length(' Невский проспект ');
значение переменных n и m будет равно 6 и 20.
Процедура delete
Процедура delete позволяет удалить часть строки. В общем виде обращение к этой процедуре выглядит так:
delete(Строка, р, п)
где:
Строка переменная или константа строкового типа;
р номер символа, с которого начинается удаляемая подстрока;
п длина удаляемой подстроки.
Например, в результате выполнения инструкций
p:='Город Санкт-Петербург';
delete(s,7,6);
значением переменной s будет строка ' город Петербург'.
Функция роs
Функция роз позволяет определить положение подстроки в строке. В общем виде обращение к функции выглядит так:
pos (Подстрока,Строка) ;
где Подстрока строковая константа или переменная, которую надо найти в строковой константе или переменной строка.
Например, в результате выполнения инструкции
р := pos('Пе','Санкт-Петербург');
значение переменной р будет равно 7. Если в строке нет искомой подстроки, то значение функции роз будет равно нулю.
Ниже приведена инструкция while, в результате выполнения которой удаляются начальные пробелы из строки st.
while(pos(' ',st) = 1) and(length(st) > 0) do delete (st,1,1);
Пробелы удаляет инструкция delete (st, i, i), которая выполняется в цикле до тех пор, пока первым символом строки является пробел (в этом случае значение роs (' ',st) равно единице). Необходимость проверки условия length (st) > 0 объясняется возможностью того, что введенная строка состоит только из пробелов.
Функция сору
Функция сору позволяет выделить фрагмент строки. В общем виде обращение к функции сору выглядит так:
сору( Строка, р, п ) где:
строка выражение строкового типа, содержащее строку, фрагмент которой надо получить;
р номер первого символа, с которого начинается выделяемая подстрока;
n длина выделяемой подстроки. Например, в результате выполнения инструкций
st:= 'Инженер Иванов'; fam:=copy(st, 9, 6) ;
значением переменной fam будет строка 'Иванов1.

Лекция 12
Тема Обработка ошибок
Исключительные ситуации
Ошибки при использовании массивов

Исключительные ситуации
Начальная стадия разработки программ неизбежно связана с ошибками. Особенно часты в интерактивных приложениях логические ошибки. Обычно они являются результатом того, что разработчик не учел всех возможных вариантов действий пользователя во время работы с программой. Последствия ошибок могут быть любыми от диагностических сообщений до полного сбоя всей системы.
В Ое1рhi предусмотрен механизм обработки любых ошибок исполнения логических, математических, ошибок памяти и даже отказов в работе аппаратуры. Ве1рhi воспринимает ошибки как исключительные ситуации. Разработчик имеет возможность создавать собственные типы исключительных ситуаций и обрабатывать их. Обработка ошибок исполнения это, по существу, оборонительная техника программирования. Важное значение при обсуждении данного вопроса имеет понятие «исключительная ситуация».
Исключительные ситуации, или исключения, изменения в условиях выполнения программы, которые вызывают остановку процесса ее исполнения для специально разработанной подпрограммы, предназначенной для обработки определенных ошибок. Во время работы программы операционная система или аппаратура могут в любое время создать исключительную ситуацию. Программе при этом сообщается, что появилось исключение, которое может быть обработано либо ею самой, либо обработчиком, используемым по умолчанию.
Исключения могут возникнуть в результате нехватки памяти, искажения данных, безуспешной попытки обращения к внешнему устройству, а также в результате вычислений. Предоставляемая Ое1рhi возможность перехвата исключительных ситуаций позволяет избегать традиционного оборонительного стиля программирования, который требует частой проверки на наличие ошибок.
Этот контроль загромождает программу и затрудняет обозрение команд, реализующих основной алгоритм. Разработчик имеет возможность разделить операторы, обеспечивающие нормальную работу программы и выполняемые при возникновении исключения. В последнем случае исполнение программы передается блоку обработки исключений, который либо исправляет ошибку, либо совершает некоторые завершающие операции перед окончанием ее работы.
Исключение исполняется, когда появляется стандартная ошибка либо когда приложение или используемый в нем компонент явно объявляет об исключительной ситуации. Исключение находится в состоянии исполнения, пока не будет обработано. Программе безразличны обстоятельства, приведшие к нему. Она обрабатывает исключительную ситуацию независимо от причины ее возникновения.
Ое1рhi-программа обрабатывает исключения с помощью специальных языковых конструкций. В языке определены два типа таких конструкций: Тгу...Ехсерt и Тгу...Fina11у.
Ое1рhi-программы имеют встроенный механизм обработки исключений по умолчанию, которой в некоторых случаях может оказаться вполне достаточно. Она заключается в выводе на экран сообщения, после чего может следовать немедленное прекращение работы всего приложения.
Программное управление состоит во включении в код программы команд обработки и контроля за исключительной ситуацией. Оно должно использоваться, например, для сохранения данных, закрытия файлов, освобождения памяти и т. п.
Чтобы заставить Ое1рhi-программу использовать механизм управления исключениями, разработчик должен разместить выполняемые команды внутри блока Тгу. Если разработчик хочет предусмотреть безопасное завершение программы при возникновении исключения, он может воспользоваться блоком Тгу..Fina11у, который выполняет операцию Fina11у вне зависимости от того, появилась исключительная ситуация или нет. Это могут быть обычные операции закрытия таблиц, освобождения файловых переменных или выделенной задаче памяти.
Блок Тгу...Ехсерt, наоборот, выполняет операцию Ехсерt только в случае появления исключительной ситуации. В отличие от операторов Fina11у операторы Ехсерt обеспечивают специальную обработку в случае возникновения исключительных ситуаций, они могут также выполнять такие задачи, как закрытие таблиц, освобождение файловых переменных или памяти.
Синтаксис блока Тгу...Finа11у можно схематически изобразить следующим образом:
Операторы, расположенные за словом Тгу, возможные источники исключений. Команды, следующие за словом Fina11у, выполняются немедленно независимо от возникновения исключительной ситуации.
Исключительная ситуация может возникнуть при безуспешной попытке открыть файл или при сбое операции чтения/записи. В любом случае после работы с файлом файловые буфера должны быть закрыты, а буферные области памяти освобождены. Это делается в секции Fina11у независимо от появления исключения.
Операторы, следующие за словом Тгу, представляют собой потенциальный источник исключительных ситуаций. После слова Ехсерt записаны специальные операторы для обработки конкретных видов исключений. Оператор после слова Е1sе обработчик ошибок по умолчанию.

Ниже приведены примеры обработчиков исключительных ситуаций из стандартной библиотеки (табл. 1).
Таблица 1

Обработчикr
Причина
Сообщение

EOutOf Memory
Нехватка памяти
Out Of Memory

EFileNotFound
Файл не найден
File Not Found

EinvalidFileName
Неверное имя файла
Invalid File Name

ETooManyOpenFiles
Много открытых файлов
Too Many Open Files

EInvalidInput
Ввод не верного числа значений
Invalid Input

EDivZero
Деление на ноль
Div Zero

EInvalidOp
Не верная операция с плавающей точкой
Invalid Op

EInvalidCast
Не верное преобразование типов
Invalid Cast


2 Ошибки при использовании массивов
При использовании массивов наиболее распространенной ошибкой является выход значения индексного выражения за допустимые границы, указанные при объявлении массива.
Если в качестве индекса используется константа, и ее значение выходит за допустимые границы, то такая ошибка обнаруживается на этапе компиляции программы. Например, если в программе объявлен массив
day : array[0..6] of string[ll],
то во время компиляции программы инструкция
day [7] := 'Воскресенье';
будет помечена как ошибочная.
Если для доступа к элементу массива в качестве индекса используется переменная или выражение, то возможно возникновение ошибки (исключения) времени выполнения программы. Например, если в программе объявлен массив
tab1: array [1..N] of integer;
то инструкция
for i:=0 to N do tab1[i] := 5;
формально является верной, и ее компиляция будет успешно выполнена.
Однако во время выполнения программы, при попытке присвоить значение несуществующему нулевому элементу массива tab, на экран будет выведено сообщение об ошибке. Вид окна и текст сообщения зависит от того, откуда запущена программа.
При запуске рассматриваемой программы из Delphi возникает исключение, и сообщение имеет вид, приведенный на рис. 1
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 1. Сообщение об ошибке при обращении к несуществующему элементу массива (программа запущена из Delphi)
Если программа запущена из Windows, то при попытке присвоить значение несуществующему элементу массива на экран будет выведено сообщение Range check error (ошибка контроля диапазона). В заголовке окна будет указано имя приложения, в процессе выполнения которого произошла ошибка (рис. 2).
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 2 Сообщение об ошибке при обращении к несуществующему элементу массива (программа запущена из Windows)


Лекция 13
Тема ОСНОВНЫЕ ОТЛИЧИЯ РАЗЛИЧНЫХ ВЕРСИЙ DELPHI
Версия1
Версия2
Версия3
Версия4
Версия5
Версия6
За сравнительно небольшой срок корпорация Borland выпустила 6 основных версий и несколько модификаций Delphi.
1. ВЕРСИЯ 1
Первая версия появилась в мае 1995 г., когда еще не существовала Windows 95 (но тем не менее существовала Windows NT). Это единственная версия, работающая под управлением 16-разрядной Windows 3.1 (3.11). В ней впервые была опробована новая модель объектов, позаимствованная из различных объектно-ориентированных языков, и главным образом, из языка C++. Эта модель оказалась настолько революционной, что существовавшие в то время в поздних версиях Turbo Pascal объекты стали не нужны (их возможности полностью поглотила новая модель), а сама новая модель получила название классов.
Классы активно используют динамическую память, в связи с чем несколько изменилась нотация языка, а сам язык был назван Object Pascal. По сравнению с Turbo Pascal в него были внесены существенные дополнения и изменения, в том числе (здесь и далее перечисляются лишь наиболее важные, с моей точки зрения, изменения): 
введены открытые массивы и их конструкторы для передачи в подпрограммы массивов переменной длины;
введена внутренняя для функции переменная Result и разрешено игнорировать возвращаемый функцией результат;
сняты ограничения на тип возвращаемого функцией результата (этот тип может быть любым, за исключением объектов старого стиля и файлов);
введен механизм обработки исключительных ситуаций.
Библиотека компонентов 1-й версии с самого начала показала основную направленность вновь разработанной системы: программирование баз данных. С этой целью первая и все последующие версии Delphi снабжаются специальным инструментом доступа к данным -BDE (Borland Database Engine - машина баз данных корпорации Borland), а также сервером баз данных InterBase (этот сервер производится филиалом Borland - компанией InterBase Software Corporation) и соответствующими средствами конфигурации сервера, его контроля и связи с ним.
Палитра компонентов первой версии состоит из 9 страниц и содержит 79 компонентов. В качестве дополнительных утилит поставлялись система генерации отчетов ReportSmith v.2.5 и входящая в ее состав автономно запускаемая утилита ReportSmith Run Time Viewer, утилита доступа к данным DatabaseDesktop v.5.1 и утилита конфигурации BDE - Database Engine Configuration v.2.5. Кроме того, утилиты WinSighte и WinSpecter предназначались для упрощения отладки разрабатываемых программ в среде 16-разрядных ОС Windows 3-х.
1.2. ВЕРСИЯ 2
Вторая и все последующие версии Delphi предназначены для работы под управлением 32-разрядных ОС Windows 95/98/2000/NT (Windows 32). В нее были внесены многочисленные изменения, связанные с переходом на качественно новую ОС, в том числе:
введена поддержка 16-битных (“широких”) символов и составленных из них строк;
введен новый формат строк “обычных” 8-битных символов произвольной длины;
введены новые типы данных - variant и currency;
введен механизм фильтрации в табличные наборы данных TTable.
Начиная с версии 2, Delphi поставляется в нескольких комплектациях, отличающихся набором инструментальных средств и компонентов. Это соответствует более гибкой ценовой политике: минимальная по возможностям комплектация стоит 200-300 долларов, в то время как цена наиболее мощной комплектации может достигать нескольких тысяч. Во 2-й версии таких комплектов было 3: Desktop, Professional и Client/Server Suite. Далее описываются возможности наиболее мощной комплектации Client/Server Suite.
Среда разработки обогатилась Репозиторием Объектов и множеством полезных программ-экспертов (Wizards).
К утилитам добавлена весьма эффективная программа SQL Explorer v.1.02, существенно облегчающая операции с базами данных, и программа переноса данных Data Migration Expert, упрощающая переход к архитектуре клиент-сервер. Утилиты ReportSmith и DatabaseDesktop представлены более совершенными версиями 3.0 и 7.1 соответственно. Утилита Database Engine Configuration предыдущей версии переименована в BDE Configuration v.3.0. Введена утилита Image Editor v.2.0, служащая для создания различного рода изображений (произвольных рисунков, пиктограмм и курсоров), которые можно включать в файл ресурсов и использовать в работающей программе, и утилита SQL Monitor v.1.0, позволяющая просматривать SQL-запросы в процессе выполнения программы.
На 12 страницах галереи компонентов расположены 114 стандартных компонентов. В том числе на странице QReport размещены удобные компоненты для создания отчетов по хранящимся в базах данным. Эти компоненты оказались значительно эффективнее специальной утилиты ReportSmith, в связи с чем эта утилита не входит в поставку версии 3 и выше.
1.3. ВЕРСИЯ 3
Мне довелось довольно долго работать с вышедшей в июне 1997 г. версией 3, и у меня сложилось мнение, что это одна из наиболее надежных версий Delphi.
Основные новшества этой версии:
использование механизма пакетов для облегчения распространения и повторного использования компонентов;
улучшенные свойства редактора кода: построение фрагментов кода по образцу; оперативная подсказка о типе и количестве формальных параметров при обращениях к подпрограммам; оперативный просмотр в режиме отладки содержимого полей, свойств и переменных с помощью указателя мыши;
поддержка шаблонов компонентов;
поддержка технологий СОМ, ActiveX, OLEnterprice и (частично) CORBA.
Третья версия поставлялась в 4 комплектациях: Standard, Professional, Client/Server Suite и Enterprise.
Состав утилит комплектации Client/Server Suite не изменился по сравнению с предыдущей версией, но изменились названия некоторых из них: BDE Configuration в этой и последующих версиях называется BDE Administrator, a Data Migration Expert - Data Migration Wizard. Ha 13 страницах галереи компонентов размещены 148 стандартных компонента. В модификации 3.5 введены дополнительные компоненты для реализации многозвенных баз данных.
1.4. ВЕРСИЯ 4
Появившаяся в июле 1998 г. 4-я версия Delphi быстро завоевала широкую популярность как своими расширенными языковыми возможностями, так и специальной поддержкой многозвенных баз данных и распределенных вычислений.
К основным нововведениям этой версии относятся:
изменения в языке: динамические массивы, перегружаемые методы, умалчиваемые параметры подпрограмм, новые типы int64, Real48 и Real как аналог Double;
изменения в кодовом редакторе: автоматическое завершение кодовых заголовков свойств и методов; свойства браузера для поиска исходного кода; простой переход от заголовка метода к его реализации и обратно;
технология “причаливания” инструментальных панелей Drag&Dock;
механизм “действий” Action для унификации внешнего вида и поведения одинаковых по функциональному назначению интерфейсных элементов;
улучшенная поддержка многозвенной архитектуры БД и распределенных вычислений.
На 14 страницах палитры компонентов размещены 182 стандартных компонента. В поставке Client/Server Suite утилита Data Migration Wizard получила название Data Pump.
1.5. ВЕРСИЯ 5
В июле 1999 г. вышла пятая по счету версия Delphi, основная особенность которой - попытка заменить громоздкий и не всегда быстрый механизм доступа к данным BDE, который традиционно использовался во всех предыдущих версиях, альтернативными механизмами.
Для этого, во-первых, в Delphi 5 включена поддержка технологии ADO (ActiveX Data Objects - объекты данных, построенные как объекты ActiveX), которая усиленно развивается корпорацией Microsoft.
Во-вторых, сотрудники Borland и его подразделения InterBase Software Corporation разработали серию компонентов облегченного доступа к данным, хранящимся в таблицах сервера InterBase v.5.5 и выше (страница InterBase палитры компонентов). Эти компоненты также не требуют BDE и, таким образом, создают “облегченное” клиентское место.
Менее значительные изменения, внесенные в версию 5:
включен эксперт создания и настройки произвольных модулей данных с расширенными возможностями представления взаимосвязи данных;
улучшена технология MIDAS: для более гибкой работы с Microsoft Transaction Server введен повторно-входимый (stateless) брокер данных; упрощен процесс разработки интранет-приложений за счет компонентов новой страницы InternetExpress;
значительные изменения внесены в интегрированную среду разработчика ИСР; в том числе:
для улучшения координации коллективной работы над одним проектом введен новый инструмент - список To-Do;
программист теперь может при желании использовать несколько вариантов настройки основных окон Delphi - например, для режима кодирования на экране могут не присутствовать отладочные окна, которые, наоборот, могут понадобиться в отладочном режиме; нужный вариант настройки легко выбирается новыми интерфейсными элементами в главном окне Delphi;
введены фильтрующие свойства в окне Инспектора Объектов, упрощающие выбор нужного свойства;
опции Инспектора Объектов теперь могут снабжаться небольшими пиктограммами, облегчающими правильный выбор нужной опции (например, радом с названием каждого цвета показывается небольшой прямоугольник, заполненный этим цветом, рядом с названием курсора - его вид и т. п.); существенно усилены возможности встроенного отладчика: точки отладочного останова можно группировать и сделать доступной или недоступной сразу группу точек; с каждой точкой останова можно связать одно или несколько действий, которые будут выполняться при достижении этой точки; с помощью команды Run | Attach to process можно отлаживать процесс, запущенный в другом экземпляре ИСР (эта возможность существенно упрощает отладку многозвенных приложений); с помощью выбора Run | Run Until Return в главном меню можно продолжить пошаговую отладку после завершения текущей подпрограммы и т. д.;
введены дополнительные возможности в Менеджер Проекта, упрощающий координацию многих разработчиков в рамках единого проекта;
создан механизм Менеджера Трансляций, облегчающий разработку многоязычных программ в рамках единого проекта;
внесены изменения в кодовый редактор, позволяющий настраивать используемые в нем “горячие” клавиши;
несколько переработана встроенная справочная служба;
внесены многочисленные изменения и дополнения в галереи компонентов (в новой версии наиболее мощной комплектации Enterprise на 20 страницах расположены 218 стандартных компонентов). Версия поставляется в 3 комплектациях: Standard, Professional и Enterprise. Состав утилит, входящих в комплектацию Enterprise, полностью соответствует утилитам комплектации Client/Server Suite предыдущей версии.
1.6. ВЕРСИЯ 6
Версия 6 вышла в мае 2001 г., т. е. почти через 2 года после выхода 5-й версии. Эту задержку можно объяснить тем, что параллельно с работой над новой версией Delphi шла разработка варианта Delphi для ОС Linux - эта система программирования вышла в феврале 2001 г. и получила название Kylix. В результате 6-я версия Delphi имеет уникальную особенность: она способна создавать так называемые'межплатформенные приложения, т. е. программы, которые одинаково успешно могут работать как под управлением Windows 32, так и под Linux.
Напомню читателю предысторию, связанную с этой ОС. Еще в самом начале 70-х годов в Bell Laboratories была создана переносимая система UNIX. Переносимость системы, т. е. ее способность миграции на различные аппаратные платформы, обеспечивалась тем, что практически вся она была написана на специально для этой цели разработанном языке С. Более того, почти весь компилятор этого языка был также написан на С! В результате для переноса ОС на новую аппаратную среду нужно было закодировать лишь сравнительно небольшой машинно-зависимый участок С, после чего транслировался исходный код компилятора, а затем и системы в целом. Таким образом, ОС UNIX принципиально существовала в исходных текстах, доступных широкому кругу программистов. Это обстоятельство использовали многие фирмы, создав собственные версии UNIX-подобных ОС, но уже не предоставляя пользователям исходные коды (например, ОС Solaris фирмы Sun).
До появления Kylix единственными средствами программирования для Linux были системы на языках C/C++, Basic, Fortran. Kylix, а следом за ней - Delphi 6, открывают богатейшие возможности VCL (вариант которой под Linux/Windows называется CLX - Borland Component Library for Cross-Platform Application) для разработки прикладных программ для Linux, что позволяет говорить об этой ОС как о потенциальном и весьма опасном конкуренте Windows.
Две другие особенности Delphi 6 также достойны особого упоминания: в ней сделаны дальнейшие шаги для поддержки Web-программирования (архитектура websnap) и разработаны драйверы и компоненты для максимально быстрой связи клиентских мест с некоторыми популярными промышленными серверами баз данных без BDE (компоненты страницы dbExpress).
Архитектура WebSnap продолжает и развивает ранее существовавшую в версиях 4 и 5 технологию Web Broker для создания Web-приложений. В ее основе лежит использование протокола SOAP (Simple Object Access Protocol - простой протокол доступа к объекту). В сочетании с бесплатно распространяемым Web-сервером Apache эта технология позволяет отказаться от дорогостоящих средств Windows NT Server и Internet Information Server в пользу связки Linux + Apache.
Таким образом, основной идей Delphi 6 является обеспечение перехода от дорогих патентованных решений корпорации Microsoft к бесплатным (или почти бесплатным) решениям на базе Linux.
На 27 страницах палитры компонентов размещены 387 компонентов (в режиме CLX - 211 компонентов на 21 странице).

Лекция 14
Тема Другие языки объектно-ориентированного программирования

1. Си
·мула-67
2. Java
3. А
·да
4. Visual DataFlex 
1. Си
·мула-67 (Simula 67) первый объектно-ориентированный язык программирования. Разработан в конце 60-х сотрудниками Норвежского Вычислительного Центра (Осло) Кристеном Нюгором и Уле-Йоханом Далем для моделирования сложных систем.
Simula 67 явилась первым языком с встроенной поддержкой основных механизмов объектно-ориентированного программирования. Этот язык в значительной степени опередил своё время, современники (программисты 60-х годов) оказались не готовы воспринять ценности языка Simula 67, и он не выдержал конкуренции с другими языками программирования. Прохладному отношению к языку Simula 67 способствовало и то обстоятельство, что его реализация была весьма.
Тем не менее этот язык активно использовался в образовательном процессе высших учебных заведений, особенно в Скандинавии. В современной терминологии Simula 67 можно охарактеризовать как объектное расширение Algol 60. Более всего в Simula 67 поражает сходство с современными языками: пожалуй, единственными существенными лакунами по сравнению с Java являются отсутствие интерфейсов и невозможность для объекта иметь более одного конструктора.
2. Java объектно-ориентированный язык программирования, разрабатываемый компанией Sun Microsystems с 1991 года и официально выпущенный 23 мая 1995 года. Многие люди, говоря на русском, называют язык «Ява» по аналогии с географическим названием.
Java так называют не только сам язык, но и платформу для создания приложений уровня предприятий на основе данного языка.
Изначально новый язык программирования назывался Oak (James Gosling) и разрабатывался для бытовой электроники, но впоследствии был переименован в Java и стал использоваться для написания приложений и серверного программного обеспечения.
Программы на Java могут быть транслированы в байт-код, выполняемый на виртуальной java-машине (JVM) программе, обрабатывающей байтовый код и передающей инструкции оборудованию, как интерпретатор, но с тем отличием, что байтовый код в отличие от текста обрабатывается значительно быстрее.
Достоинство подобного способа выполнения программ в полной независимости байт-кода от ОС и оборудования, что позволяет выполнять Java приложения на любом устройстве, которое поддерживает виртуальную машину. Другой важной особенностью технологии Java является гибкая система безопасности, благодаря тому, что исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание. Это позволяет пользователям загружать программы, написанные на Java, на их компьютеры (или другие устройства, например, мобильные телефоны) из неизвестных источников, при этом не опасаясь заражения вирусами, пропажи ценной информации, и т. п.
Часто к недостаткам этого подхода относят то, что исполнение байт-кода виртуальной машиной может снижать производительность программ и алгоритмов, реализованных на языке Java. Данное утверждение справедливо для первых версий виртуальной машины Java, однако в последнее время оно практически потеряло актуальность. Этому способствовал ряд усовершенствований: применение технологии JIT (Just-In-Time compilation), позволяющей переводить байт-код в машинный код во время исполнения программы с возможностью сохранения версий класса в машинном коде, широкое использование native-кода в стандартных библиотеках, а также аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).
Внутри Java существуют три основных семейства технологий:
J2EE или Java EE (начиная с v1.5) Java Enterprise Editon, для создания программного обеспечения уровня предприятия;
J2SE или Java SE (начиная с v1.5) Java Standard Editon, для создания пользовательских приложений, в первую очередь для настольных систем;
J2ME, Java ME или Java Micro Edition, для использования в устройствах, ограниченных по вычислительной мощности, в том числе мобильных телефонах, PDA, встроенных системах
Самыми популярными считаются серверные технологии семейства [ Cкачайте файл, чтобы посмотреть ссылку ]. Здесь Java действительно держит мировое лидерство.
Последним релизом является версия 1.6, в которой было произведено улучшение системы безопасности, улучшение поддержки XML и скриптового языка Mozilla Rhino, улучшена интеграция с рабочим столом, добавлены некоторые новые возможности в создании графических интерфейсов.
Прежняя версия JVM от Microsoft (аналог SUN JVM v.1.1.3) во многом отступает от стандартов языка, предложенных Sun Microsystems, с целью проприетарной поддержки платформы Windows. Впоследствии это явилось поводом для судебных исков со стороны Sun Microsystems к Microsoft. Суд принял сторону компании Sun Microsystems. В настоящее время между двумя компаниями достигнуты договорённости вплоть до снятия взаимных судебных претензий и произведено взаимное кросс-лицензирование технологий. По версии Microsoft будет поддерживаться спецификация MS-J# соответствующая спецификации SUN-JVM J2SE.
Следующие успешные проекты реализованы с привлечением Java ([ Cкачайте файл, чтобы посмотреть ссылку ]) технологий: Amazon, eBay, Flickr, Google (Gmail), Yandex, LinkedIn.
Следующие компании в основном фокусируются на Java ([ Cкачайте файл, чтобы посмотреть ссылку ]) технологиях, а не на .NET, хотя имеют дело также и с последними: SAP, IBM, Oracle.
3. А
·да (Ada)  язык программирования, созданный в 19791980 годах в результате проекта, предпринятого Министерством обороны США с целью разработать единый язык программирования для так называемых встроенных систем (то есть систем управления автоматизированными комплексами, работающими в реальном времени). Имелись в виду, прежде всего, бортовые системы управления военными объектами (кораблями, самолётами, танками, ракетами, снарядами и т. п.). Перед разработчиками не стояло задачи создать универсальный язык, поэтому решения, принятые авторами Ады, нужно воспринимать в контексте особенностей выбранной предметной области.
Особенности языка
Ада  это структурный, модульный, объектно-ориентированный язык программирования, содержащий высокоуровневые средства программирования параллельных процессов. Синтаксис Ады унаследован от языков типа Algol или Паскаль, но расширен, а также сделан более строгим и логичным. Ада  язык со строгой типизацией, в нём исключена работа с объектами, не имеющими типов, а автоматические преобразования типов сведены к абсолютному минимуму.
Из особенностей синтаксиса можно отметить:
Язык регистро-независимый.
Программы модульные, механизм контроля импорта-экспорта описаний между модулями включает две разные директивы: одну для подключения другого модуля (with), другую  для импорта его описаний (use).
Пакеты (один из типов модулей) могут содержать заголовок и личную часть  то, что содержится в ней, не экспортируется и другим модулям недоступно.
Поддерживается механизм обобщённых (настраиваемых) модулей: пакетов, процедур и функций, позволяющих описывать обобщённые алгоритмы обработки данных без указания конкретного типа.
Развитая система типов, как встроенных, так и порождаемых программистом. Есть множество способов создания новых типов, язык поддерживает два разных понятия: «подтип» и «производный тип». Переменные типа и подтипа совместимы, переменные типа и его производного типа  нет.
Средства обработки исключений.
Развитые средства обращения к процедурам и функциям: поддерживаются входные и выходные параметры, передача фактических параметров в произвольном порядке с указанием имён формальных, параметры со значениями по умолчанию.
Поддерживается переопределение процедур, функций и операторов  создание нескольких вариантов процедуры, функции или оператора с одним и тем же именем, но различными сигнатурами (типами и количеством параметров).
Встроенные в язык конструкции поддержки параллельного программирования: поддерживаются понятия «задача» (параллельно выполняемый фрагмент программы), «вход задачи» (средство синхронизации и коммуникации параллельно выполняющихся задач), поддерживается механизм «рандеву» (протокол взаимодействия параллельно выполняемых задач через вход одной из них), имеется оператор выбора SELECT для организации условного межпотокового взаимодействия (выбора параллельной задачи, с которой следует взаимодействовать, в зависимости от готовности к рандеву и некоторых других условий). В принципе, имеющихся в языке средств параллельного программирования достаточно для решения большого класса задач, требующих параллельной обработки, без обращения к внешним средствам, таким как дополнительные библиотеки или API операционной системы.
Для удовлетворения требованиям надёжности язык построен таким образом, чтобы как можно большее количество ошибок обнаруживалось на этапе компиляции. Кроме того, одним из требований при разработке языка была максимально лёгкая читаемость текстов программ, даже в ущерб лёгкости написания. Результатом такого подхода стал несколько «тяжеловесный» синтаксис и множество ограничений, отсутствующих в наиболее распространённых промышленных языках (С и C++) и часто воспринимаемых профессиональными программистами как избыточные, например, та же строгая типизация. Это привело к формированию представления об Аде как о сложном, малопонятном и неудобном в использовании языке.
История
Разработка языка была проведена в рамках международного конкурса, организованного и профинансированного министерством обороны США. Целью разработки было получение языка программирования, который мог бы стать единым для разработки проектов по заказам военного ведомства, главным образом, для разработки встроенных систем военного назначения и для больших военных компьютеров (на базе процессора iAPX 432 от Intel). Работа началась в 1975 году, с формированию набора требований к языку, который бы в полной мере удовлетворил разработчиков систем указанного типа. Первоначальный список требований, выпущенный под кодовым наименованием «Соломенный», был представлен на рецензию в ряд организаций и фирм, в течение двух лет последовательно уточнялся, в конечном счёте превратившись в итоговый документ под названием «Стальной».
После завершения формирования требований был проведён анализ, который показал, что ни один из имеющихся языков программирования не удовлетворяет требованиям в достаточной мере, так что было принято решение разработать новый язык. Конкурс на его создание был объявлен в 1977 году, разработчикам было предложено базироваться на одном из трёх языков: Паскаль, Алгол-68 или PL/1.
Из представленных на конкурс 15 проектов было отобрано 4 (все основаны на Паскале). Эти проекты были отправлены на дальнейшую доработку. На следующем этапе из 4 проектов отобрали два, из которых, после очередной доработки, был выбран один. Этот язык получил наименование «Ада»  разработавшая его группа под руководством француза Жана Ишбиа дала языку название в честь Огасты Ады Кинг Лавлейс (дочери поэта Дж. Байрона), которая считается первым программистом в мире за разработку программ для вычислительной машины Бэббиджа.
В 1983 году язык был официально стандартизован ANSI. Стандарт языка ANSI/MIL-STD-1815-A-1983 был утверждён 17 февраля 1983 года. МО США сделало наименование «Ada» зарегистрированной торговой маркой, запретив выпускать трансляторы языка, не прошедшие официальную процедуру тестирования на соответствие стандартам. Процедура состояла в прогоне через тестируемый компилятор большого количества (более 1000) тестовых программ (так называемый комплект ACVC), для каждой из которых был однозначно определён результат тестирования: либо удачная компиляция, либо выдача вполне конкретного сообщения об ошибке. Тестирование проводилось по принципу «всё или ничего»  при ошибке в обработке хотя бы одного тестового примера компилятор считался не прошедшим тест, причём тестирование было действительно только на той аппаратной и программной платформе, на которой оно проводилось. Таким образом была в зародыше подавлена возможность образования «версий» или «диалектов» языка Ада.
В 1987 году язык Ада был официально стандартизован ISO. С этого момента МО США предоставило язык в публичное распоряжение.
К 1990 году в мире существовало уже около 200 компиляторов, соответствовавших стандарту языка Ада.
В 1995 году был принят новый стандарт Ады, известный как Ada95. В язык были введены средства объектного программирования. Кроме того, язык был дополнен более развитыми средствами для взаимодействия с программами, написанными на других языках.
В марте 2007 года опубликованы изменения в стандарте Ады. Они коснулись, в основном, возможностей объектно-ориентированного программирования: введены интерфейсы, принят обычный для большинства гибридных языков синтаксис вызова метода, внесён ещё ряд дополнений.
4. Visual DataFlex  старейший высокоуровневый язык программирования, разрабатываемый компанией Data Access Corporation и предназначенный для быстрого создания (RAD) приложений баз данных, в архитектуре клиент-сервер. Visual DataFlex используется для построения высоко надежного корпоративного программного обеспечения, коммерческих продуктов в среде Microsoft Windows, Web и Web-сервисов. Установка Visual DataFlex включает инструменты визуального проектирования, богатую библиотеку классов, компилятор и отладчик, встроенную базу данных, драйвера для доступа к наиболее популярным СУБД, а так же, производительный и масштабируемый сервер Web-приложений (Web Application Server).
Visual DataFlex  это современный, объектно-ориентированный язык программирования 4-го поколения с собственной средой визуального проектирования.
Краткая история
Первая версия DataFlex (прародителя Visual DataFlex) появилась в конце 1970-х годов и являлась одним из первых тиражных процедурных языков программирования и СУБД. В середине 80-х годов XX-го века была выпущена одна из самых совершенных на тот момент версий системы  DataFlex 2.3b, которая получила очень широкое распространие и популярность, поднявшая компанию Data Access в первую сотню рейтинга ИТ компаний.
В 1991 году вышла первая объектно-ориентированная версия языка  DataFlex 3.0. универсальность и удобство использования существенно расширили области применения системы.
Первая версия для Microsoft Windows была выпущена в середине 1990-х годов (DataFlex for Windows 3.51), однако не получила широкого распространения вплоть до выхода первой полнофункциональной версии Visual DataFlex 4. С этого момента Visual DataFlex стал стандартом для большого числа компаний-разработчиков программного обечпечения.
Программы, созданные на Visual DataFlex используются более чем на 450 тысячами предприятий и организаций, работающих в области здравоохранения, транспорта, промышленного производства, экономики и финансов, дистрибуции, страхования, сельского хозяйства, армии, полиции и многих других.
Отличительные особенности
Быстрая, простая разработка программ в визуальном режиме
Встроенный сервер Web-приложений
Поддержка Интернет-приложений в среде Windows
Возможность приложениям Windows использовать Интернет
Создание Web-сервисов и архитектуры на основе сервисов
Все элементы управления поддерживают работу с базой данных на уровне ядра языка
Простая интеграция компонентов COM и ActiveX
Высокий уровень поддержки целостности баз данных
Многопользовательский режим без написания дополнительного кода
Многократное использование компонентов программ




II СЕМЕСТР

Лекция 15
Тема Графические возможности

Карандаш
Кисть
Вывод текста
1 Карандаш
Delphi позволяет программисту разрабатывать программы, которые могут выводить графику: схемы, чертежи, иллюстрации.
Программа выводит графику на поверхность объекта (формы или компонента Image). Поверхности объекта соответствует свойство canvas. Для того чтобы вывести на поверхность объекта графический элемент (прямую линию, окружность, прямоугольник и т. д.), необходимо применить к свойству canvas этого объекта соответствующий метод. Например, инструкция Form1.Canvas.Rectangle (10,10,100,100) вычерчивает в окне программы прямоугольник.
Карандашу и кисти, используемым для вывода графики на холсте, соответствуют свойства Реn (карандаш) и Brush (кисть)
Карандаш используется для вычерчивания точек, линий, контуров геометрических фигур: прямоугольников, окружностей, эллипсов, дуг и др. Вид линии, которую оставляет карандаш на поверхности холста, определяют свойства объекта треп, которые перечислены в табл. 1.
Таблица 1. Свойства объекта треп (карандаш)
Свойство
Определяет

Color
Цвет линии

Width
Толщину линии

Style
Вид линии

Mode
Режим отображения


Свойство Color задает цвет линии, вычерчиваемой карандашом. В табл. 2 перечислены именованные константы (тип TCoior), которые можно использовать в качестве значения свойства color.
Таблица 2. Значение свойства Color определяет цвет линии

Константа
Цвет
Константа
Цвет

clBlack
Черный
clSilver
Серебристый

clMaroon
Каштановый
clRed
Красный

clGreen
Зеленый
clLime
Салатный

clOlive
Оливковый
clBlue
Синий

clNavy
Темно-синий
clFuchsia
Ярко-розовый

clPurple
Розовый
clAqua
Бирюзовый

clTeal
Зелено-голубой
clWhite
Белый

clGray
Серый




Свойство width задает толщину линии (в пикселах). Например, инструкция Canvas. Pen. width: =2 устанавливает толщину линии в 2 пиксела.
Свойство style определяет вид (стиль) линии, которая может быть непрерывной или прерывистой, состоящей из штрихов различной длины. В табл. 3 перечислены именованные константы, позволяющие задать стиль линии. Толщина пунктирной линии не может быть больше 1. Если значение свойства Pen.width больше единицы, то пунктирная линия будет выведена как сплошная.
Таблица 3. Значение свойства Реn. туре определяет вид линии
Константа
Вид линии

psSolid
Сплошная линия

psDash
Пунктирная линия, длинные штрихи

psDot
Пунктирная линия, короткие штрихи

psDashDot
Пунктирная линия, чередование длинного и короткого штрихов

psDashDotDot

Пунктирная линия, чередование одного длинного и двух коротких штрихов

psClear
Линия не отображается (используется, если не надо изображать границу области, например, прямоугольника)


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

2 Кисть
Кисть (canvas.Brush) используется методами, обеспечивающими вычерчивание замкнутых областей, например геометрических фигур, для заливки (закрашивания) этих областей. Кисть, как объект, обладает двумя свойствами, перечисленными в табл. 4.
Таблица 4. Свойства объекта TBrush (кисть)
Свойство
Определяет

Color
Цвет закрашивания замкнутой области

Style
Стиль (тип) заполнения области


Область внутри контура может быть закрашена или заштрихована. В первом случае область полностью перекрывает фон, а во втором сквозь незаштрихованные участки области будет виден фон.
В качестве значения свойства Color можно использовать любую из констант типа TColor (см. список констант для свойства Pen.color в табл. 10.2).
Константы, позволяющие задать стиль заполнения области, приведены в табл. 5

Таблица 5 Значения свойства Brush, style определяют тип закрашивания
Константа
Тип заполнения (заливки) области

bsSolid
Сплошная заливка

bsClear
Область не закрашивается

bsHorizontal
Горизонтальная штриховка

bsVertical
Вертикальная штриховка

bsFDiagonal
Диагональная штриховка с наклоном линий вперед

bsBDiagonal
Диагональная штриховка с наклоном линий назад

bsCross
Горизонтально-вертикальная штриховка, в клетку

bsDiagCross
Диагональная штриховка, в клетку


В качестве примера в листинге приведена программа Стили заполнения областей, которая в окно (рис.1) выводит восемь прямоугольников, закрашенных черным цветом с использованием разных стилей.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис.1. Окно программы Стили заполнения областей
Листинг . Стили заполнения областей
implementation
{$R *.DFM}
// перерисовка формы
procedure TForm1.FormPaint(Sender: TObject);
const
bsName: array[1..8] of string =
('bsSolid','bsClear','bsHorizontal',
'bsVertical','bsFDiagonal','bsBDiagonal',
'bsCross','bsDiagCross');
var
x,y: integer; // координаты левого верхнего угла прямоугольника
w,h: integer; // ширина и высота прямоугольника
bs: TBrushStyle;// стиль заполнения области
k: integer; // номер стиля заполнения
i,j: integer;
begin
w:=40; h:=40; // размер области(прямоугольника)
у:=20;
for i:=l to 2 do
begin
х:=10;
for j:=1 to 4 do
begin
k:=j+(i-1)*4; // номер стиля заполнения
case k of
1: bs = bsSolid;
2: bs = bsClear;
3: bs = bsHorizontal;
4: bs = bsVertical;
5: bs = bsFDiagonal;
6: bs = bsBDiagonal;
7: bs = bsCross;
8: bs = bsDiagCross; end;
// вывод прямоугольника
Canvas.Brush.Color := clGreen;
// цвет закрашивания зеленый
Canvas.Brush.Style := bs;
// стиль закрашивания
Canvas . Rectangle (x, y, x+w, y-t-h) ;
// вывод названия стиля
Canvas.Brush.Style := bsClear;
Canvas.TextOut(x, y-15, bsName[k]);
// вывод названия стиля
x := x+w+30;
end;
у := y+h+30;
end;
end;
end.

3 Вывод текста
Для вывода текста на поверхность графического объекта используется метод TextOut. Инструкция вызова метода TextOut в общем виде выглядит следующим образом:
Объект.Canvas.TextOut(x, у, Текст)
где:
объект имя объекта, на поверхность которого выводится текст;
х, у координаты точки графической поверхности, от которой выполняется вывод текста (рис. 2);
Текст переменная или константа символьного типа, значение которой определяет выводимый методом текст.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 2. Координаты области вывода текста
Шрифт, который используется для вывода текста, определяется значением свойства Font соответствующего объекта canvas. Свойство Font представляет собой объект типа TFont..

Внимание!
Область вывода текста закрашивается текущим цветом кисти. Поэтому перед выводом текста свойству Brush.Color нужно присвоить значение bsClear или задать цвет кисти, совпадающий с цветом поверхности, на которую выводится текст.
Следующий фрагмент программы демонстрирует использование функции Textout для вывода текста на поверхность формы:
with Form1.Canvas do begin
// установить характеристики шрифта
Font.Name := 'Tahoma';
Font.Size := 20;
Font.Style := [fsltalic, fsBold] ;
Brush.Style := bsClear; // область вывода текста не закраши-
TextOut(0, 10, 'Borland Delphi 7');
end;
После вывода текста методом Textout указатель вывода (карандаш) перемещается в правый верхний угол области вывода текста.
Иногда требуется вывести какой-либо текст после сообщения, длина которого во время разработки программы неизвестна. Например, это может быть слово "руб." после значения числа, записанного прописью. В этом случае необходимо знать координаты правой границы уже выведенного текста. Координаты правой границы текста, выведенного методом Textout, можно получить, обратившись к свойству PenPos.


Лекция16
Тема Методы вычерчивания графических элементов

Линия, точка, окружность, эллипс, дуга
Прямоугольник
Вывод иллюстраций
Мультипликация

1 Линия
Вычерчивание прямой линии осуществляет метод LinеТо, инструкция вызова которого в общем виде выглядит следующим образом:
Компонент.Canvas.LineTo(x,у)
 
Точка
Поверхности, на которую программа может осуществлять вывод графики, соответствует объект Canvas. Свойство pixels, представляющее собой двумерный массив типа TColor, содержит информацию о цвете каждой точки графической поверхности. Используя свойство Pixels, можно задать тре-
буемый цвет для любой точки графической поверхности, т. е. "нарисовать" точку. Например, инструкция
Form1.Canvas.Pixels[10,10]:=clRed
окрашивает точку поверхности формы в красный цвет.

Окружность и эллипс
Метод Ellipse вычерчивает эллипс или окружность, в зависимости от значений параметров. Инструкция вызова метода в общем виде выглядит следующим образом:
Объект.Canvas.Ellipse(x1,y1, х2,у2]
где:
объект имя объекта (компонента), на поверхности которого выполняется вычерчивание;
x1, y1, х2, у2 координаты прямоугольника, внутри которого вычерчивается эллипс или, если прямоугольник является квадратом, окружность (рис. 1).
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 1. Значения параметров метода Ellipse определяют вид геометрической фигуры
Цвет, толщина и стиль линии эллипса определяются значениями свойства Реп, а цвет и стиль заливки области внутри эллипса значениями свойства Brush поверхности (canvas), на которую выполняется вывод.
 
Дуга
Вычерчивание дуги выполняет метод Arc, инструкция вызова которого в общем виде выглядит следующим образом:
Объект.Canvas.Arc(x1,y1,х2,у2,х3,у3,х4,у4)
где:
x1, y1, х2, у2 параметры, определяющие эллипс (окружность), частью которого является вычерчиваемая дуга;
х3, у3 параметры, определяющие начальную точку дуги; П х4, у4 параметры, определяющие конечную точку дуги.
Начальная (конечная) точка это точка пересечения границы эллипса и прямой, проведенной из центра эллипса в точку с координатами х3 и у3 (х4, у4). Дуга вычерчивается против часовой стрелки от начальной точки к конечной (рис. 2).
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 2 Значения параметров метода Arc определяют дугу как часть эллипса (окружности)
 
2 Прямоугольник
Прямоугольник вычерчивается методом Rectangle, инструкция вызова которого в общем виде выглядит следующим образом:
Объект.Canvas.Rectangle(x1, y1,x2, y2)
где:
объект имя объекта (компонента), на поверхности которого выполняется вычерчивание;
x1, y1 и х2, у2 координаты левого верхнего и правого нижнего углов прямоугольника.
Метод RoundRec тоже вычерчивает прямоугольник, но со скругленными углами. Инструкция вызова метода RoundRec выглядит так:
Объект.Canvas.RoundRec(x1,y1,х2, у2, х3, у3)
где:
x1, y1, х2, у2 -- параметры, определяющие положение углов прямоугольника, в который вписывается прямоугольник со скругленными углами;
х3 и у3 размер эллипса, одна четверть которого используется для вычерчивания скругленного угла (рис. 3).
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 3. Метод RoundRec вычерчивает прямоугольник со скругленными углами

Вид линии контура (цвет, ширина и стиль) определяется значениями свойства Реп, а цвет и стиль заливки области внутри прямоугольника значениями свойства Brush поверхности (canvas), на которой прямоугольник вычерчивается.
Есть еще два метода, которые вычерчивают прямоугольник, используя в качестве инструмента только кисть (Brush). Метод FillRect вычерчивает закрашенный прямоугольник, а метод FrameRect только контур. У каждого из этих методов лишь один параметр структура типа TRect. Поля структуры TRect содержат координаты прямоугольной области, они могут быть заполнены при помощи функции Rect.
Ниже в качестве примера использования методов FillRect и FrameRect приведена процедура, которая на поверхности формы вычерчивает прямоугольник с красной заливкой и прямоугольник с зеленым контуром.
procedure TForm1.Button1Click(Sender: TObject);
var
r1, r2: TRect; // координаты углов прямоугольников
begin
// заполнение полей структуры
// зададим координаты углов прямоугольников
r1 := Rect(20,20,60,40);
r2 := Rect(10,10,40,50);
with fоrm1.Canvas do begin
Brush.Color := clRed;
FillRect(r1); // закрашенный прямоугольник
Brush.Color := clGreen;
FrameRect(r2}; // только граница прямоугольника
end;
end;
 
3 Вывод иллюстраций
Наиболее просто вывести иллюстрацию, которая находится в файле с расширением bmp, jpg или ico, можно при помощи компонента image, значок которого находится на вкладке Additional палитры (рис. 4).
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 4 Значок компонента Image

Таблица 1. Свойства компонента image
Свойство


Picture Width, Height

AutoSize



Strech


Visible
Иллюстрацию, которая отображается в поле компонента
Размер компонента. Если размер компонента меньше размера иллюстрации, и значение свойств AutoSize и strech равно False, то отображается часть иллюстрации
Признак автоматического изменения размера компонента в соответствии с реальным размером иллюстрации
Признак автоматического масштабирования иллюстрации в соответствии с реальным размером компонента. Чтобы было выполнено масштабирование, значение свойства AutoSize должно быть False
Отображается ли компонент, и, соответственно, иллюстрация, на поверхности формы


Иллюстрацию, которая будет выведена в поле компонента image, можно задать как во время разработки формы приложения, так и во время работы программы.
Во время разработки формы иллюстрация задается установкой значения свойства picture путем выбора файла иллюстрации в стандартном диалоговом окне, которое появляется в результате щелчка на командной кнопке Load окна Picture Editor Чтобы запустить Image Editor, нужно в окне Object Inspector выбрать свойство Picture и щелкнуть на кнопке с тремя точками.
Если размер иллюстрации больше размера компонента, то свойству strech нужно присвоить значение True и установить значения свойств width и Height пропорционально реальным размерам иллюстрации.
Чтобы вывести иллюстрацию в поле компонента image во время работы программы, нужно применить метод LoadFromFile к свойству Picture, указав в качестве параметра имя файла иллюстрации. Например, инструкция
Form1.Image1.Picture.LoadFromFile('e:\temp\bart.bmp')
загружает иллюстрацию из файла bart.bmp и выводит ее в поле вывода иллюстрации (imagel).
Метод LoadFromFile позволяет отображать иллюстрации различных графических форматов: BMP, WMF, JPEG (файлы с расширением jpg).
 
4 Мультипликация
Под мультипликацией обычно понимается движущийся и меняющийся рисунок. В простейшем случае рисунок может только двигаться или только меняться.
Как было показано выше, рисунок может быть сформирован из графических примитивов (линий, окружностей, дуг, многоугольников и т. д.). Обеспечить перемещение рисунка довольно просто: надо сначала вывести рисунок на экран, затем через некоторое время стереть его и снова вывести этот же рисунок, но уже на некотором расстоянии от его первоначального положения. Подбором времени между выводом и удалением рисунка, а также расстояния между старым и новым положением рисунка (шага перемещения), можно добиться того, что у наблюдателя будет складываться впечатление, что рисунок равномерно движется по экрану.
Следующая простая программа, текст которой приведен в листинге, а вид формы на рис. 5, демонстрирует движение окружности от левой к правой границе окна программы.
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 5. Форма программы Движущаяся окружность
Листинг. Движущаяся окружность
implementation
{$R *.DFM}
var
Form1: TForml;
x,y: byte; // координаты центра окружности
dx: byte; // приращение координаты x при движении окружности
// стирает и рисует окружность на новом месте
procedure Ris;
begin
// стереть окружность
form1.Canvas.Pen.Color:=form1.Color;
form1.Canvas.Ellipse(x,y,x+10,y+10);
x:=x+dx;
// нарисовать окружность на новом месте
form1.Canvas.Pen.Color:=clBlack;
form1.Canvas.Ellipse(x,y, x+10, y+10) ;
end;
// сигнал от таймера
procedure TForm1.Timer1Timer(Sender: TObject);
begin Ris; end;
procedure TForm1.FormActivate(Sender: TObject);
begin
x:=0;
y:=10;
dx:=5;
timer1.Interval:=50;
// период возникновения события OnTimer 0.5 сек
form1.canvas.brush.color:=forml.color;
end;
end.
Основную работу выполняет процедура Ris, которая стирает окружность и выводит ее на новом месте. Стирание окружности выполняется путем перерисовки окружности поверх нарисованной, но цветом фона.
Для обеспечения периодического вызова процедуры Ris в форму программы добавлен невизуальный компонент Timer (таймер), значок которого находится на вкладке System палитры компонентов (рис. 6). Свойства компонента Timer, перечислены в табл. 2

[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 6. Значок компонента Timer
Таблица 2 Свойства компонента Timer
Свойство
Определяет

Name Interval
 

Enabled
Имя компонента. Используется для доступа к компоненту Период генерации события OnTimer. Задается в миллисекундах
Разрешение работы. Разрешает (значение True) или запрещает (значение False) генерацию события OnTimer


Добавляется компонент Timer к форме обычным образом, однако, поскольку компонент Timer является невизуальным, т. е. во время работы программы не отображается на форме, его значок можно поместить в любое место формы.
Компонент Timer генерирует событие OnTimer. Период возникновения события OnTimer измеряется в миллисекундах и определяется значением свойства Interval. Следует обратить внимание на свойство Enabled. Оно дает возможность программе "запустить" или "остановить" таймер. Если значение свойства Enabled равно False, то событие OnTimer не возникает.
Событие onTimer в рассматриваемой программе обрабатывается процедурой TimeriTimer, которая, в свою очередь, вызывает процедуру Ris. Таким образом, в программе реализован механизм периодического вызова процедуры Ris.
Примечание
Переменные х, у (координаты центра окружности) и dx (приращение координаты х при движении окружности) объявлены вне процедуры Ris, т. е. они являются глобальными. Поэтому надо не забыть выполнить их инициализацию (в программе инициализацию глобальных переменных реализует процедура FormActivate).



Лекция 17
Тема Применение компонентов CheckBox и RadioGroup.

Размещение компонентов CheckBox и RadioGroup на форме.
Организация выбора одного из условий используя компонент CheckBox и RadioGroup.
Решение задач.

1 Размещение компонентов CheckBox и RadioGroup на форме.
В палитре компонентов на странице Standard выбрать компонент CheckBox. В свойстве Caption Инспектора Объектов заменить надпись CheckBox на подпись например «Вывод исходных данных». Чтобы при запуске приложения кнопка CheckBox оказалась включена, свойство Checked компонента CheckBox установить равным True.
В палитре компонентов на странице Standard выбрать компонент RadioGroup. В свойстве Caption Инспектора Объектов заменить надпись RadioGroup например на F(x).Для размещения кнопок в один столбец свойство Columns необходимо установить =1. Дважды щелкнуть «мышью» по правой части свойства Items – появится строчный редактор списка наименований кнопок, где набираются в столбец функции. После этого появятся на форме записанные функции. Чтобы при запуске приложения одна из кнопок RadioGroup оказалась включена, свойство ItemIndex установить =0 или целым положительным. Это обеспечит выполнение одной из функции. Если свойство ItemIndex не устанавливать, то по умолчанию оно будет =-1, что соответствует выключенному состоянию всех кнопок.

2Организация выбора одного из условий используя компонент CheckBox и RadioGroup.

If CheckBox1.Checked then Memo1.Lines.Add( действие);- если кнопка нажата, то выполнится действие
Case RadioGroup1. ItemIndex of
0:y:=Cos(x);
1:y:=Sin(x);
End;

Решение задач.

Задача1 : Вычислить одну из выбранных функций y=x+3 или y=/x-3/.


procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Text:='2'; // значение х
memo1.Clear; // очистка memo1
memo1.Lines.Add('Ответ');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
x,y:extended;
begin
x:=strtofloat(edit1.Text);// х присваивается содержимое edit1
//проверка состояния кнопки checkBox1
if checkBox1.Checked then //если кнопка нажата , то
memo1.Lines.Add('x='+FloatTostr(x)); // вывод значения х
case radiogroup1.ItemIndex of
0:y:=x+3;
1:y:=/x-3/;
end;
memo1.Lines.Add('y='+FloatTostr(y));// вывод результата в memo1.
end;
end.

Задача2 : Организовать выбор одного из действий : увеличить в два раза или увеличить на 2 элементы массива, число которых можно регулировать


Лекция 18
Тема Добавление данных в список
Добавление данных в список
Указатели
Динамические переменные
1 Добавление данных в список
Разработать программу для составления словаря новых терминов. Должна иметься возможность внесения в словарь изменений, дополнения или сокращения его. При выборе термина на контрольной панели должны появляться его номер и общее количество слов в словаре
Новым в этой работе является использование комбинированного списка ComboBox (представляющего собой объединение строки ввода и
компонента ListBox), компонента выключателя CheckBox.



var
Form1: TForm1;
num:integer;
implementation
{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.Button1Click(Sender: TObject); //кнопка добавить
begin
if ComboBox1.text<>'' then ComboBox1.Items.Add(ComboBox1.Text) ;
if ComboBox1.ItemIndex=-1 then ComboBox1.Text:='';
//последний оператор очищает строку ввода после того, как текст из нее попадает в список
ComboBox1.Items.SaveToFile('glostext.txt'); //сохранение в файле glostext.txt
end;

procedure TForm1.Button2Click(Sender: TObject); //кнопка удалить
begin
if messagedlg('Вы действительно хотите удалить запись?',mtWarning,[mbyes,mbno],0)=mryes
then ComboBox1.Items.Delete(ComboBox1.ItemIndex);
// появится сообщение с !, термин будет удален только при нажатии кнопки yes
ComboBox1.Items.SaveToFile('glostext.txt');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.LoadFromFile('glostext.txt');//при открытии формы будет загружатся сохраненный файл
label1.caption:='Всего записей:'+IntTostr(ComboBox1.Items.Count);//доп. зад.
end;

procedure TForm1.Button3Click(Sender: TObject); //кнопка редактировать
begin
comboBox1.Items.Delete(num);
comboBox1.Items.Add(comboBox1.text);
if comboBox1.itemIndex=-1 then ComboBox1.Text:='';
ComboBox1.Items.SaveToFile('glostext.txt');
end;
//Пояснение.Для исправления ошибок, замеченных в строках списка, выделенную строку надо удалить из списка, а исправленную строку (т. е. содержимое строки ввода) добавить в список.Новая переменная пит необходима для сохранения номера выбранной строки. При внесении изменений выбранной строкой становится строка ввода, для которой Itemlndex = - 1.//

procedure TForm1.ComboBox1Click(Sender: TObject);
begin
num:= ComboBox1.itemindex;
Label2.Caption:='номер:'+ IntTostr(ComboBox1.ItemIndex+1);//доп.зад. первый термин имеет индекс 0, второй 1 и т. д.
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked = False then
begin ComboBox1.Style:=csDropDown;
Button1.Enabled:= true;
end
else
begin
ComboBox1.Style:= csDropDownList;
Button1.Enabled:= false;
end;
end;
end.

2 Указатели
Обычно переменная хранит некоторые данные. Однако помимо обычных, существуют переменные, которые ссылаются на другие переменные. Такие переменные называются указателями. Указатель это переменная, значением которой является адрес другой переменной или структуры данных. Графически указатель может быть изображен так, как на рис. 1
Рис. 1. Переменная-указатель
Указатель, как и любая другая переменная программы, должен быть объявлен в разделе объявления переменных. В общем виде объявление указателя выглядит следующим образом:
Имя: ^ Тип; Тип тип переменной, на которую указывает переменная-указатель;
значок ^ показывает, что объявляемая переменная является указателем.
Пример:p1: ^integer; р2: ^real;
В приведенном примере переменная p1 это указатель на переменную типа integer, a p2 указатель на переменную типа real.
Тип переменной, на которую ссылается указатель, называют типом указателя.
В начале работы программы переменная-указатель "ни на что не указывает". В этом случае говорят, что значение указателя равно NIL. Зарезервированное слово NIL соответствует значению указателя, который ни на что не указывает.
Идентификатор NIL можно использовать в инструкциях присваивания и в условиях. Например, если переменные p1 и р2 объявлены как указатели, то инструкция
p1 := NIL; – устанавливает значение переменной, а инструкция
if р2 = NIL then ShowMessage('Указатель р2 не инициализирован!'); проверяет, инициализирован ли указатель р2.
Указателю можно присвоить значение адрес переменной соответствующего типа (в тексте программы адрес переменной это имя переменной, перед которым стоит оператор @). Ниже приведена инструкция, после выполнения которой переменная р будет содержать адрес переменной п. р := @n;
Помимо адреса переменной, указателю можно присвоить значение другого указателя при условии, что они являются указателями на переменную одного типа. Например, если переменные pi и р2 являются указателями типа integer, то в результате выполнения инструкции p2 := p1; переменные pi и р2 указывают на одну и ту же переменную.
Указатель можно использовать для доступа к переменной, адрес которой содержит указатель. Например, если р указывает на переменную i, то в результате выполнения инструкции р^ : = 5; значение переменной i будет равно пяти. В приведенном примере значок ^ показывает, что значение пять присваивается переменной, на которую указывает переменная-указатель.
3. Динамические переменные
Динамической переменной называется переменная, память для которой выделяется во время работы программы.
Выделение памяти для динамической переменной осуществляется вызовом процедуры new. У процедуры new один параметр указатель на переменную того типа, память для которой надо выделить. Например, если р является указателем на тип real, то в результате выполнения процедуры new(p); будет выделена память для переменной типа real (создана переменная типа real), и переменная-указатель р будет содержать адрес памяти, выделенной для этой переменной.
У динамической переменной нет имени, поэтому обратиться к ней можно только при помощи указателя.
Процедура, использующая динамические переменные, перед завершением своей работы должна освободить занимаемую этими переменными память или, как говорят программисты, уничтожить динамические переменные". Для освобождения памяти, занимаемой динамической переменной, используется процедура Dispose, которая имеет один параметр указатель на динамическую переменную.
Например, если р указатель на динамическую переменную, память для которой выделена инструкцией new(p), то инструкция dispose (р) освобождает занимаемую динамической переменной память.
Следующая программа (ее текст приведен в листинге ) формирует список студентов, добавляя фамилии в начало списка. Данные вводятся в поля редактирования диалогового окна программы и добавляются в список нажатием кнопки Добавить (suttoni).
Листинг
implementation
{$R *.DFM}
type
TPStudent=^TStudent; // указатель на тип TStudent
TStudent = record
f_name:string[20]; // фамилия
l_name: string[20]; // имя
next: TPStudent; // следующий элемент списка
end;
var
head: TPStudent; // начало (голова) списка
// добавить элемент в начало списка
procedure TForml.Button1Click(Sender: TObject);
var curr: TPStudent; // новый элемент списка
begin
new(curr); // выделить память для элемента списка
curr^.f_name := Edit1.Text;
curr^.1_пате := Edit2.Text;
// добавление в начало списка
curr^.next := head; head := curr;
// очистить поля ввода
Edit1.text:=''; Edit2.text: = " ;
end;
// вывести список
procedure TForml.Button2Click(Sender: TObject);
var curr: TPStudent; // текущий элемент списка
n:integer; // длина (кол-во элементов) списка
st:string; // строковое представление списка
begin
n := 0; st := '';
curr := head; // указатель на первый элемент списка
while curr <> NIL do begin
n := n + 1;
st := st + curr^.f_name + ' ' + curr^.1_name
+#13; curr := curr^.next; // указатель на следующий элемент
end;
if n <> 0 then ShowMessage('Список:' + #13 + st)
else ShowMessage('В списке нет элементов.');
end; end.
Добавление элемента в список выполняет процедура TForm1.Button1Click, которая создает динамическую переменную-запись, присваивает ее полям значения, соответствующие содержимому полей ввода диалогового окна, и корректирует значение указателя head.
Вывод списка выполняет процедура TForm1.Button2Click, которая запускается нажатием кнопки Показать. Для доступа к элементам списка используется указатель curr. Сначала он содержит адрес первого элемента списка. После того как первый элемент списка будет обработан, указателю curr присваивается значение поля next той записи, на которую указывает curr. В результате этого переменная curr содержит адрес второго элемента списка. Таким образом, указатель перемещается по списку. Процесс повторяется до тех пор, пока значение поля next текущего элемента списка (элемента, адрес которого содержит переменная curr) не окажется равно NIL.



Лекция 19-20
Тема Создание тестовых приложений

Разработка проекта «Тест по физике»
Разработка проекта «Тест по географии»

Разработка проекта «Тест по физике»



0 Ват - мощность 2 напряжение
1 Ом - сопротивление 3 сила тока
2 Вольт - напряжение 0 мощность
3 Ампер - сила тока 1 сопротивление



Постановка задачи.
Создать программу, выполняющую следующие действия.
После запуска программы появляется изображение, аналогичное рис.1. Пользователь, перемещаясь с помощью клавиш-стрелок по списку «Физическая величина», выбирает любое слово, нажав клавишу Enter. Затем он переходит в список «Название величины» и выбирает соответствующее название выбранной физической величины. Если выбрано правильное название величины, то под словом «Оценка» появляется одобрительная реплика «Правильно», если неправильное слово, то «Ошибка». Правильные названия ищутся до тех пор, сколько попыток укажет программист.
Пояснение. Новым в этой работе является обеспечение взаимодействия двух списков ListBox на основе свойств Items и Itemlndex и создание многострочных надписей в объекте Label.

Для вывода многострочных надписей в объектах label выполните следующие действия:

Labell
Properties
AutoSize (изменение размера в зависимости от текста в Caption)
Установка значения False





Wordwrap (разрыв строки)
Установка значения True







Листинг программы
var
Form1: TForm1;
num1,num2,CountR,Rez:integer;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.ListBox1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then num1:=ListBox1.Itemindex; //#13-новая строка
end;

procedure TForm1.ListBox2KeyPress(Sender: TObject; var Key: Char);
begin
If key=#13 then begin
case Form1.ListBox2.Itemindex of
0:Num2:=2;
1:Num2:=3;
2:Num2:=0;
3:Num2:=1;
end;
if Num1=Num2 then
begin
form1.Label4.Caption:='Правильно';
rez:=rez+1;
end
Else form1.Label4.Caption:='Ошибка';
CountR:=CountR+1;
If CountR=4 then ShowMessage('Тест окончен! Правильных ответов:'+ inttostr(rez));
// CountR=4-количество попыток
end; end; end.

Задание:
1 Вывести оценку за тест по правилу 4 правильных -оценка «5», 3 правильных- «4», 2пр-«3», 1пр-«2»

procedure TForm1.Button1Click(Sender: TObject);
var
otmetka:string;
begin
case rez of
1:otmetka:='2';
2:otmetka:='3';
3:otmetka:='4';
4:otmetka:='5';
end;
Form1.Label3.Caption := 'Оценка'+otmetka ;
end;
2 Списки ListBoxl и ListBox2 сделать поочередно доступными после нажатия клавиши Enter.
Подсказка. Установить значение False свойства Enabled объекта ListBox2, а в процедуру KeyPressed, относящуюся к ListBoxl, включить строки:
ListBox2.Enabled := True; ListBoxl.Enabled := False; Forml.ActiveControl :=ListBox2;
3 Внести изменения в программу, чтобы при правильном выборе назва ния физической величины слово в левом списке исчезало.
Подсказка. В процедуру KeyPressed, относящуюся к ListBox2, включить:
ListBoxl.Items.Delete(Numl); ListBoxl.Items.Insert(Numl, ");

Разработка проекта «Тест по географии»










Титульная форма
var
Forml: TForml;
implementation
{$R *.DFM}
procedure TForml. FormCreate(Sender: TObject);
begin
Label2.Caption:='Разработал студент 4 ОВТ';
end;
procedure TForml. BitBtnlClick (Sender: TObject); begin Close;end;
procedure TForml.BitBtn2Click(Sender: TObject); beginClose;End;
Procedure Tforml . BitBtn2Click (Sender: TObject);
begin
U_Menu. ShowModal;//открытие формы
end; end.
Форма «Меню»:
var
U_Menu: TU_Menu;
implementation
{$R *.DFM}
procedure TU_Menu.N4Click (Sender: TObject); begin Close; end;
procedure TU_Menu.N5Click (Sender: TObject);
begin
U_Instr.ShowModal ;
end;
procedure TU_Menu. N2Click(Sender: TObject);
begin
nm := InputBox('Начало тестирования','Введите имя','');
U_Test.RadioGroupl.Itemlndex:=-1;
U_Test.RadioGroup2.Itemlndex:=-1;
U_Test.RadioGroup3.Itemlndex:=-1;
U_Test.RadioGroup4.Itemlndex:=-1;
U_Test.RadioGroup5.Itemlndex:=-1;
U_Test.PageControll.ActivePage:=U_Test.TabSheetl;
U_Test.ShowModal;
end;
procedure TU_Menu.N3Click(Sender: TObject);
begin
U_Res. Labell. Caption:=nm+' Ваш результат :'+IntToStr(Ball);
U_Res.ShowModal;
end;end.

Форма «Помощь»:
var
U_Instr: TU_Instr;
implementation
{$R *.DFM}
procedure TU_Instr. CancelBtnClick(Sender: TObject);
begin
Close;
end;
end.

Форма «Результат»:
unit F_Res;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls;
Type

private
{Private declarations} public
{Public declarations}
end;
type Tl=array[l..5,0..3] of byte;
const
otv:Tl=((0,0,1,0), (0,0,1,0), (0,1,0,0),(0,0,1,0),(0,1,0,0));
var
U_Res: TU_Res;
Ball:Byte;
Nm:String;
implementation
{$R *.DFM}
end.
Форма «Тестирование»:
var
U_Test: TU_Test;
implementation
{$R *.DFM}
procedure TU_Test. OKBtnClick (Sender: TObject)
begin
Ball:=otv[1,RadioGroupl.Itemlndex]+
otv[2,RadioGroup2.Itemlndex]+
otv[3,RadioGroup3.Itemlndex]+
otv[4,RadioGroup4.Itemlndex]+
otv[5,RadioGroup5.Itemlndex];
end;
end.



Лекция 21-22
Тема Разработка баз данных
Страница DIALOGS
Создание базы данных для работы с телефонным справочником
1. Страница DIALOGS
Компоненты страницы Dialogs реализуют стандартные для Windows диалоговые окна.
OpenDialog - открыть. Реализует стандартное диалоговое окно “Открыть файл”.
SaveDialog - сохранить. Реализует стандартное диалоговое окно “Сохранить файл”.
OpenPictureDialog - открыть рисунок. Реализует специальное окно выбора графических файлов с возможностью предварительного просмотра рисунков.
SavePictureDialog - сохранить рисунок. Реализует специальное окно сохранения графических файлов с возможностью предварительного просмотра рисунков.
FontDialog - шрифт. Реализует стандартное диалоговое окно выбора шрифта.
ColorDialog - цвет. Реализует стандартное диалоговое окно выбора цвета.
PrintDialog - печать. Реализует стандартное диалоговое окно выбора параметров для печати документа.
PrinterSetupDialog - настройка принтера. Реализует стандартное диалоговое окно для настройки печатающего устройства.
FindDialog - поиск. Реализует стандартное диалоговое окно поиска текстового фрагмента.
ReplaceDialog - замена. Реализует стандартное диалоговое окно поиска и замены текстового фрагмента.
Компоненты OpenPictureDialog И SavePictureDialog введены в версии 3, остальные имеются в предыдущих версиях. Разумеется, интерфейс окон для Windows 16 (версия 1) отличается от интерфейса Windows 32.
2. Создание базы данных для работы с телефонным справочником
Создадим приложение для работы с телефонным справочником, содержащим следующую информацию: фамилию владельца телефона, номер телефона, домашний адрес владельца. Предусмотрим следующие функции приложения:
а) добавление новой строки в справочник;
б) удаление последней строки из справочника;
в) сохранение справочника на диске;
г) загрузку справочника с диска;
д) поиск фамилии в справочнике;
е) поиск телефона в справочнике.
Для решения поставленной задачи выполним следующие действия:

1) на страничке Additional выберем компонент StringGrid, разместим на форме и изменим значение ряда его свойств:
ColCount = 3 (число колонок в строке справочника);
FixedCols = 0 (фиксированных колонок нет);
FixedRows = 1 (одна фиксированная строка);
RowCount = 2 (первоначальное число строк);
Options:
goEditing = True (ячейки сетки можно редактировать);
goTabs = True (можно перемешаться по ячейкам справочника с помощью Tab);

на страничке Standard выберем последовательно 6 раз компонент Button и разместим кнопки на форме. Значение свойства Caption кнопок Buttonl,..., Button6 изменим соответственно на «Добавить», «Удалить», «Сохранить», «Загрузить», «Поиск фамилии», «Поиск телефона»;

3)на страничке Dialogs выберем последовательно и разместим на форме компоненты SaveDiaiog, OpenDialog и дважды компонент FindDialog. Изменим ряд значений свойства Options компонентов FindDialogl и FindDialog2:
frDown = True (по умолчанию искать сверху вниз);
frDisableMatchCase = True (учитывать регистр);
frDisableWholeWord = True (не использовать возможность поиска слова целиком);

4) определим заголовки колонок сетки строк: Procedure TForm1. FormCreate(Sender: TObject); Begin
with StringGrid do Begin
Сеlls[0,0]:='Фамипия Имя Отчество'; Cells[1,0]:=Телефон';
Cells[2,0]: = 'Домашний адрес' End
End;
Для этого переместим курсор мыши в свободное от других компонентов место формы и дважды нажмем левую кнопку мыши;

5) определим функциональное назначение кнопки «Добавить»: Procedure TForm1.ButtonlClick(Sender: TObject);
Begin
StringGridi .RowCount:= StringGridi .RowCount+1
End;
6) определим функциональное назначение кнопки «Удалить»: Procedure TForm1.Button2Click(Sender: TObject);
Begin
with StringGrid1 do
if RowCount > 2 then RowCount:=RowCount-1
End;

7)определим функциональное назначение кнопки «Сохранить»: Procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
StringAII: TStringList;
Begin
if SaveDialog1 .Execute then
with StringGrid1,SaveDialog1 do
Begin
StringAII:= TStringList.Create;
StringAII.Add(lntToStr(RowCount));
for i:= 0 to RowCount-1 do
StringAII. AddStrings(Rows[i]);
StringAII.SaveToFile(FileName);
StringAII.Destroy
End
End;

8) определим функциональное назначение кнопки «Загрузить»:
Procedure TForm1.Button4Click(Sender: TObject);
var i,j: integer;
StringAII: TStringList;
Begin
if OpenDialog1.Execute then
with StringGrid1,OpenDialog1 do
Begin
StringAII:= TStringList.Create;
StringAII.LoadFromFile(FileName); RowCount:=StrTolnt(StringAll.strings[0]);
for i:= 0 to ColCount-1 do
for j:= 0 to RowCount-1 do
Cells[i,j]:= StringAII.Strings [1+i+j*ColCount];
StringAII. Destroy
End
End;

9)определим функциональное назначение кнопки «Поиск фамилии»:
Procedure TForm1.Button5Click(Sender: TObject);
Begin
FindDialog1.Execute
End;

10)определим функциональное назначение кнопки «Поиск телефона»:
Procedure TForm1.Button6Click(Sender: TObject);
Begin
FindDialog2.Execute
End;

11) напомним, что при нажатии кнопки FindNext диалога FindDialog1 возникает событие OnFind. Внутри обработчика этого события необходимо определить действия по непосредственному поиску. Поэтому на форме Forml активируем компонент FindDialog1, в инспекторе объектов выберем страничку Events (события), найдем на ней событие OnFind и дважды нажмем левую кнопку мыши. Определим действия программы для этого события:
Procedure TForm1.FindDialog1Find(Sender TObject);
var i:nteger;
Begin
if not (frDisableUpDown in FindDialog1.Options) then
Begin
if frDown in FindDialog1.Options then
Begin
for i:=StringGrid1 .Row+1 to StringGrid1.RowCount-1 do
if Pos(FindDialog1.FindText,StringGrid1.Cells[0,i]) =1 then
Begin
StringGrid1. Row:=i;
StringGrid1.Col:=0;
FindDialog1.CloseDialog;
Exit
End;
FindDialog1.CloseDialog;
MessageBox(0,'Фамилия не найдена!', 'Поиск по фамилии',mb_ОК)
End
Else
Begin
For i:=StringGrid1.Row-1 downto 1 do
if Pos(FindDialog1.FindText, StringGrid1.Cells[0,i]) =1 then
Begin
StringGrid1.Row:= i;
StringGrid1.Col:= 0;
FindDialog1.CloseDialog;
Exit
End;
FindDialog1.CloseDialog;
MessageBox(0,'Фамилия не найдена!', 'Поиск по фамилии',mb_ОК)
End
End
Else {нет переключения поиска вверх-вниз; по умолчанию - вниз}
Begin
for i:=StringGrid1 .Row+1 to StringGrid1.RowCount-1 do
if Pos(FindDialog1.FindText,StringGrid1.Cells[0,i]) = 1 then
Begin
StringGrid1.Row:= i;
StringGrid1. Col:= 0;
FindDialog1.CloseDialog;
Exit
End;
FindDialog1.CloseDialog;
MessageBox(0,'Фамилия не найдена!', 'Поиск по фамилии',mb_OK);
End; End;

12)аналогично определим действия программы для события OnFind компонента FindDialog2:
Procedure TForm1.FindDialog2Find(Sender TObject);
var i:integer;
Begin
if not (frDisableUpDown in FindDialog2.Options) then
Begin
if frDown in FindDialog2.Options then
Begin
for i:= StringGrid1.Row+1 to StringGrid1.RowCount-1 do
if FindDialog2.FindText = StringGrid1.Cells[1 ,i] then
Begin
StringGrid1.Row:=i;
StringGrid1.Col:= 1;
FindDialog2.CloseDialog;
Exit End;
FindDialog2.CloseDialog;
MessageBox(0,Телефон не найден!', 'Поиск телефона',mb_ОК);
End
Else
Begin
For i:=StringGrid1.Row-1 downto 1 do
if FindDialog2.FindText =StringGrid1 .Cells[1 ,i] then
Begin
StringGrid1.Row:=i;
StringGrid1.Col:=1;
FindDialog2.CloseDialog;
Exit
End;
Find Dialog2. CloseDialog;
MessageBox(0,Телефон не найден!', 'Поиск телефона',mb_ОК)
End End
Else {нет переключения поиска вверх-вниз; по умолчанию - вниз}
Begin
For i:=StringGrid1.Row+1 to StringGridi.RowCount-1 do
if FindDialog2.FindText =StringGrid1 .Cells[1 ,i] then
Begin
StringGrid1.Row:=i; StringGrid1.Col:= 1;
FindDialog2.CloseDialog;
Exit
End;
FindDialog2. CloseDialog;
MessageBox(0,Телефон не найден!', Поиск телефона’,mb_OK)
End End;
Обратим внимание на ряд свойств компонента StringGrid, используемых в приложении:
Rows[i] i-я строка таблицы;
Cells[j,i] отдельный элемент таблицы, стоящий на пересечении строки с номером i и столбца с номером.

Лекция 23
Тема Решение задач
Листинг . База данных "Школа"
unit school2_;
interface
uses Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms,
Dialogs,Grids, DBGrids, Db,
DBTables, ExtCtrls, DBCtrls, StdCtrls;
type TForm1 = class(TForm) Table1: TTable; // таблица (вся база данных) Query1: TQuery; // запрос (записи БД, удовлетворяющие критерию выбора) DataSource1: TDataSource; // источник данных - таблица или запрос DBGrid1: TDBGrid; // таблица для отображения БД или результата выполнения запроса DBNavigator1: TDBNavigator; DBText1: TDBText; Button1: TButton; // кнопка запрос Button2: TButton; // кнопка Все записи procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
// щелчок на кнопке Запрос procedure TForm1.Button1Click(Sender: TObject); var fam: string[30]; begin fam:=InputBox('Выборка информации из БД', 'Укажите фамилию и щелкните на OK.', ''); if fam <> '' // пользователь ввел фамилию then begin with form1.Query1 do begin Close; // закрыть файл-результат выполнения предыдущего запроса SQL.Clear; // удалить текст предыдущего запроса // записываем новый запрос в свойство SQL SQL.Add('SELECT Fam, Name, Class'); SQL.Add('FROM ":Школа:school.db"'); SQL.Add('WHERE'); SQL.Add('(Fam = "'+ fam + '")'); SQL.Add('ORDER BY Name, Fam'); Open; // активизируем выполнение запроса end;
{ *** другой вариант изменения критерия запроса begin Query1.Close; Query1.SQL[3]:='(Fam="'+ fam + '")'; Query1.Open; DataSource1.DataSet:=Query1; end; } if Query1.RecordCount <> 0 then DataSource1.DataSet:=Query1 // отобразить рез-т выполнения запроса else begin ShowMessage('В БД нет записей, удовлетворяющих критерию запроса.'); DataSource1.DataSet:=Table1; end; end; end;
// щелчок на кнопке Все записи procedure TForm1.Button2Click(Sender: TObject); begin DataSource1.DataSet:=Table1; // источник данных - таблица end;
// активизация формы procedure TForm1.FormActivate(Sender: TObject); begin DataSource1.DataSet := Table1; Table1.Active := True; end;
end.
Процедура TForm1.Button1Click запускается щелчком кнопки Запрос. Она принимает от пользователя строку (фамилии) и записью (добавлением) строк в свойство SQL формирует текст запроса. Затем эта процедура вызовом метода Open активизирует выполнение запроса.
Следует обратить внимание на то, что перед изменением свойства SQL-запрос должен быть закрыт при помощи метода close (здесь надо вспомнить, что результат выполнения запроса это файл данных (таблица), который создается в результате выполнения запроса).
Процедура TForm1.Button2Click, которая запускается щелчком кнопки Все записи, устанавливает в качестве источника данных для компонента DataSourcel компонент Table1, тем самым обеспечивая переход в режим просмотра всей базы данных.
Если запрос записан в свойство SQL во время разработки формы приложения, то во время работы программы критерий запроса можно изменить простой заменой соответствующей строки текста запроса.
Например, для запроса
SELECT DISTINCT Fam, Name, Class FROM ":Школа:school.db" WHERE
(Class= '10а') ORDER BY Name, Fam
инструкция замены критерия запроса может быть такой:
forml.Query1.SQL[3]:='(Fam="' + fam+ '")'
Следует обратить внимание на то, что свойство SQL является структурой типа TStrings, в которой строки нумеруются с нуля.

Выбор информации из базы данных
Для выборки из базы данных записей, удовлетворяющих некоторому критерию, предназначен компонент Query (рис. 1).
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 1. Значок компонента Query
Компонент Query похож на компонент Table, но, в отличие от последнего, он представляет не всю базу данных (все записи), а только ее часть записи, удовлетворяющие критерию запроса.
В табл. 1 перечислены некоторые свойства компонента Query.
Т аблица 1 Свойства компонента Query

Свойство
Определяет

Name

SQL
 
Active
Имя компонента. Используется компонентом Datasource для связи результата выполнения запроса (набора записей) с компонентом, обеспечивающим просмотр записей, например DBGrid
Записанный на языке SQL запрос к базе данных (к таблице)
При присвоении свойству значения True активизирует выполнение запроса


В общем виде запрос на выборку из таблицы данных выглядит так:
SELECT Список-Полей FROM Таблица WHERE (Критерий) ORDER BY СписокПолей
где:
SELECT команда выбора записей из таблицы и вывода содержимого полей, имена которых указаны в списке;
FROM параметр команды, который определяет имя таблицы, из которой нужно сделать выборку;
WHERE параметр, который задает критерий выбора. В простейшем случае критерий это инструкция проверки содержимого поля;
ORDER BY - параметр, который задает условие, в соответствии с которым будут упорядочены записи, удовлетворяющие критерию запроса.
Например, запрос
SELECT Fam, Name FROM ':Школа:school.db' WHERE
(Class = '10a') ORDER BY Name, Fam
обеспечивает выборку из базы данных "Школа" (из таблицы School.db) записей, у которых в поле class находится текст 10а, т. е. формирует упорядоченный по алфавиту список учеников 10-а класса.
.
Ниже приведен фрагмент кода, который формирует запрос на поиск информации о конкретном человеке (критерий выбора содержимое поля Fam должно совпадать со значением переменной fam).
with forml.Queryl do begin
Close; // закрыть файл результат выполнения
// предыдущего запроса
SQL.Clear; // удалить текст предыдущего запроса
// записываем новый запрос в свойство SQL
SQL.Add('SELECT Fam, Name, Class1);
SQL.Add('FROM ":Школа:school.db"');
SQL.Add('WHERE');
SQL.Add('(Fam = '" + fam + '")');
SQL.Add('ORDER BY Name, Fam');
Open; // активизируем выполнение запроса
end;
Следующая программа, ее текст приведен в листинге а диалоговое окно на рис. 2, демонстрирует возможность изменения запроса, точнее, критерия запроса, во время работы программы. Программа обеспечивает вывод как всего списка учеников, так и его части. Например, посредством выполнения запроса выводится информация только о конкретном ученике.
Для просмотра базы данных и результата выполнения запроса используется компонент DBGrid1, который через компонент DataSourcel взаимодействует с компонентом Table1 (при просмотре всей базы данных) или с компонентом Query (при просмотре результата выполнения запроса).
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 2. Форма приложения База данных Школа

Лекция 24
Тема Средства создания проектов

Создание базы данных «Школа» в режиме таблицы
Программа работы с базой данных "Архитектурные памятники Санкт-Петербурга" выводит информацию в режиме формы, в каждый момент времени пользователь может видеть только одну запись. Такой режим работы с базой данных не всегда удобен. Если необходимо видеть одновременно несколько записей базы данных, то нужно обеспечить просмотр данных в режиме таблицы.
Процесс создания приложения, обеспечивающего просмотр базы данных в режиме таблицы, рассмотрим на примере программы работы с базой данных "Школа".
Пусть база данных "Школа" (псевдоним школа), представляет собой таблицу, которая находится в файле School.db. Записи таблицы school состоят из полей: Name (Имя), Fam (Фамилия), class (Класс), Adr (Адрес) и N (Личный номер). Поля Name, Fam, class и Adr являются полями символьного типа (тип А), а поле N числовое, с автоувеличением.
Примечание
Псевдоним Школа следует создать при помощи BDE Administrator, а таблицу (файл school.db) при помощи Database Desktop.
Сначала в форму разрабатываемого приложения нужно добавить компоненты Table и DataSource, которые обеспечивают доступ к файлу данных, и установить значения их свойств (табл. 1).
Таблица 1. Значения свойств компонентов Table1 и DataSource1
Свойство
Значение

Tablel . DatabaseName
Tablel . TableName
Tablel. Active DataSourcel . Dataset
Школа school . db
True
Tablel


Для обеспечения просмотра и редактирования данных в режиме таблицы в форму приложения надо добавить компонент DBGrid, значок которого находится на вкладке Data Controls (рис. 1). Вид формы разрабатываемого приложения после добавления компонента DBGrid приведен на рис. 1
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 1. Значек компонента DBGrid
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 2. Форма приложения после добавления компонента DBGrid
Компонент DBGrid обеспечивает представление базы данных в виде таблицы. Свойства компонента DBGridl определяют вид таблицы и действия, которые могут быть выполнены над данными во время работы программы.
Для того чтобы задать, какая информация будет отображена в таблице во время работы программы, нужно сначала определить источник данных для таблицы (установить значения свойства DataSource), затем установить значения уточняющих параметров свойства Columns. Значение свойства DataSource задается обычным образом, то есть в окне Object Inspector. Чтобы установить значение свойства Columns, надо в окне Object Inspector выбрать это свойство и щелкнуть на кнопке с тремя точками. В результате открывается окно редактора колонок .
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 4. Редактор колонок
Для того чтобы в компонент DBGrid добавить колонку, обеспечивающую просмотр содержимого поля записи файла данных, необходимо нажать кнопку Add New, находящуюся на панели инструментов в верхней части окна (это единственная доступная после запуска редактора кнопка), выделить добавленный элемент и, используя Object Inspector, установить значения свойств этой колонки Свойство columns компонента DBGrid представляет собой массив компонентов типа TCoiumn. Каждой колонке соответствует элемент массива. Устанавливая значения свойств компонентов column, программист задает вид колонок компонента DBGrid, тем самым определяет вид всей таблицы.
 Последнее, что надо сделать добавить к форме компонент DBNavigator, настроив его на работу с таблицей-источником данных (свойству DataSource Нужно Присвоить значение Table1).
Окончательный вид формы приложения приведен на рис. 5
[ Cкачайте файл, чтобы посмотреть картинку ]
Рис. 5 Форма после настройки компонента DBGrid1
После этого программу можно откомпилировать и запустить. Следует обратить внимание, что для того чтобы после запуска программы в окне появилась информация или, если база данных пустая, можно было вводить новую информацию, свойство Active таблицы-источника данных должно иметь значение True.
Работа с базой данных, представленной в виде таблицы, во многом похожа на работу с электронной таблицей Microsoft Excel. Используя клавиши перемещения курсора вверх и вниз, а также клавиши листания текста страницами ( и ), можно, перемещаясь от строки к строке, просматривать записи базы данных. Нажав клавишу , можно добавить запись, а нажав клавишу удалить запись. Для того чтобы внести изменения в поле записи, нужно, используя клавиши перемещения курсора влево и вправо, выбрать необходимое поле и нажать клавишу .



Список литературы
М.А. Прищепов «Программирование на языках Basic, Pascal, Object Pascal в среде Delphi». Минск, 2006г.-320с.
А.Г. Смольянов «Визуальное конструирование программ средствами инструментальной системы Delphi ». Саранск, 2000г.-76с.
Е.В. Давыдова, И.А. Скородумов. Создание базовых элементов интерфейса Windows –программы в среде Delphi. \\ Информатика и образование.2002г.-№5. С 30-40.













 



"
$
&
H
J
ћ

·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·‚

$
&
J

·

·

·

·

·

·
ъ