3 8 9 7 Министерство образования Республики Беларусь БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра программного обеспечения вычислительной техники и автоматизированных систем РАЗРАБОТКА ПРИЛОЖЕНИЙ В ВИЗУАЛЬНЫХ СРЕДАХ Лабораторный практикум Часть 1 Минск БНТУ 2010 Министерство образования Республики Беларусь БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра программного обеспечения вычислительной техники и автоматизированных систем РАЗРАБОТКА ПРИЛОЖЕНИЙ В ВИЗУАЛЬНЫХ СРЕДАХ Лабораторный практикум для студентов специальностей 1-40 01 01 «Программное обеспечение информационных технологий», 1-40 01 02 «Информационные системы и технологии» В 2 частях Часть 1 Минск БНТУ 2010 УДК 004.4'236(076.5) Р 17 Составитель Гурский Н.Н. Рецензенты: канд. техн. наук, профессор БГАТУ Р. И. Фурунжиев; канд. физ-мат. наук, доцент БНТУ Казакевич Р 17 Разработка приложений в визуальных средах: лабораторный прак- тикум для студентов специальностей 1-40 01 01 «Программное обес- печение информационных технологий», 1-40 01 02 «Информацион- ные системы и технологии»: в 2 ч. / сост. Н.Н. Гурский. - Минск: БНТУ, 2010.-Ч. 1 . - 5 9 с. В практикуме представлен комплекс заданий для выполне- ния лабораторных работ по первой части дисциплины «Разра- ботка приложений в визуальных средах», посвященной изуче- нию основ разработки приложений в визуальной среде Delphi; рассмотрены принципы построения приложений, связанные с использованием основных компонентов; приведен список учеб- ной литературы. ISBN 978-985-525-455-4 (Ч. 1) ISBN 978-985-525-456-1 © БНТУ, 2010 Содержание Методические указания 5 ЛАБОРАТОРНАЯ РАБОТА 1. Разработка простейшего приложения в визуальной среде Delphi 6 ЛАБОРАТОРНАЯ РАБОТА 2. Разработка приложения, реализующего разветвляющийся вычислительный процесс 10 ЛАБОРАТОРНАЯ РАБОТА 3. Разработка приложения, реализующего циклический вычислительный процесс 14 ЛАБОРАТОРНАЯ РАБОТА 4. Разработка приложения с использованием массивов 18 ЛАБОРАТОРНАЯ РАБОТА 5. Разработка приложения обработки строковой информации 21 ЛАБОРАТОРНАЯ РАБОТА 6. Разработка приложения с использованием записей и файлов 26 ЛАБОРАТОРНАЯ РАБОТА 7. Разработка приложения с использованием подпрограмм и модулей 32 ЛАБОРАТОРНАЯ РАБОТА 8. Разработка приложения с выдачей результатов , вычислений в виде графиков 36 ЛАБОРАТОРНАЯ РАБОТА 9. Разработка приложения, состоящего из нескольких форм 38 3 ЛАБОРАТОРНАЯ РАБОТА 10. Разработка приложения с сохранением параметров и установок в Ini-файлах 40 ЛАБОРАТОРНАЯ РАБОТА 11. Разработка приложения, поддерживающего создание графических изображений 42 ЛАБОРАТОРНАЯ РАБОТА 12. Разработка приложения, управляемого с помощью панели инструментов 53 ЛАБОРАТОРНАЯ РАБОТА 13. Разработка приложения, представленного в виде многостраничного документа 55 ЛАБОРАТОРНАЯ РАБОТА 14. Разработка комплексного приложения 56 ЛИТЕРАТУРА 57 ПРИЛОЖЕНИЕ 58 4 МЕТОДИЧЕСКИЕ УКАЗАНИЯ При выполнении лабораторных работ необходимо: 1. В соответствии с целью работы сформулировать задачу, которая должна быть решена с помощью приложения. 2. Разработать алгоритм решения задачи. 3. Разработать приложение, включающее интерфейс, про- граммные модули вычислительных процедур, формы пред- ставления результатов. 4. Выполнить компьютерное моделирование. 5. Произвести тестирование алгоритма и приложения. 6. Сделать выводы и обобщения. 7. Составить электронный вариант отчета с результатами выполнения приложения. Образец оформления титульного листа приведен в прило- жении. При выполнении работ рекомендуется обратиться к литературе [1-9]. 5 ЛАБОРАТОРНАЯ РАБОТА 1 Разработка простейшего приложения в визуальной среде Delphi Цель: изучить основы среды Delphi и разработать простей- шее приложение. Краткие сведения Интегрированная среда разработчика Delphi Среда Delphi визуально реализуется в виде нескольких од- новременно раскрытых на экране монитора окон. Количество, расположение, размер и вид окон может меняться программи- стом в зависимости от его текущих нужд, что значительно по- вышает производительность работы. При запуске Delphi на экране появляется главное окно, приведенное на рис. 1. шщвтявшштшшяипшшшшш sj-gte Jsaith Vm • PiojKt Еоиропев! Й<И«Ь»« 1«* МоНадад» Нф ' ^ - в &-э а л <§> " ' 5'ЙЦ.у - И ГЬ о* ГЛШ1 - - л ~ ;. л * ® g §g ^ - £ AjcSe^olt' • Ъие BCW^te ^ XbdLeftToRiSjht *8«deic*m :bSj*ten>Menu BeriefStyte 6o»d«Wkih " о JFoit-T: TFcxml AptoeCorpd , A8gn aJNone ' " " 'r~ 4' i Ш s Елайсл |Гош1 ОИНад» - i Щ0 ; >|1 -tftralnh ^ Sizkawesb faa? _ " Cuitw oOefc-jS; О ( / М + ^ - ^ Т Щ ху<0 ( / ( * ) + ^ )2+1, XV = 0. ln ( / (x ) ) + ( / ( x ) 2 + j / ) \ х /у> 0 fo\f(x)/y\ + ( f ( x ) + y)\ х/у< О ( f ( x f + y ) \ х = 0 О, у = 0. f(x? +у2 +siny, х-у = О (/(*)- .у)2 + COS {y-f(x)f+tg(yl х-у< 0. (Ах) - У? + arctg(/(x)), х> у (У ~ А * ) ? + arctg(/(x)), у >х (у + f(x)? + ОД у = х. 12 5. е = i^j f(x), i - нечетное, x > 0 if 2^|/(x)| , i - четное, x < 0 yl\if(A> иначе. 1еЛЩ 0,5m (f(x)+mf, иначе. 2/(xf+3p2, x>p \f(x)-p\, 3 < x < ( f ( x ) - p f , x = p. ln(|/(x)|+|9|), И >10 ef{x)+q, |xg|<10 f ( x ) + q, Ы = 10. 13 ЛАБОРАТОРНАЯ РАБОТА 3 Разработка приложения, реализующего циклический вычислительный процесс Цель: изучить средства отладки программ в среде Delphi. Составить и отладить программу выполнения циклического вычислительного процесса. Краткие сведения Операторы организации циклов repeat, while, for Под циклом понимается многократное выполнение одних и тех же операторов при различных значениях промежуточных данных. Число повторений может быть задано в явной или не- явной форме. Для организации повторений в языке Pascal пре- дусмотрены операторы Repeat, While и For. Оператор Repeat имеет форму: Repeat <операторы> until <условие>; и организует повторение операторов, помещенных между клю- чевыми словами repeat и until, до тех пор, пока не выполнится <условие> = true, после чего управление передается следую- щему за циклом оператору. Оператор While имеет форму: \¥ЬНе<условие >do begin <операторы> end; и организует повторение операторов, помещенных между begin и end, до тех пор, пока не выполнится <условие> = false. Заме- тим, что если <условие> = false при первом входе в цикл, то 14 <операторы> не выполнятся ни разу, в отличие от оператора Repeat, в котором хотя бы один раз они выполнятся. Оператор For имеет форму: For i := il to i2 do begin <операторы> end; и организует повторное вычисление операторов при нарас- тающем изменении переменной цикла i от начального значе- ния il до конечного i2 с шагом, равным единице. Заметим, что если i2 < il, то <операторы> не выполнятся ни разу. Модификация оператора имеет вид: For i := i2 down to il do begin <операторы> end; и организует повторение вычислений при убывающем изме- нении i на единицу. Средства отладки программ в Delphi В написанной программе после ее запуска, как правило, обнаруживаются ошибки. Ошибки первого уровня (ошибки компиляции) связаны с неправильной записью операторов (орфографические и/или синтаксические ошибки). При обна- ружении ошибки компилятор Delphi останавливается напро- тив первого оператора, в котором обнаружена ошибка. В ниж- ней части экрана появляется текстовое окно, содержащее све- дения обо всех ошибках, найденных в проекте. Каждая строка этого окна содержит имя файла, в котором найдена ошибка, номер строки с ошибкой и характер ошибки. Для быстрого перехода к интересующей ошибке необходимо дважды щелк- нуть на строке с ее описанием. 15 Для получения более полной информации о характере ошиб- ки необходимо обратится к Help нажатием клавиши F1. Сле- дует обратить внимание на то, что одна ошибка может по- влечь за собой другие, которые исчезнут при ее исправлении. Поэтому исправлять ошибки нужно последовательно, сверху вниз, после исправления каждой ошибки необходимо компи- лировать программу снова. Ошибки второго уровня - ошибки времени выполнения. Они связаны с ошибками выбранного алгоритма решения или с не- правильной программной реализацией алгоритма. Эти ошибки проявляются в том, что результат расчета оказывается невер- ным, либо происходит переполнение (деление на нуль) и др. По- этому перед использованием отлаженной программы ее необхо- димо протестировать, т.е. сделать просчеты при таких комбина- циях исходных данных, для которых заранее известен результат. Если тестовые расчеты указывают на ошибку, то для ее поиска следует использовать встроенные средства отладки среды Delphi. В простейшем случае для локализации места ошибки реко- мендуется поступать следующим образом. В окне редактиро- вания текста установить курсор в строке перед проверяемым участком, выделить этот оператор нажатием мыши на полосе слева от текста программы, нажать клавишу F4 (выполнение до курсора). При этом выполнение программы будет останов- лено на строке, содержащей курсор. Теперь можно увидеть, чему равны значения интересующих переменных. Для этого нужно поместить на переменную курсор и в качестве подсказ- ки на экране будет высвечено ее значение. В другом варианте требуется нажать комбинацию клавиш Ctrl-F7 и в появив- шемся диалоговом окне указать интересующую переменную (с помощью данного окна можно также изменить значение переменной во время выполнения программы). Нажимая клавишу F7 (пошаговое выполнение), можно по- строчно выполнять программу, контролируя изменение тех или иных переменных и правильность вычислений. Если кур- 16 сор находится внутри цикла, то после нажатия F4 расчет оста- навливается после одного выполнения тела цикла. Для про- должения расчетов следует нажать мышью на команде меню Run. Нажимая клавишу F8 можно продолжать отладку не заходя внутрь процедур и функций. Постановка задачи Разработать приложение с реализацией циклических вычис- лений в соответствии с индивидуальным заданием. Задания В заданиях (табл. 1) необходимо вывести на экран таблицу значений функции Y(x) и ее разложения в ряд S(x) для х, изме- няющихся от хп до хк с шагом h = (xk- хп)/п. Близость зна- чений S(x) и У(х) во всем диапазоне значений х указывает на правильность вычисления S(x) и Y(x). Таблица 1 Варианты заданий № хп ч S(x) n Y(x) 1 0,1 1 v3 v2n+l X * +...+ ( I f * , 3! V ' (2/i+ l ) 16 sinx 2 0,1 1 , x2 x2» 1 + + .. + 7—r 2 (2 я ) 10 Л , -X e +e 2 3 од 1 Я It cos— cos и— 1 + + 4xn 1! n\ 12 n s \ XCOSj ( e 4 соя xsm— \ 4 J 17 Окончание табл. 1 № хп ч S(x) п т 4 од 1 г2 v2" 2! V ' (2и) 8 COSX 5 0,1 1 . - 2 2п + \ 2п 1 + Зх +...+ х1п п\ 14 (l + 2 х2У 6 0,1 1 х3 х2п+1 Х + + ... + 7 г- 3! (2я + 1) 8 е х-е~х 2 7 0,1 1 г3 г5 , т2и+1 * * +...+( ^ х 3 15 4и -1 12 1+ х 2 х X 2 a r c tgx - 2 8 0,1 1 , 2х (2xf 1 + — + ... + -—— 1! п\ 10 в2* 9 0,1 1 Y3 2л+1 х Х +... + ( 1 )пХ 3 v ' 2« + 1 14 ( 2 > £ — + —+ 1 е2 4 2 V У 10 0,1 0,5 V3 Г2П+1 х х +... + ( 1 ух 3 7 2и + 1 15 arctg(x) ЛАБОРАТОРНАЯ РАБОТА 4 Разработка приложения с использованием массивов Цель: изучить свойства компонента TStringGrid. Написать программу с использованием массивов. Краткие сведения Работа с массивами Массив - упорядоченный набор однотипных элементов, объединенных под одним именем. Каждый элемент массива 18 обозначается именем, за которым в квадратных скобках сле- дует один или несколько индексов, разделенных запятыми, например: а[1], bb[I], cl2[I, j*2], q[l, 1, I*j-1]. В качестве ин- декса можно использовать любые порядковые типы за исклю- чением Longlnt, Тип массива или сам массив определяются соответственно в разделе типов (Туре) или переменных (Var) с помощью ключевого слова Array следующим образом: Array [описание индексов] of <тип элементов массива >; Примеры описания массивов: Const N=20; // Задание максимального значения индекса; Туре TVector = array [1 ..N] of real; // Описание типа одномерного массива; Var А : TVector; //А - массив типа TVector; Ss : array[l.. 10] of integer; //Ss - массив из десяти целых чисел; Y: array[1..5,1.. 10] of char; //Y - двумерный массив символьного типа. Элементы массивов могут использоваться в выражениях так же, как и обычные переменные, например: F:=2*a[3] + a[ss[l] + l]*3; A[n]:= 1 +sqrt(abs(a[n-1 ])); Компонент TStringGrid При работе с массивами ввод и вывод информации на эк- ран удобно организовывать в виде таблиц, используя компо- нент TStringGrid. Последний предназначен для отображения информации в виде двумерной таблицы, каждая ячейка кото- рой представляет собой окно однострочного редактора (ана- логично окну TEdit). Доступ к информации осуществляется с помощью свойства Cells[ACol, ARow : integer] : string; где ACol, ARow - индексы элементов двумерного массива. Свойства 19 ColCount и RowCount устанавливают количество строк и столб- цов в таблице, а свойства FixedCols и FixedRows задают коли- чество строк и столбцов фиксированной зоны. Фиксированная зона выделена другим цветом, и в нее запрещен ввод инфор- мации с клавиатуры. Для установки компонента TStringGrid на форму необхо- димо на странице Additional палитры компонентов щелкнуть мышью по пиктограмме ®JL После этого щелкните мышью в нужном месте формы. Захватывая кромки компонента, от регулируйте его размер. С помощью свойств ColCount и RowCount можно задать соответственно число столбцов и строк таблицы. Чтобы разрешить ввод информации в поле таблицы необходимо свойству Options goEditing присвоить значение True. Постановка задачи Разработать приложение обработки и представления инфор- мации в табличной форме в сооветствии с индивидуальным заданием. Задания Во всех заданиях скалярные переменные вводить с помо- щью компонента типа TEdit с соответствующим пояснением в виде компонента типа TLabel. Скалярный результат выводить в виде компонента TLabel. Массивы представлять на форме в виде компонентов TStringGrid, в которых 0-й столбец и 0-ю строку использовать для отображения индексов массивов. Вычисления выполнять после нажатия кнопки типа TButton. 1. Задана матрица размером NxM. Получить массив В, присвоив его &-му элементу значение 0, если все элементы к-го столбца матрицы нулевые, и значение 1 в противном случае. 20 2. Задана матрица размером NxM. Получить массив В, присвоив его к-му элементу значение 1, если элементы к-й строки матрицы упорядочены по убыванию, и значение 0 в противном случае. 3. Задана матрица размером N x M . Получить массив В, присвоив его к-му элементу значение 1, если к-я строка мат- рицы симметрична, и значение 0 в противном случае. 4. Задана матрица размером NxM . Определить к - количе- ство «особых» элементов матрицы, считая элемент «особым», если он больше суммы остальных элементов своего столбца. 5. Задана матрица размером NxM. Определить к - коли- чество «особых» элементов матрицы, считая элемент «осо- бым», если в его строке слева от него находятся элементы меньшие его, а справа - большие. 6. Задана символьная матрица размером NxM. Опреде- лить к - количество различных элементов матрицы (т.е. по- вторяющиеся элементы считать один раз). 7. Дана матрица размером N x M . Упорядочить ее строки по неубыванию их первых элементов. 8. Дана матрица размером NxM . Упорядочить ее строки по неубыванию суммы их элементов. 9. Дана матрица размером NxM . Упорядочить ее строки по неубыванию их наибольших элементов. 10. Определить, является ли заданная квадратная матрица n-го порядка симметричной относительно побочной диагонали. ЛАБОРАТОРНАЯ РАБОТА 5 Разработка приложения обработки строковой информации Цель: изучить методы программирования с использовани- ем строк и правила работы с компонентами TListBox и TComboBox. Написать программу работы со строками. 21 Краткие сведения Типы данных для работы со строками Короткие строки типа ShortString и StringfNJ Короткие строки имеют фиксированное количество симво- лов. Строка ShortString может содержать 255 символов. Стро- ка String[N] может содержать N символов, но не более 255. Первый байт этих переменных содержит длину строки. Длинная строка типа String При работе с этим типом данных память выделяется по мере необходимости (динамически) и может занимать всю доступ- ную программе память. Вначале компилятор выделяет для пе- ременной 4 байта, в которых размещается номер ячейки памя- ти, начиная с которой будет располагаться символьная строка. На этапе выполнения программа определяет необходимую дли- ну цепочки символов и обращается к ядру операционной сис- темы с требованием выделить необходимую память. Широкая строка типа WideString Введена для обеспечения совместимости с компонентами, основанными на OLE-технологии. От типа String отличается только тем, что для представления каждого символа использу- ется не один, а два байта. Нуль-терминальная строка типа PChar Представляет собой цепочку символов, ограниченную сим- волом #0. Максимальная длина строки ограничена только до- ступной программе памятью. Нуль-терминальные строки ши- роко используются при обращениях к ^Pi-функциям Windows (API - Application Program Interface - интерфейс прикладных программ). Представление строки в виде массива символов Строка может быть описана как массив символов. Если мас- сив имеет нулевую границу, он совместим с типом PChar. 22 Var MasS : array[1.. 100] of Char; В отличие от нуль-терминальной строки здесь длина имеет фиксированное значение и не может меняться в процессе вы- полнения программы. Компонент TListBox Компонент TListBox представляет собой список, элементы которого выбираются при помощи клавиатуры или мыши. Список элементов задается свойством Items, методы Add, Delete и Insert используются для добавления, удаления и вставки строк. Для определения номера выделенного элемента используется свойство Itemlndex. Компонент TComboBox Комбинированный список TComboBox представляет собой комбинацию списка TListBox и редактора TEdit, поэтому прак- тически все свойства заимствованы у этих компонентов. Для работы с окном редактирования используется свойство Text как в TEdit, а для работы со списком выбора - свойство Items как в TListBox. Существует пять модификаций компонента, определяемых его свойством Style. В модификации csSimple список всегда раскрыт, в остальных он раскрывается после нажатия кнопки справа от редактора. Компонент TBitBtn Компонент TBitBtn расположен на странице Additional па- литры компонентов и представляет собой разновидность стан- дартной кнопки TButton. Его отличительная особенность - на- личие растрового изображения на поверхности кнопки, которое определяется свойством Glyph. Кроме того, имеется свойство Kind, которое задает одну из стандартных разновидностей 23 кнопок. Нажатие любой из них, кроме bkCustom и bkHelp за- крывает модальное окно и возвращает в программу результат mr*** (например, bkOk - mrOk). Кнопка bkClose закрывает главное окно и завершает работу программы. Обработка событий Обо всех происходящих в системе событиях таких, как соз- дание формы, нажатие кнопки мыши или клавиатуры и т.д., ядро Windows информирует окна путем посылки соответст- вующих сообщений. Среда Delphi позволяет принимать и об- рабатывать большинство таких сообщений. Каждый компо- нент содержит обработчики сообщений на странице Events инспектора объектов. Для создания обработчика события необходимо раскрыть список компонентов в верхней части окна инспектора объек- тов и выбрать необходимый компонент. Затем на странице Events нажатием левой клавиши мыши выбрать обработчик и дважды щелкнуть по его левой (белой) части. В ответ Delphi активизирует окно текста программы и покажет заготовку про- цедуры обработки выбранного события. Каждый компонент имеет свой набор обработчиков событий, однако некоторые из них присущи большинству компонентов. Наиболее часто применяемые события представлены в табл. 2. Таблица 2 Наиболее часто генерируемые события Событие Описание события OnActivate Возникает при активации формы OnCreate Возникает при создании формы (компонент TForm). В обработчике данного события следует задавать дейст- вия, которые должны происходить в момент создания формы, например, установка начальных значений 24 Окончание табл. 2 Событие Описание события OnKeyPress Возникает при нажатии клавиши на клавиатуре. Обра- ботчик этого события возвращает через параметр Key:Char ASCII-код нажатой клавиши OnKeyDown Обработчик этого события получает информацию о состоянии клавиши Shift, Alt и Ctrl и возвращает че- рез параметр Key:Word номер нажатой клавиши OnKeyUp Является парным событием для OnKeyDown и возни- кает при отпускании ранее нажатой клавиши OnClick Возникает при нажатии кнопки мыши в области ком- понента OnDblClick Возникает при двойном нажатии кнопки мыши в об- ласти компонента Постановка задачи Разработать приложение с использованием компонентов, управляющих представлением строковой информации в соот- ветствии с индивидуальным заданием. Задания 1. Дана строка, состоящая из групп нулей и единиц. Каж- дая группа отделяется от другой одним или несколькими про- белами. Найти количество групп с пятью символами. 2. Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран самую короткую группу. 3. Дана строка, состоящая из групп нулей и единиц. Под- считать количество символов в самой длинной группе. 4. Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран группы с четным количеством символов. 25 5. Дана строка, состоящая из групп нулей и единиц. Под- считать количество единиц в группах с нечетным количеством символов. 6. Дана строка, состоящая из букв, цифр, запятых, точек, знаков «+», «-». Выделить подстроку, которая соответствует записи целого числа (т.е. начинается со знака «+» или «-» и внутри подстроки нет букв, запятых и точек). 7. Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков «+» и «-». Выделить подстроку, которая соответ- ствует записи вещественного числа с фиксированной точкой. 8. Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков «+» и «-». Выделить подстроку, которая соот- ветствует записи вещественного числа с плавающей точкой. 9. Дана строка символов, состоящая из произвольных де- сятичных цифр, разделенных пробелами. Вывести на экран чис- ла этой строки в порядке возрастания их значений. 10. Дана строка символов, состоящая из произвольных де- сятичных цифр, разделенных пробелами. Вывести четные чис- ла этой строки. ЛАБОРАТОРНАЯ РАБОТА 6 Разработка приложения с использованием записей и файлов Цель: изучить правила работы с компонентами TOpenDialog и TSaveDialog. Написать программу с использованием файлов и структурированных данных. Краткие сведения Программирование с использованием переменных типа запись Запись - это структура данных, состоящая из полей. Поля - это элементы одного или разных типов. Записи удобны для 26 создания структурированных баз данных с разнотипными эле- ментами, например: Туре TStudent = record //Объявление типа запись Fio : string[20]; //Поле ФИО Group : integer; //Поле номера «луд. группы Осп : array[1..3] of integer; //Поле массива оценок end: Var Student: TStudent; //Объявление переменной типа запись Доступ к каждому полю осуществляется указанием имени записи и поля, разделенных точкой, например: StudentFio := 'Иванов А.И.'; //Внесение данных в поля записи Student.Group := 107218; Доступ к полям можно осуществлять также при помощи оператора With: With Student do begin Fio := 'Иванов А.И.'; Group := 107218; end; Работа с файлами Файл - это именованная область данных на внешнем физи- ческом носителе. В Object Pascal различают три вида файлов в зависимости от способа их организации и доступа к элемен- там: текстовые, типизированные и нетипизированные. Текстовой файл - это файл, состоящий из строк. Приме- ром текстового файла может служить файл исходного текста программы в Delphi (расширение *.pas). Для работы с тексто- вым файлом должна быть описана соответствующая файловая переменная: var F : TextFile; 27 Типизированный файл - файл, имеющий строго заданную структуру, когда все элементы имеют фиксированный и оди- наковый размер. Это свойство типизированных файлов по- зволяет получить доступ к любому компоненту файла по его порядковому номеру. Элементами такого файла являются, как правило, записи. В описании файловой переменной указыва- ется ее тип: Var F: TStudent: Нетипизированный файл - это файл, в котором данные не имеют определенного типа и рассматриваются, как последова- тельность байт. Файловая переменная объявляется: Var F: File; Процедуры работы с файлами AssignFile(var F; FileName: string) - связывает файловую переменную F и файл с именем FileName. Reset(var F[: File; RecSize: word]) - открывает существую- щий файл. При открытии нетипизированного файла RecSize задает размер элемента файла. Rewrite(var F[: File; RecSize: word]) - создает и открывает новый файл. Append(var F: TextFile) - открывает текстовый файл для до- писывания текста в конец файла. Read(F, vl[, v2...vn]) - чтение значений переменных, начиная с текущей позиции для типизированных файлов и со строк - для текстовых. Write(F, vl[, v2,...vnj) - запись значений переменных, начиная с текущей позиции для типизированных файлов и со строк - для текстовых. CloseFile(F) - закрывает ранее открытый файл. Rename(var F; NewName: string) - переименовывает неот- крытый файл любого типа. 28 Erase(var F) - удаляет неоткрытый файл любого типа. Seek(var F; NumRec: Longint) - для нетекстового файла ус- танавливает указатель на элемент с номером NumRec. SetTextBuf(var F: TextFile; var Buf[;Size: word]) - для тек- стового файла устанавливает новый буфер ввода-вывода объ- ема Size. Flush(var F: TextFile) - немедленная запись в файл содер- жимого буфера ввода-вывода. Truncate(var F) - урезает файл, начиная с текущей позиции. LoResult: integer - код результата последней операции вво- да-вывода. FilePos(var F): longint - для нетекстовых файлов возвращает номер текущей позиции. Отсчет ведется от нуля. FileSize(var F): longint - для нетекстовых файлов возвраща- ет количество компонентов в файле. Eoln(var F: TextFile): boolean - возвращает True, если дос- тигнут конец строки. Eof(var F) ): boolean - возвращает True, если достигнут ко- нец файла. SeekEoln(var F: TextFile): boolean - возвращает True, если пройден последний значимый символ в строке или файле, от- личный от пробела или знака табуляции. SeekEoln(var F: TextFile): boolean - то же, что и SeekEoln, но для всего файла. BlockRead(var F: File; var Buf; Count: word[; Result: word]) BlockWrite(var F : File; var Buf; Count: word[; Result: word]) - соответственно процедуры чтения и записи переменной Buf с количеством Count блоков. Порядок работы с файлами AssignFile(F, 'FileName.txt'); //Связывание файловой переменной F //с именем дискового файла «FileName.txt» Rewrite(F); //Создание нового файла Reset(F); //Открытие уже существующего файла 29 Read(F, Student); Write(F, Student); CloseFile(F); //Чтение данных из файла //Запись данных в файл //Закрытие файла Компоненты TOpenDialog и TSaveDialog Компоненты TOpenDialog и TSaveDialog находятся на странице DIALOGS. Все компоненты этой страницы являются невизуальными, т.е. не видны в момент работы программы. Поэтому их можно разместить в любом удобном месте формы. Оба рассматриваемых компонента имеют идентичные свойства и отличаются только внешним видом. После вызова компо- нента появляется диалоговое окно, с помощью которого вы- бирается имя файла и путь к нему. В случае успешного за- вершения диалога имя выбранного файла и маршрут поиска содержится в свойстве FileName. Для фильтрации файлов, ото- бражаемых в окне просмотра, используется свойство Filter, а для задания расширения файла, в случае, если оно не задано пользователем - свойство DefaultExt. Если необходимо изме- нить заголовок диалогового окна - используется свойство Title. Разработать приложение, поддерживающее чтение и сохра- нение информации в файлах в соответствии с индивидуаль- ным заданием. В приложении предусмотреть сохранение вводимых данных в файле и возможность чтения из ранее сохраненного файла. Результаты выводить в окно просмотра и в текстовой файл. 1. В магазине формируется список лиц, записавшихся на покупку товара повышенного спроса. Каждая запись этого списка содержит: порядковый номер, Ф.И.О., домашний адрес Постановка задачи Задания 30 покупателя и дату постановки на учет. Удалить из списка все повторные записи, проверяя Ф.И.О. и домашний адрес. 2. Список товаров, имеющихся на складе, включает в себя наименование товара, количество единиц товара, цену едини- цы и дату поступления товара на склад. Вывести в алфавит- ном порядке список товаров, хранящихся больше месяца, стои- мость которых превышает 1 ООО ООО руб. 3. Для получения места в общежитии формируется список студентов, который включает Ф.И.О. студента, группу, сред- ний балл, доход на члена семьи. Общежитие в первую очередь предоставляется тем, у кого доход на члена семьи меньше двух минимальных зарплат, затем остальным в порядке уменьше- ния среднего балла. Вывести список очередности предостав- ления мест в общежитии. 4. В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны его номер, тип автобуса, пункт назначения, время отправления и прибытия. Вывести информацию о рейсах, которыми можно воспользоваться для прибытия в пункт назначения раньше заданного времени. 5. На междугородной АТС информация о разговорах со- держит дату разговора, код и название города, время разгово- ра, тариф, номер телефона в этом городе и номер телефона абонента. Вывести по каждому городу общее время разгово- ров с ним и сумму. 6. Информация о сотрудниках фирмы включает: Ф.И.О., та- бельный номер, количество проработанных часов за месяц, по- часовый тариф. Рабочее время свыше 144 часов считается сверх- урочным и оплачивается в двойном размере. Вывести размер заработной платы каждого сотрудника фирмы за вычетом подо- ходного налога, который составляет 12 % от суммы заработка. 7. Информация об участниках спортивных соревнований содержит: наименование страны, название команды, Ф.И.О. игрока, игровой номер, возраст, рост, вес. Вывести информа- цию о самой молодой, рослой и легкой команде. 31 8. Для книг, хранящихся в библиотеке, задаются: регист- рационный номер книги, автор, название, год издания, изда- тельство, количество страниц. Вывести список книг с фами- лиями авторов в алфавитном порядке, изданных после задан- ного года. 9. Различные цеха завода выпускают продукцию несколь- ких наименований. Сведения о выпущенной продукции вклю- чают: наименование, количество, номер цеха. Для заданного цеха необходимо вывести количество выпущенных изделий по каждому наименованию в порядке убывания количества. 10. Информация о сотрудниках предприятия содержит: Ф.И.О., номер отдела, должность, дату начала работы. Вывести спи- ски сотрудников по отделам в порядке убывания стажа. ЛАБОРАТОРНАЯ РАБОТА 7 Разработка приложения с использованием подпрограмм и модулей Цель: изучить возможности Delphi для написания подпро- грамм и создания модулей. Составить и отладить программу, включающую внешний модуль Unit с подпрограммой. Краткие сведения Подпрограмма - это именованная, определенным образом оформленная группа операторов, которая может быть вызвана любое количество раз из любой точки основной программы. Подпрограммы используется в том случае, когда одна и та же, последовательность операторов в тексте программы повторя- ется несколько раз. Эта последовательность заменяется вызо- вом подпрограммы, содержащей необходимые операторы. Под- программы также применяются для создания специализиро- 32 ванных библиотечных модулей, содержащих набор подпро- грамм определенного назначения, для использования их дру- гими программистами. Подпрограммы подразделяются на процедуры и функции. Процедура имеет следующую структуру: Procedure <имя процедуры> ([список формальных параметров]); Const [описание используемых констант]; Туре [описание используемых типов]; Var [описание используемых переменных]; begin <операторы> end; Процедуры и функции могут быть использованы в качестве формальных параметров подпрограмм. Для этого определяет- ся тип: Туре <имя>= function ([список формальных параметров] ):<тип ре- зультата?»; или Туре <имя>= procedure ([список формальных параметров]); Имя процедуры или функции должно быть уникальным в пределах программы. Список формальных параметров необя- зателен и может отсутствовать. Если же он есть, то в нем пе- речисляются через точку с запятой имена формальных пара- метров и их типы. Имеется три вида формальных параметров параметры-значения, параметры-переменные, параметры-конс- танты. При вызове подпрограммы передача данных для этих видов осуществляются по-разному. Параметры-значения ко- пируются, и подпрограмма работает с их копией, поэтому при вызове на месте такого параметра можно ставить арифметиче- ское выражение. При использовании параметров-переменных (в описании перед ними ставится Var) и параметров-констант 33 в подпрограмму передается адрес, и она работает с самой пе- ременной. С помощью параметров-переменных подпрограмма передает результаты своей работы вызывающей программе. В функциях используется специальная переменная Result, интерпретируемая как значение, которое вернется в основную программу по окончании работы функции. В язык Object Pascal встроен ряд наиболее часто употреб- ляемых процедур и функций, которые являются частью языка и вызываются без предварительного определения в разделе описаний. Использование модулей Модуль - автономно компилируемая программная единица, включающая в себя процедуры, функции, а также различные компоненты раздела описаний. Структура модуля содержит следующие основные части: заголовок, интерфейсная часть, исполняемая, инициирующая и завершающая. Заголовок состоит из зарезервированного слова Unit и сле- дующего за ним имени модуля, которое должно совпадать с именем дискового файла. Использование имени модуля в раз- деле Uses основной программы приводит к установлению свя- зи модуля с основной программой. Интерфейсная часть расположена между зарезервирован- ными словами Interface и Implementation и содержит объявле- ние тех объектов модуля, которые должны быть доступны другим программам. Исполняемая часть начинается зарезервированным сло- вом implementation и содержит описание процедур и функций, объявленных в интерфейсной части. Она может также содер- жать вспомогательные типы, константы, переменные, проце- дуры и функции, которые будут использоваться только в ис- полняемой части и не будут доступны внешним программам. 34 Инициирующая часть начинается зарезервированным сло- вом Initialization и содержит операторы, которые исполняются до передачи управления основной программе. Завершающая часть начинается зарезервированным сло- вом Finalization и выполняется в момент окончания работы программы. Инициализирующая и завершающая части модуля используются крайне редко. Создавая модуль, следует обратить внимание на то, что он не должен иметь своей формы. Система Delphi при начальной загрузке автоматически создает шаблон программы, имеющий в своем составе форму, файл проекта и т.д. Так как модуль со- стоит только из одного файла, то необходимо перед его созда- нием уничтожить заготовку файла проекта и форму. Для этого в меню File выбрать Close All, файл проекта не сохранять. Для создания модуля в меню File выбрать File New, и затем в репозитории - пиктограмму Jp Unit. В результате будет соз- дан файл с заголовком Unit Unitl. Имя модуля можно сменить на другое, отвечающее внутреннему содержанию модуля, напри- мер, Unit MatFunc. Затем необходимо сохранить файл с именем, совпадающим с именем заголовка модуля: MatFimc.pas. Следу- ет обратить внимание на то, что имя файла должно совпадать с именем модуля, иначе Delphi не сможет подключить его к другой программе. Для того чтобы подключить модуль к проекту, необходимо в меню Project выбрать опцию Add to Project... и указать файл, содержащий модуль. После этого в разделе Uses добавить имя подключаемого модуля - MatFunc. Теперь в проекте можно использовать функции, содержащиеся в модуле. Постановка задачи Разработать приложение, состоящее из нескольких Unit в соответствии с индивидуальным заданием. 35 Задания По указанию преподавателя выберите вариант задачи из за- даний, приведенных в работе 3. Предусмотрите возможность выбора функции, для которой будет рассчитываться таблица. Функции поместите в отдельный модуль. Вызывать выбран- ную функцию должна процедура, использующая в качестве входного параметра имя соответствующей функции. ЛАБОРАТОРНАЯ РАБОТА 8 Разработка приложения с выдачей результатов вычислений в виде графиков Цель: изучить возможности построения графиков с помощью компонента отображения графической информации TChart. На- писать и отладить программу построения на экране графика заданной функции. Краткие сведения Построение графика с помощью компонента TChart Обычно результаты расчетов представляются в виде гра- фиков и диаграмм. Система Delphi имеет мощный пакет стан- дартных программ вывода на экран и редактирования графи- ческой информации, который реализуется с помощью визу- ально отображаемого на форме компонента TChart. Компонент TChart осуществляет всю работу по отображе- нию графиков, переданных в объект Series: строит и размечает оси, рисует координатную сетку, подписывает название осей и самого графика, отображает результаты вычислений в виде всевозможных графиков или диаграмм. Построение графика (диаграммы) производится с помощью метода Add объекта 36 Series. При необходимости, с помощью встроенного редактора EditingChart в компоненту TChart передаются данные о толщи- не, стиле и цвете линий, параметрах шрифта подписей, шагах разметки координатной сетки и другие настройки. В процессе работы программы изменение параметров возможно через об- ращение к соответствующим свойствам компонента TChart. Компонент TChart вводится в форму путем нажатия пикто- граммы Ф , расположенной на закладке Additional палитры компонентов. Для изменения параметров компонента TChart необходимо дважды щелкнуть по нему мышью в окне формы. Появится окно редактирования EditingChart (рис. 2). Для создания нового объ- екта Series 1 нужно щелкнуть по кнопке Add на закладке Series. Рис. 2. Задание параметров компонента TChart Для изменения надписи над графиком используется заклад- ка Titles, а для разметки осей - закладка Axis. 37 Постановка задачи Разработать приложение отображения результатов вычис- лений в виде графика. Задания Построить графики функций для соответствующих вариан- тов из работы 1. Таблицу данных получить путем изменения параметра X с шагом h. Ввод исходных данных организовать через окна TEdit. Самостоятельно выбрать удобные парамет- ры настройки. ЛАБОРАТОРНАЯ РАБОТА 9 Разработка приложения, состоящего из нескольких форм Цель', изучить основные свойства и методы, связанные с созданием и активизацией форм. Краткие сведения Сложное приложение может состоять более чем из одной форы. Для добавления в проект новой формы необходимо вы- полнить команду New Form. В дальнейшем показать нужную форму можно с помощью методов ShowModal - модальный режим, либо Show - немодальный режим. Оба этих режима отличаются тем, что в модальном режиме невозможно одно- временно выполнять действия более чем на одной форме. На- против, в немодальном режиме имеется возможность свобод- но переходить с формы на форму без закрытия остальных. Задание и представление информации может быть разнесе- но по отдельным формам. Для реализации визуальных способов изменения данных в программе используются различные компоненты. Одним из час- то используемых компонентов, является компонент TScrollBar. 38 Компонент TScrollBar Это управляющий элемент, расположенный на стандартной закладке палитры компонент с пиктограммой ^ ^ , похожий на полосу скроллинга окна и используемый для изменения чи- словой величины визуальным изменением положения бегунка компонента. Свойствами этого компонента являются: • Kind = (sbHorisontal, sbVertical) - для задания располо- жения TScrollBar; • Min, Max : Integer - для установки минимального и мак- симального значений изменяемой величины; • Position : Integer - в этом свойстве находится текущее значение числа; • LargeChange : TScrollBarlnc, SmallChange :TScrollBarInc - с помощью этих свойств соответственно можно устанавливать малый и большой сдвиг бегунка. При изменении положения бегунка возникает событие OnScroll. Чтобы программным образом устанавливать поло- жение бегунка в заданное место используется метод SetParams (Aposition, Amin, Amax : integer). Смешивание цветов Для получения составного цвета можно использовать сме- шивание трех составляющих цветов при вызове функции RGB (red, green, blue), например, Color:= RGB(255, 0, 0); //ярко-красный цвет. Постановка задачи Разработать приложение, состоящее из нескольких форм и поддерживающее визуальное изменение данных. Задание Взять за основу задание к лабораторной работе 7. Добавить к проекту дополнительную форму, на которой реализовать 39 смешивание цветов. При этом должен быть организован диа- лог приложения, как показано на рис. 3. Выбранный цвет не- обходимо применить к одному из компонентов главной формы. I | Управление краснымЗссоЦВц I | Управление зеленым ScrollBaf I I Упрагллкие синим ЗсюВБах Panel ® Птель отдельных цветов видима О Radio Gtoup АН Ranel Panel R В -Is 1. В и В т Т Ffanel R G в Рис. 3. Форма приложения ЛАБОРАТОРНАЯ РАБОТА 10 Разработка приложения с сохранением параметров и установок в Ini-файлах Цель', изучить возможности автоматического сохранения параметров и установок, принятых в программе. Краткие сведения Удобным средством запоминания текущих настроек прило- жения являются ini-файлы. Ini-файлы - это текстовые файлы, предназначенные для хранения информации о формах или о настройках различных приложений. Информация в файле ло- гически группируется в разделы, каждый из которых начинает- ся оператором заголовка, заключенным в квадратные скобки, 40 например, [Desktop]. В строках, следующих за заголовком, со- держится информация, относящаяся к данному разделу, в виде: <ключ>=<значение>. Любое приложение можно зарегистрировать в системном реестре и зафиксировать там же текущие настройки приложе- ния (в 32-разрядных Windows и выше). Для 32-разрядных при- ложений Microsoft не рекомендует работать с Ini-файлами. Несмотря на это и 32-разрядные приложения, наряду с реест- ром, часто используют эти файлы. Да и разработки Microsoft не обходятся без этих файлов. Ini-файлы, как правило, хранятся в каталоге Windows, кото- рый можно найти с помощью функции GetWindowsDirectory. В Delphi работу с Ini-файлами проще всего осуществлять с помощью создания в приложении объекта типа TIniFile. Этот тип описан в модуле IniFiles, который надо подключать к при- ложению оператором uses (автоматически это не делается). Создается объект типа TIniFile методом Create (<имя фай- ла>), в который передается имя Ini-файла, с которым он свя- зывается. Для записи значений ключей существует несколько мето- дов: WriteString, Writelnteger, WriteFloat, WriteBool и др. Каж- дый из них записывает значение соответствующего типа. Объ- явления всех этих методов очень похожи. Например: procedure WriteString (const Section, Ident, Value: string); procedure WriteInteger(const Section, Ident: string; Value: Longint); где Section - раздел Ini-файла, Ident - имя ключа, Value - зна- чение ключа. Если соответствующий раздел или ключ отсут- ствует в файле, он автоматически создается. Имеются аналогичные методы чтения значений ключей: ReadString, Readlnteger, ReadFloat, ReadBool и др. Например: function ReadString(const Section, Ident, Default: string): string; function ReadInteger(const Section, Ident: string; Default: Longint) : Longint; 41 В этих примерах методы чтения возвращают значение клю- ча Ident и раздела Section. Параметр Default определяет значе- ние, возвращаемое в случае, если в файле не указано значение соответствующего ключа. Проверить наличие значения ключа можно методом Value- Exists, в который передаются имена раздела и ключа. Метод DeleteKey удаляет из файла значение указанного ключа в ука- занном разделе. Проверить наличие в файле необходимого раздела можно ме- тодом SectionExists. Метод EraseSection удаляет из файла указан- ный раздел вместе со всеми его ключами. Имеется еще ряд ме- тодов, которые можно посмотреть во встроенной справке Delphi. Постановка задачи Разработать приложение, поддерживающее чтение и сохра- нение настроек в Ini-файлах. Задание Реализовать чтение и сохранение параметров при запуске и завершении программы. В качестве задания использовать ла- бораторную работу 5. ЛАБОРАТОРНАЯ РАБОТА 11 Разработка приложения, поддерживающего создание графических изображений Цель: изучить основные графические компоненты, их свой- ства и методы. Краткие сведения Любая Windows-программа осуществляет вывод информа- ции на экран с помощью GDI (Graphic Device Interface). Функ- 42 ции, реализованные в GDI, являются аппаратно независимы- ми. Эти функции взаимодействуют с конкретным устройством не напрямую, а через специальную программу, которая назы- вается драйвером устройства. Для любых устройств (мони- торов, принтеров, плоттеров и т.д.) используется соответст- вующий драйвер. Функции GDI взаимодействуют с драйвером устройства через специальную структуру, называемую контекстом уст- ройства (Device Context). В качестве контекста в Delphi вы- ступает объект Canvas. В Delphi имеется несколько независимых классов, которые определяют средства создания изображений. К ним можно от- нести TCanvas - холст, ТРеп - перо, TBrush - кисть, TFont - шрифт. Данные классы Delphi иногда называют классами-над- стройками, т.к. связанные с ними объекты самостоятельно в программе не используются, а выступают как свойства того или иного элемента управления (Form, Edit, ...). Рассмотрим основные свойства этих классов. Класс ТРеп С помощью этого класса производится рисование линий и контуров различных геометрических фигур. Перо характери- зуется цветом, стилем и толщиной. Основные свойства класса: Color: TColor - для задания конкретного цвета. Цвет в Windows задается в формате RGB, т.е. тройкой чисел, опреде- ляющих степени интенсивности трех его цветовых состав- ляющих - красной, зеленой и синей. Для задания конкретного цвета используется тип TColor, описанный в Unit Graphics как: Type TColor = -$7FFFFFFF..$7FFFFFFF, т.е. для задания конкретного цвета выделяется целое число в 4 байта. Самый крайний байт определяет интенсивность крас- 43 ной составляющей. В шеснадцатиричной системе счисления соответствующие составляющие изменяются в диапазонах: $00 00 00 00 - $00 00 00 FF - красная составляющая, $00 00 00 00 - $00 00 FF 00 - зеленая составляющая, $00 00 00 00 - $00 FF 00 00 - синяя составляющая. Левый байт задает палитру. Для наиболее часто используемых цветов определены со- ответствующие константы. Они разбиваются на 2 группы: 1. Цвета, безотносительно к какому элементу они применя- ются, например: clBlack.. clWhite, clNone. 2. Цвета, предназначенные для окрашивания каких-либо де- талей изображения: полос скроллинга, фона рабочего окна Windows, фона меню и т.д. Это такие цвета как: clWindows, clMenu и т.д. Цвета второй группы могут меняться в зависимости от на- строек Windows. Замечание. Получить составной цвет, можно также смешав три составляющие при вызове функции RGB: Color:= RGB(255, 0, 0); //ярко-красный цвет. Если требуется выделить из смешанного цвета одну из его со- ставляющих, то это можно сделать функциями GetRValue, GetG- Value, GetBValue, например: RedValue:= GetRValue(Color). Style : TPenStyle - задает тип линии путем использования констант: psSolid, psDash, psDot, psDashDot, psDashDotDot, psClean; Width: Integer - задает толщину линий. 44 Класс TBrush С помощью этого класса задаются характеристики кисти. Основные свойства, определенные в классе: Color: TColor - задает цвет кисти. По умолчанию clWhite. Style: TBrushStyle - определяет стиль кисти. Для задания стиля используются константы: bsSolid YSSSSJ bsClear bsBDiagonal bsFDiagonal bsCross ffi™ bsDiagCross m m bsHorizontal bsVertical llllllllllll Класс TFont С помощью этого класса задаются характеристики текста с помощью свойств: Color: TColor - задает цвет шрифта. По умолчанию clBlack. Name: TFontName - задает название шрифта, например: 'Arial'. Size: Integer - задает размер букв. Style: TFontStyle - задает стиль букв. Для задания стиля исполь- зуются константы: [fsBold], [fsltalic] [fsUnderline], [fsStrikeOut]. Способы отображения графики Delphi предоставляет программисту 4 способа отображения графики: • использование заранее созданных графических изобра- жений; • создание изображений с помощью графических компо- нентов; 45 • создание изображений с помощью примитивов (линия, круг и т.д.) непосредственно во время работы программы; • представление информации в виде графиков. 1-й способ. Компонент TImage Если графическое изображение уже создано, например, с помощью графического редактора (например, Paint), то его можно показать с помощью компонента TImage. В Delphi с помощью этого компонента можно отобразить следующие графические изображения: 1) растровое (*.bmp), 2) пиктограммы (*.ico), 3) типа метафайла (*.wmf), 4) курсора (*.cur). Вместе с тем известны и другие способы хранения изобра- жений (*.рсх, *.gif, *.tiff, *.jpeg, *.dwg). Для того, чтобы вклю- чить изображения других форматов их нужно перевести в формат *.bmp. Основные свойства компонента TImage: Canvas - содержит канву для прорисовки изображения; Center - указывает, надо ли центрировать изображение в гра- ницах компонента. Игнорируется, если: AutoSize := True; или Stretch := True; и изображение не является пиктограммой (.ico); Increment - разрешает/запрещает показ большого изображе- ния по мере его загрузки; Picture - центральное свойство класса. Служит контейнером изображения TPicture; Proportional - разрешает/запрещает пропорционально умень- шать высоту и ширину изображения, если оно не может цели- ком уместиться в рабочей зоне компонента; Stretch - разрешает/запрещает изменять размер изображения так, чтобы оно целиком заполнило клиентскую область ком- понента; Transparent - запрещает/разрешает накладывать собственный фон изображения на фон компонента. 46 Компонент TImage позволяет поместить графическое изобра- жение в любое место на форме. Собственно картинку можно загрузить во время дизайна в редакторе свойств Picture. При проектировании следует помнить, что изображение, помещен- ное на форму во время дизайна, включается в файл .DPR и за- тем прикомпилируется к ЕХЕ-файлу. Поэтому такой ЕХЕ- файл может получиться достаточно большой. Исходная кар- тинка должна храниться в файле в формате BMP (bitmap), WMF (Windows Meta File) или ICO {icon). Как альтернативу можно рассмотреть загрузку картинки во время выполнения программы, для этого у свойства Picture (которое является объектом со своим набором свойств и методов) есть специ- альный метод LoadFromFile. Пример. По нажатию кнопки необходимо загрузить в ком- понент TImage изображение. Обработчик нажатия кнопки Button 1 Click выглядит следую- щим образом: procedure TForml.ButtonlClick(Sender: TObject); begin if OpenPictureDialogl .Execute then begin Image 1 .Picture.LoadFromFile(OpenPictureDialogl .FileName); Image 1. Stretch := True; end; end; Если изображение, находящееся в TImage, нужно сохра- нить в файле, можно применить метод SaveToFile, который также принадлежит свойству Picture. 2-й способ. Компоненты TShape, TBevel С помощью этого способа имеется возможность рисовать простейшие геометрические фигуры (прямоугольник, квадрат, скругленный прямоугольник, скругленный квадрат, эллипс, окружность). Фигура полностью занимает пространство ком- 47 понента. Если задан квадрат или круг, а размеры элемента по горизонтали и вертикали отличаются, фигура чертится с раз- мером меньшего измерения. Для создания таких фигур исполь- зуется компонент TShape, расположенный на закладке Additional под пиктограммой . Могут быть использованы следующие свойства компонента: Shape : TShapeType = (stRectangle, stSquare, stRoundRect, stRoundSquare, stEUipse, stCircle) - тип геометрической фигуры, где stRectangle - прямоугольник, stSquare - квадрат, stRoundRect - скругленный прямоугольник, stRoundSquare - скругленный квадрат, stEUipse - эллипс, stCircle - окружность. Выбранная фигура рисуется на весь экран компонента TShape. Изменение свойства Shape приводит к немедленной перери- совке изображения. Brush : TBrush - используется для заливки области; Реп : ТРеп - используются для изменения параметров рамки. Пример: Procedure TForml .FormCreate(); begin with Shape 1 do begin Shape := stRectangle; //Фигура - прямоугольник Brush.Color ~ clRed; //Красный цвет заливки Pen.Color := Blue; //Синий цвет рамки Brush.Style : - bsHorizontal; //Дискретная заливка в виде горизон- тальных линий Pen.Style := psSolid; //Сплошной тип линии рамки Pen.Width := 2; //Толщина линии рамки end; end; 48 Bitmap : TBitmap - позволяет в качестве закраски или за- ливки использовать растровое изображение, например: Shapel.Brush.Bitmap := Imagel.Picture.Bitmap;. Компонент TBevel Q§§| используется для выделения группы элементов или отделения их друг от друга. Компонент TBevel служит для украшения программ и может принимать вид рам- ки или линии. Объект предоставляет меньше возможностей по сравнению с TPanel, но не занимает ресурсов. Изменения внешнего вида компонента осуществляется с по- мощью свойств: Shape : TBevelShape = (bsBox, bsFrame, bsTopLine, bsBottom- Line, bsLeftLine, bsRightLine) - геометрия компонента; Style :TBevelStyle = (bsLowered, bsRaised) - вид (вдавленный, выпуклый) компонента. 3-й способ. Поддержка графических операций низкого уровня Для создания графических изображений в области некото- рых компонентов (TForni, TImage, TPaintBox, TPrinter, TListBox, TComboBox, TDrawGrid) используется свойство Canvas. С каж- дым из перечисленных компонентов связано событие OnPaint. Это событие возникает, когда ядру Windows необходимо пере- рисовать содержимое компонента (например, при активизации формы, когда один из перечисленных компонентов становится видимым). Чтобы отрисовать графическое изображение внутри рабочей области перечисленных компонентов нужно обработать событие OnPaint, т.е. записать соответствующий обработчик. Можно воспроизвести на соответствующих компонентах любые графические объекты без использования компонентов TImage, TShape, TLabel. Класс TCanvas Класс TCanvas имеет свойства: Pen: ТРеп - устанавливает цвет, толщину, стиль линий и гра- ниц геометрических фигур, например: 49 with Canvas do begin Pen.Color := clBlue; Pen. Width 2; Pen.Style := psDash; end; Brush: TBrush - позволяет устанавливать цвет и шаблон кисти; Font: TFont - позволяет устанавливать параметры текста; PenPos: TPoint - вьвдает текущую позицию пера; Pixels : TColor - двухмерный массив, содержащий цвета пик- селей, например: Procedure TForml .Buttonl Click(); Var i, j : Longlnt; begin Buttonl .Visible := false; with Canvas do begin for i:=l to Width do for j:=l to Height do Pixels[ij] := i*j; Buttonl .Visible := true; end; end; Большое количество методов класса TCanvas позволяют отображать различные геометрические фигуры с помощью свойства Реп. Если фигура замкнута, то ее поверхность закра- шивается Brush. Все тексты изображаются шрифтом Font. В процессе работы программы эти характеристики можно изменять. Так: Arc(xl, yl, х2, у2, хЗ, уЗ, х4, у4) - рисует дугу: 50 xl хЗ x2 Chord(xl, yl, x2, y2, хЗ, уЗ, x4, y4) - рисует сегмент из дуги эллипса и хорды: xl хЗ х2 EIIipse(xl, yl, х2, у2) - рисует эллипс; FillRect(Rect) - закрашивание прямоугольника; MoveTo (х, у) - перемещает перо в точку с координатами х, у; LineTo(x, у) - рисует линию из текущего положения пера в точку с координатами х и у; Pie(xl, yl , х2, у2, хЗ, уЗ, х4, у4) - рисует сектор эллипса; Poligon(Point: array of TPoint) - вычерчивание заданного мно- гоугольника. Пример: var Р: array[1..3] of TPoint; begin Р[1].х := 10; Р[1].у ~ 300; Р[2].х := 200; Р[2].у:=300; Р[3].х := 100; Р[3].у := 20; Canvas.Poligon(P); end; Poliline(Point: array of TPoint) - рисует ломаную; RoundRect(xl, yl, x2, y2, хЗ, уЗ) - вычерчивание и заполне- ние прямоугольника со скругленными углами 51 X хЗ х2 TextOut(x, у, S: String) - осуществляет вывод строки; TextRec выводит текст только внутри указанного прямоуголь- ника. Длину и высоту текста можно узнать с помощью функ- ций TextWidth и TextHeight; Draw(x, у, Graphic: TGraphic) - прорисовка графического объек- та Graphic так, чтобы левый верхний угол располагался в (х, у). Объект Graphic может быть типа Bitmap, Icon и Metafile; StretchPraw(Rect: TRect; Graphic: TGraphic) - вычерчивание и масштабирование объекта Graphic до полного заполнения Rect. Пример. На форме имеется Image 1. С помощью свойства Picture в нее помещена картинка. Требуется переместить эту картинку в другое положение. Procedure TFormI.FormPaint(); begin with Canvas do begin Draw (0, 0, Imagel.Picture.Bitmap); StretchDraw (Rect(250,0,3 50,50), Imagel.Picture.Bitmap); end; end; Как правило, все графические операции осуществляются не на форме, а посредством специальных графических компонен- тов, например компонента Image, который позволяет размес- тить на экране растровое изображение, пиктограмму, метафайл, либо собственное изображение. Для более простых графических операций используется ком- понент TPaintBox. 52 Постановка задачи Разработать приложение, поддерживающее основные функ- ции простейшего графического редактора. Задание Разработать приложение, содержащее три формы - три спо- соба представления графической информации. На 1-й форме продемонстрировать отображение графиче- ских картинок, созданных в других графических редакторах. На 2-й форме с помощью кнопочного меню рисовать различ- ные графические фигуры посредством компонента класса TShape. На 3-й форме реализовать рисование простейшими прими- тивами, типа линия, прямоугольник, эллипс и т.д. ЛАБОРАТОРНАЯ РАБОТА 12 Разработка приложения, управляемого с помощью панели инструментов Целы научиться подключать инструментальную панель, изу- чить основные свойства и типы кнопок и использование их для управления вычислительным процессом. Краткие сведения Для создания панели инструментов используется компо- нент TToolBar - инструментальная панель, пиктограмма кото- рой имеет вид Щ . Компонент TToolBar - это специальный контейнер для соз- дания инструментальных панелей. В компонент TToolBar мож- но поместить любые другие компоненты. Как правило, он ис- пользуется для расположения кнопок, с помощью которых мож- 53 но оперативно выполнить нужную команду. Кнопки можно группировать и располагать в несколько рядов. Главная отличительная черта ТТооЮаг - его способность гибкого управления дочерними элементами, которые он может группировать, выравнивать по размерам, располагать в несколь- ко рядов. Компонент может манипулировать любыми вставлен- ными в него дочерними элементами, но все его возможности в полной мере проявляются только при использовании специально для него разработанного компонента TToolButton (инструмен- тальная кнопка). Этот компонент похож на кнопку TSpeedButton, но в палитре компонентов его нет. Для того чтобы вставить TToolButton в инструментальную панель ТТооЮаг, необходимо правой кнопкой щелкнуть на ком- поненте ТТооЮаг и в открывшемся окне выбрать NewButton или NewSeparator (новый сепаратор). Сепараторы предназна- чены для функционального выделения на инструментальной панели групп элементов и представляют собой разновидности кнопок TToolButton. Хотя компонент TToolButton не имеет свойства, предна- значенного для хранения картинки, однако он умеет исполь- зовать контейнер TImageList, чтобы извлечь из него нужную картинку и поместить ее на инструментальную кнопку. Постановка задачи Разработать приложение, вычислительный процесс которо- го управляется компонентами, расположенными в инструмен- тальной панели. Задание Разработать приложение, в котором предусмотреть управ- ление вычислительным процессом с помощью кнопок, распо- ложенных на инструментальной панели. Задание использовать из лабораторной работы 8. 54 ЛАБОРАТОРНАЯ РАБОТА 13 Разработка приложения, представленного в виде многостраничного документа Цель: изучить компоненты TPageControl, TTabSheet. Краткие сведения Для создания многостраничных документов используются компоненты TTabControl и TPageControl. Компонент TTabControl (на странице Win32) пред- ставляет собой контейнер с закладками. Свойство Tabs опре- деляет названия и количество закладок. Событие OnChange возникает при выборе новой закладки и позволяет управлять содержимым окна компонента. Компонент TPageControl (на закладке Win32) пред- ставляет собой контейнер с закладками, на каждой из которых содержатся панели класса TTabSheet. На каждой панели клас- са TTabSheet может содержаться свой набор помещенных на нее компонентов. Для того чтобы добавить новую панель и закладку, нужно щелкнуть правой кнопкой по компоненту PageControl и из ло- кального меню выбрать команду NewPage. Свойства: ActivePage: TTabSheet - содержит активную панель. С по- мощью этого свойства можно установить активной нужную панель. События: OnChange - возникает при переключении панелей. Постановка задачи Разработать приложение в виде многостраничного доку- мента. 55 Задание Разработать приложение, поддерживающее ввод данных, вы- бор метода расчета, расчет и представление результатов в таб- личной и графической формах на примере лабораторной рабо- ты 8, реализуя отдельные вычислительные шаги на различных закладках многостраничного документа. ЛАБОРАТОРНАЯ РАБОТА 14 Разработка комплексного приложения Целы показать умение создания современного приложения в визуальной среде. Краткие сведения При разработке приложения для данной лабораторной ра- боты следует руководствоваться теоретическими сведениями всех предыдущих работ. Постановка задачи Разработать современное приложение, содержащее расши- ренный список компонентов управления программой и пред- ставления данных в различных видах. Задание Разработать приложение, поддерживающее различные спосо- бы управления вычислительным процессом с помощью TPage- Control, TTabSheet, TChart, стандартных диалоговых компо- нентов, TPopupMenu, TMainMenu, ТТооЮаг и других на при- мере лабораторной работы 8. 56 ЛИТЕРАТУРА 1. Фаронов, В.В. Delphi 6: учебный курс / В.В. Фаронов. - М-: Изд-во Молгачева С.В., 2001. - 672 с. 2. Тейксейра, Стив. Delphi 6. Руководство разработчика: пер. с англ.: учебное посообие: в 2 т. / Стив Тейксейра, Ксавье Пачеко. - Т. 1: Основные методы и технологии. - М.: Виль- яме, 2001.-832 с. 3. Архангельский, А.Я. Разработка прикладных программ для Windows в Delphi / А.Я. Архангельский. - М.: Бином, 1999.-256 с. 4. Подольский, С.В. Разработка интернет-приложений в Delphi 6 / С.В. Подольский, С.А. Скиба, О.А. Кожедуб. - СПб.: БХВ-Петербург, 2002. - 452 с. 5. Сван, Том. Delphi 4. Библия разработчика: пер. с англ. / Том Сван. - СПб.: Диалектика, 1998. - 672 с. 6. Бобровский, С. Delphi 5: учебный курс / С. Бобровский. - СПб.: Питер, 2000. - 640 с. 7. Фаронов, В.В. Delphi 2005. Язык, среда, разработка при- ложений / В.В. Фаронов. - СПб.: Питер, 2005. - 560 с. 8. Сухарев, М.В. Основы Delphi. Профессиональный под- ход / М.В. Сухарев. - СПб.: Наука и техника, 2004. - 600 с. 9. Марко, Кэнту. Delphi 5 для профессионалов / Кэнту Марко. - СПб.: Питер, 2001. - 944 с. 57 ПРИЛОЖЕНИЕ Образец титульного листа МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Факультет информационных технологий и робототехники (ФИТР) Кафедра программного обеспечения вычислительной техники и автоматизированных систем О Т Ч Е Т О ЛАБОРАТОРНОЙ РАБОТЕ 14 «Разработка комплексного приложения в Delphi» по дисциплине: «РАЗРАБОТКА ПРИЛОЖЕНИЙ В ВИЗУАЛЬНЫХ СРЕДАХ» Выполнили: Проверил: студенты: Петров И.И., Геращенко С.И. гр. 107219 доцент Гурский Н.Н. Минск - 2 0 1 0 Учебное издание РАЗРАБОТКА ПРИЛОЖЕНИЙ В ВИЗУАЛЬНЫХ СРЕДАХ Лабораторный практикум для студентов специальностей 1-40 01 01 «Программное обеспечение информационных технологий», 1-40 01 02 «Информационные системы и технологии» В 2 частях Часть 1 Составитель ГУРСКИЙ Николай Николаевич Редактор Е.О. Коржуева Компьютерная верстка Н.А. Школьниковой Подписано в печать 22.10.2010. Формат 60x84Vi6. Бумага офсетная. Отпечатано на ризографе. Гарнитура Тайме. Усл. печ. л. 3,43. Уч.-изд. л. 2,68. Тираж 100. Заказ 822. Издатель и полиграфическое исполнение: Белорусский национальный технический университет. ЛИ № 02330/0494349 от 16.03.2009. Проспект Независимости, 65. 220013, Минск.