Главная Учебники - Разные Лекции (разные) - часть 11
Балашовский институт (филиал) ГОУ ВПО «Саратовский государственный университет им. Н. Г. Чернышевского» О. А. Кузнецов Основы программирования Учебно-методическое пособие
для студентов физико-математических специальностей вузов
Балашов 2009 УДК 004.43
ББК 32.97
К89
Рецензенты:
Доктор физико-математических наук, профессор А. Ф. Тараканов;
Кандидат педагогических наук, заместитель директора заведующий кафедрой информационных технологий
И. А. Седов;
Кандидат физико-математических наук, старший преподаватель кафедры им. Н. Г. Чернышевского»
А. А. Бубнов.
Рекомендовано к изданию Научно-методическим советом Балашовского Кузнецов, О. А.
К89 Основы программирования в среде Delphi
: учеб.-методич. пособие для студентов физ.-мат. специальностей вузов / О. А. Кузнецов. — Балашов : Николаев, 2009. — 104 с. ISBN 978-5-94035-378-2 В учебно-методическом пособии излагаются основы работы с языком программирования Delphi
. Рассматриваются возможности использования различных компонентов при решении практических задач. Издание может быть рекомендовано студентам, специализирующимся в области информатики, и всем, кто интересуется современными способами и методами программирования в операционной среде Windows
. УДК 004.43
ББК 32.97
ISBN
978-5-94035-378-2
© Кузнецов О. А., 2009 Предисловие..................................................................................................... 4 Введение........................................................................................................... 6 Лабораторная работа 1. Интегрированная среда разработки........................................................................................................ 7 Лабораторная работа 2. Перенесение программы из Pascal
в Delphi
........................................................................................... 17 Лабораторная работа 3. Компоненты ввода и вывода данных................... 23 Лабораторная работа 4. Компоненты-переключатели................................. 32 Лабораторная работа 5. Компоненты-таблицы............................................ 41 Лабораторная работа 6. Окна сообщений и диалоговые окна.................... 45 Лабораторная работа 7. Графические компоненты..................................... 54 Лабораторная работа 8. Компоненты-меню и элементы интерфейса.................................................................................. 66 Лабораторная работа 9. Отображение мультимедийной информации.................................................................................................... 73 Лабораторная работа 10. Исключительные ситуации................................. 84 Лабораторная работа 11. Классы.................................................................. 88 Лабораторная работа 12. Потоки.................................................................. 95 Заключение................................................................................................... 101 Список рекомендуемой литературы........................................................... 102 В государственных образовательных стандартах многих специальностей физико-математического профиля имеется пункт «Языки программирования высокого уровня». Даже если этот пункт отдельно не присутствует в других дисциплинах, предусмотрено изучение объектно-ориентирован-ного или визуального программирования. При этом отдельно не оговаривается, какой именно язык программирования необходимо изучать, из того достаточно большого и разнообразного набора языков, которые популярны в современном мире. Все языки высокого уровня создавались на базе семантики некоторых алгоритмических языков, например, язык программирования Visual
Basic
имеет семантику и основные способы записи алгоритмических структур языка программирования Basic
, Visual
Builder
имеет в своей основе язык C
++, а язык Delphi
имеет семантику языка Pascal
. Выбор изучаемого языка высокого уровня зависит от изученного ранее алгоритмического языка. Поскольку язык программирования Pascal
был изначально создан Николаусом Виртом для обучения студентов алгоритмическим языкам, язык программирования Delphi
является оптимальным языком для получения основных навыков работы с высокоуровневыми языками. Хотя он может показаться достаточно тяжелым при изучении, по сравнению с языком Visual
Basic
, который допускает «многие вольности» при написании программы, Delphi
имеет более жесткую структуру и семантику, усвоение которой и должно формировать основные представления о программировании на языке высокого уровня. Необходимо отметить, что большинство задач решаются на алгоритмическом языке программирования. Именно на изучении основных алгоритмов и необходимо сосредоточить внимание всем, кто имеет желание изучить программирование. Объектно-ориентированное, в частности, язык Delphi
, позволяет упростить написание программ в среде Windows
. Однако основой составляющей любой программы всегда является алгоритм. Теперь несколько слов о структуре данной книге и основные рекомендации по ее чтению. Данное учебно-методическое пособие состоит из лабораторных работ, которые условно можно разбить на несколько частей. В первой части (лабораторные работы 1, 2) содержатся некоторые начальные сведения. Первая работа посвящена описанию внешнего вида среды программирования, ее основным элементам и способам создания внешнего интерфейса приложения. Во второй лабораторной работе излагаются основы программирования в Windows
, демонстрируется примером перевод программы с языка программирования Pascal
в среду Delphi
(предполагается, что читатель знаком с основами языка Pascal
). Во второй части (лабораторные работы 3—9) изучается возможность работы с визуальными компонентами, систематизированными по видам выполняемой работы. При этом основной упор делается не на перечисление всех свойств и методов, а на приведение конечных примеров использования данных элементов. Третья часть (лабораторные работы 10—12) содержит дополнительные работы, в которых описывается возможность использования более специфических компонентов. Любую книгу по программированию (и также данную) рекомендуется изучать в два этапа. На первом этапе происходит чтение и осмысление некоторой части или всей лабораторной работы. На втором этапе необходимо самостоятельно создать и запустить приложение. И, наконец, автор настойчиво рекомендует выполнять все задания для самостоятельной работы. Именно решение задач самостоятельно позволяет изучить язык В настоящее время имеется огромное количество разнообразной литературы по данному языку программирования. Она отличается как стилем изложения, так и рассматриваемыми темами. В списке литературы приведен только небольшой их перечень. Любая из этих книг может быть полезна либо для ознакомления, либо на последующих этапах для более глубокого, профессионального изучения. Кроме этого существует и большое количество электронных ресурсов, на которых можно найти и скачать подобную литературу, например www.progbook.net/delphi/. В данном курсе лабораторных работ будет изучаться язык программирования Delphi
. Не стóит подробно останавливаться на версии (хотя будем ориентироваться на свободно распространяемое программное обеспечение, а именно на систему Turbo
Delphi
), поскольку в момент выхода книги может появиться новая версия языка, имеющая большие возможности и более специфические компоненты. Изучим основы визуального программирования на основе компонент, которые появились еще в первых версиях языка. При переходе в программирование из операционной среды Dos
в операционную среду Windows
необходимо знать некоторые различия. Например, в среде Dos
: 1) программный код состоит из операторов, которые выполняются один за другим; 2) в работающей программе постоянно что-то выполняется; 3) одновременно может выполняться только одна программа; 4) существует прямая связь между программой и компьютером, то есть управление осуществляется непосредственно вашей программой. В операционной среде Windows
при написании программы необходимо знать следующее: 1) написанный код должен состоять из процедур обработки событий, которые Windows
посылает программе; 2) одновременно может выполняться несколько программ; 3) работающая программа находится в рабочей области памяти Среда Delphi
, как и всякая современная среда разработки приложений, позволяет создавать программы, отвечающие этим требованиям. Описанию объектно-ориентированного программирования может быть посвящена не одна такая же книга, поэтому отметим только наиболее принципиальное отличие. Преимущество объектно-ориентированных методов программирования заключается в том, что используются предварительно созданные объекты — элементы управления Windows
, которые потом могут быть использованы в качестве предков для новых компонентов. Концепция объектно-ориентированного программирования предполагает использование нового типа данных — классов. Класс — это определенный пользователем тип данных, который обладает внутренними данными и методами в форме процедур и функций и обычно описывает родовые признаки и способы поведения ряда очень похожих объектов. Объект является экземпляром класса. Более подробно классы рассматриваются
Лабораторная работа 1
.
Интегрированная среда разработки
Цель:
изучить среду программирования Turbo
Delphi
. Потребность в эффективных средствах разработки программного обеспечения привели к появлению систем программирования, ориентированных на так называемую «быструю разработку». В основе систем быстрой разработки RAD-систем
(Rapid Application Development — среда быстрой разработки приложений
) лежит технология визуального проектирования и событийного программирования, суть которой заключается Turbo
Delphi
— это среда быстрой разработки от корпорации Borland
, в которой в качестве языка программирования используется одноименный язык программирования Delphi
, ранее известный как Object Pascal
. Версия Turbo
Delphi
, с которой будем работать, называется Turbo
Delphi
Explorer
— это бесплатно распространяемая версия, имеющая некоторые функциональные ограничения. Для запуска Turbo
Delphi
необходимо дважды щелкнуть левой клавишей мыши на соответствующем ярлыке либо, нажав на кнопку Пуск
, выбрать пункт Программы
/Borland
Developer
Studio
2006
/Turbo
Delphi
. После запуска появится главное окно среды разработки, в центре которого по умолчанию будет открыта HTML-страница Welcome
Page
во встроенном интернет-браузере (рис. 1). На ней находятся ссылки на разделы документации и список последних открытых проектов (Recent Projects
). Закройте страницу приветствия и создайте новый проект, выбрав Среда разработки примет вид, представленный на рисунке 3. Данное окно содержит несколько частей, с содержимым которых сейчас и познакомимся. Конструктор форм (3)
Центральную часть окна занимает окно конструктора форм
(Form
designer
) приложения. Формой
(Form
) приложения на этапе разработки принято называть окно программы (во время разработки это форма, на этапе выполнения — окно). В окне конструктора форм вы будете формировать внешний вид своего будущего приложения: изменять само окно, Переключаться между этими окнами можно нажатием клавиши F12 (либо нажатием на специальные вкладки Code
и Design
в нижней части окна). Рисунок
1
Рисунок
2
Рисунок
3
Редактор кода (3)
Попробуйте активизировать окно редактора кода. Содержимое вашего экрана вместе с кодом программы будет выглядеть так, как это изображено на рисунке 4. Необходимо отметить, что большая часть работы при создании проекта в среде Delphi
сводится к работе с конструктором форм или редактором кода, при этом посредством конструктора создается внешнее окно приложения, а в редакторе прописывается код программы. В центральной части окна теперь располагается исходный код
(листинг
) вашей программы. Несмотря на то, что вы сами еще не написали ни единой строчки текста программы, это окно уже содержит код модуля, необходимый для отображения окна приложения. Исходный код содержит заголовок модуля (unit
Unit
1
); интерфейсную часть, начинающуюся со служебного слова interface
и содержащую описание одного типа TForm
1
и одной переменной этого типа Form
1
; реализационную часть, начинающуюся со слова implementation
и содержащую большую часть написанного нами программного кода. При закрытии конструктора форм или редактора кода автоматически закрывается и приложение.
Рисунок
4
Инспектор объектов (2)
Слева от окна конструктора находится окно инспектора объектов
(Object Inspector
). Это окно теперь не пустое. Оно заполнилось информацией о выделенном объекте (в данный момент — формы). Окно Object
Inspector
(рис. 5) имеет две вкладки — Properties
(Свойства
) и Events
(События
). Первая вкладка используется для редактирования свойств объектов. Свойство
(Property
) объекта — это одна из характеристик, определяющая его поведение в программе. Объект способен обладать самыми разными свойствами, которые могут объединяться в группы. Попробуйте, например, изменить свойство Caption
, находящееся в группе Visual
— это свойство отвечает за заголовок формы. Изначально оно равно Form
1
, измените его на любое другое и нажмите клавишу Enter
, сразу увидите, что ваша форма изменилась, теперь она имеет тот заголовок, который вы ввели. Во время выполнения окно вашего приложения будет иметь введенный вами заголовок. Свойство Icon
позволяет ассоциировать приложение с некоторой пиктограммой. Поначалу группировка свойств может вызвать затруднения (свойств довольно много у любого объекта и для запоминания основных из них нужно некоторое время), поэтому такую группировку можно отключить. Для этого необходимо навести указатель мыши на окно Object Inspector
Рисунок
5
Рисунок
6
После этого все свойства, которые имеет объект, будут упорядочены по алфавиту. Если вы хотите вернуть окно к первоначальному виду, то следует проделать аналогичные действия и выбрать пункт Arrange
/by
Category
. Каждый компонент обладает своим собственным набором свойств Остановимся на наиболее общих свойствах компонентов. Например, имя компонента задает свойство Name
, свойства, определяющие размеры и положение компонента на форме: Width
— ширина, Height
— высота, Left
— смещение влево, Top
— смещение компонента вниз (изменять Логическое свойство Visible
определяет, будет ли виден данный Также стоит отметить такое свойство формы, как BorderStyle
, позволяющее задавать внешний вид окна. Если это свойство, например, установить в значение bsDialog
, то при исполнении форма будет содержать на заголовке формы единственную кнопку, которая закрывает приложение. В этом случае при запуске нельзя будет свернуть приложение или изменить его размер. Вторая вкладка окна Object
Inspector
— Events
используется для описания событий
(Events
), на которые будет реагировать выделенный объект (в данный момент им является ваша форма). Именно при выборе необходимого вам события в редакторе кода появится заготовка процедуры обработки, где надо записывать код программы. Менеджер проекта (4)
В окне менеджера проекта
(Project Manager
) отображается структура приложения (проекта, над которым вы сейчас работаете). В этом окне содержится общая информация о проекте, информация об используемых внешних модулях (библиотеках), а также обо всех файлах проекта. Палитра компонентов (5)
Палитра компонентов
(Tool Palette
) — это один из наиболее часто используемых инструментов Delphi
. Она состоит из большого числа групп, где располагаются компоненты. Компонент
(Component
) — это элемент пользовательского интерфейса, который может быть перенесен на форму. Это кнопки, метки, поля для ввода всевозможных данных, выпадающие списки, в общем, все то, что вы обычно видите на окнах в операционной системы Windows
(такие компоненты называют визуальными —
Visual
). Кроме того, это могут быть также и невидимые
(не визуальные
) компоненты, т. е. те, которые Все компоненты объединяются в группы по функциональному назначению. После создания проекта раскрыт список компонентов группы Standard
, содержащий основные элементы диалоговых окон Windows
. Структура проекта (1)
Окно структуры проекта
после создания проекта отображается в левой верхней части экрана. Оно содержит информацию о структуре исходного кода программы (именно поэтому не содержит информации, если активно окно дизайнера формы). Для того чтобы посмотреть данную информацию, следует переключиться в окно редактора кода. После активизации окна редактора кода окно Structure
заполнится информацией (рис. 7).
Рисунок
7
Рассмотрим возможность создания первой программы в среде Delphi
, которая в данном случае называется проектом. Проект
(Project
) — совокупность файлов, используемые средой разработки (точнее говоря, компилятором Turbo
Delphi
) для итоговой генерации программы. Вы уже создали новый проект ранее, выбрав в главном меню пункт File
, New
, VCL
Forms
Application
—
Delphi
for
Win
32
. Turbo Delphi
позволяет создавать программы только для операционной системы Windows
(отсюда сочетание Delphi
for
Win
32
) на основе библиотеки визуальных компонентов Visual
Components
Library
(VCL
). Каждое Windows
-приложение выполняется в собственном окне — главном окне соответствующего приложения. Закрытием этого окна пользователь закрывает приложение. При создании проекта создается одна форма — она и является главным окном приложения. Если в проекте несколько форм, то при необходимости можно сделать главным окном любую другую форму. Размеры формы можно менять произвольным образом и размещать Поместите на форму компонента произвольные компоненты с закладки Standard
. Обратите внимание, содержимое инспектора объектов будет меняться в зависимости от выбранного компонента (рис. 4). Созданное окно может принять вид, представленный на рисунке 8.
Рисунок
8
Если, используя инспектор объектов, добавить процедуру обработки нажатия на кнопку, для чего необходимо выполнить двойной щелчок мышью на требуемом событии (событие onClick
для компонента Button
1
) в инспекторе объектов, то содержимое редактора кода будет иметь вид: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; RadioGroup1: TRadioGroup; Label1: TLabel; CheckBox1: TCheckBox; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin end; end. Из листинга видно, что в рамках формы класса TForm
1
описываются все присутствующие на форме компоненты: Label
11
, Button
1
, CheckBox
1
, RadioGroup
1
, Memo
1
, и заголовок процедуры Button
1
Click
. В реализационной части, после служебного слова implementation, создана заготовка для всей процедуры, в которой и будем вписывать необходимый код. Параметр Sender
передается в любой процедуре обработки события и определяет компонент формы, где произошло событие. Все события, на которые приложение может реагировать, разделяются на пользовательские и системные. К пользовательским относятся события, связанные с клавиатурой или мышью, например OnClick
— одинарный щелчок левой клавишей мыши (именно это событие является наиболее распространенным и именно для его обработки нами была создана процедура в предыдущем примере); OnDblClick
— двойной щелчок левой клавишей мыши; OnMouseDown
— нажатие клавиши мыши; OnMouseUp
— отпускание клавиши мыши; OnMouseMove
— перемещение мыши. В некоторых из этих событий в качестве параметров могут передаваться координаты точки на экране, где произошло событие — X
, Y
, кнопка мыши — параметр Button
, значение которого является одна из констант, соответствующей нажатой левой клавиши — mbLeft
, средней клавиши — mbMiddle
, правой клавиши — mbRight
, а также параметр Shift
, значение которого равно ssAlt
, если нажата клавиша [Alt
], ssCtrl
— если клавиша [Ctrl
], ssShift
— если клавиша [Shift
]. Например, автоматически созданный шаблон процедуры обработки нажатия клавиши мыши на форме имеет вид: procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin end; Кроме пользовательских событий, существуют программно управляемые события. Отдельно рассмотрим события, обрабатываемые самой формой: событие OnCreat
е
происходит в момент создания формы; OnClose
генерируется, когда форма должна быть закрыта. Два данных события происходят с формой всего один раз в отличие от других: OnShow
— возникает, когда форма должна стать видимой, OnHade
— когда форма должна быть убрана с экрана, OnPaint
— перед тем, как форма будет перерисована на экране. Существуют события, которые формируют сами элементы управления, например: OnEnter
событие, которое появляется, когда элемент управления становится активным, и OnExit
событие, возникающее, когда элемент управления перестает быть активным. Данные два события существуют только у элементов управления и только в том случае, если свойство Enabled
имеет значение True
. Остальные события будут рассмотрены по мере описания отдельных компонентов. Запустить проект на исполнение можно либо нажатием кнопки F9, либо через главное меню: Run
/Run
, либо нажатием соответствующей кнопки на панели инструментов: Проект в простейшем случае представляет собой совокупность 1) файл описания проекта (bdsproj-файл
) — файл специального формата, в котором записана общая информация о проекте; 2) главный модуль (dpr-файл
) содержит инструкции, обеспечивающие запуск нашей программы; 3) модуль формы (dfm-файл
) содержит информацию о настройках 4) модуль реализации (pas-файл
) содержит информацию только 5) файл ресурсов (res-файл
); 6) файл конфигурации (cfg-файл
); 7) исполняемый файл (exe
-файл
), который создается при запуске программы на исполнение. Сохранение всех файлов проекта осуществляется через пункт главного меню File
, Save
all
(сохранить все). Первый раз при сохранении потребуется сохранить два файла: модуль формы и файл проекта. Поскольку при работе с проектом автоматически создается довольно много файлов, рекомендуется сохранять их в заранее подготовленном каталоге. Задания:
1. Создайте новый проект, поместите на форму компоненты Label
1
, Edit
1
, Button
1
и заготовки процедур таких событий, как создание формы, двойной щелчок левой клавиши мыши на всей форме, активизация компонента Edit
. 2. Измените значения свойств Width
, Height
, Top
, Left
как с помощью инспектора объектов, так и непосредственно используя мышь. 3. Измените свойства Visible
, Color
, Cursor
, Enabled
и Ctl
3
D
для каждого компонента в отдельности. 4. С помощью свойств ShowHint
и Hint
задайте для каждого элемента управления подсказки. 5. Сохраните данный проект и просмотрите каждый из созданных файлов. 6. Запустите приложение на исполнение.
Лабораторная работа 2
.
Перенесение программы
Цель:
научиться создавать простейшие программы на языке программирования Delphi
. Перед тем, как изучать язык программирования Delphi
, рассмотрим вопрос совместимости и переноса программ. Предположим, что имеется программа на языке программирования Pascal
, которая на основании введенного значения высоты вычисляет время падения тела. Данная программа имеет вид, представленный на рисунке 9.
Рисунок
9
При начальном знакомстве со средой программирования Delphi
и программирования в среде Windows
необходимо учитывать два момента: во-первых, операторы ввода и вывода данных не работают, поэтому от них необходимо избавиться; во-вторых, для того чтобы были начаты расчеты, необходимо какое-либо событие. Самым простым и распространенным событием является нажатие на экранную кнопку. Поэтому поместим на форму, используя редактор формы, два компонента Button
со страницы Standard
. Используя свойство Caption
, можно задать надпись на кнопках, а посредством свойства Font
— шрифт для данной надписи. Напишем на первой кнопки «Вычислить», а на второй — «Закрыть». Теперь создадим два обработчика событий — нажатие клавиши, — для чего в инспекторе объектов на закладке Event
выверим событие OnClick
. В первой процедуре будем выполнять вычисления, а во второй — закрывать форму, используя следующий, заранее определенный метод — Form
1.
Close
. Если правильно записать имя любого компонента, присутствующего на форме, или имя самой формы, то после символа «точка» появится список всех доступных на этапе выполнения свойств и методов. Свойства обозначаются служебным словом property
, методами могут выступать функции и процедуры, и соответственно обозначаются словами procedure
Для ввода начальных данных и вывода конечных результатов могут использоваться различные компоненты. Например, компонент Edit
, со страницы компонент Standard
. Поместим два этих компонента на форму, которая примет вид, представленный на рисунке 11.
Рисунок
10
Рисунок
11
Компонент Edit
имеет свойство Text
типа String
, в нем записывается вводимая или выводимая строка. Данное свойство допустимо как на этапе проектирования (поэтому может быть изменено с помощью инспектора объектов), так и на этапе выполнения, поэтому в программе допустима запись Edit
1
.Text
. Для того чтобы иметь возможность вводить и выводить числовые значения, необходимо преобразовать данную строку в число. Для этой цели существуют несколько функций, например: StrToFloat
(St
:String
): Real
— преобразует строку в значение с плавающей запятой; StrToInt
(St
:String
):Integer
— преобразует строку в целое значение; FloatToStr
(a
:Real
):String
— преобразует значение с плавающей запятой в строку; IntToStr
(a
:Integer
):String
— преобразует строку в целое значение. Кроме этих функций, можно использовать уже известную процедуру, которая применяется в языке программирования Pascal
. Это процедура Val
(St
:String
; Var
a
:Integer
; Var
Kod
:Integer
), переводящая строку в число. Предположим, что в компоненте Edit
1
вводится начальное значение высоты, а затем, после нажатие кнопки «Вычислить», в компоненте Edit
2
выводится полученное значение. Создадим следующую процедуру обработки события и следующий код обработки нажатия на первую кнопку. Тогда программа будет иметь вид: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); Const g=9.81; Var h,t : Real; Begin h:=StrToFloat(edit1.Text); t:=sqrt(2*h/g); edit2.Text:=FloatToStr(t); end; procedure TForm1.Button2Click(Sender: TObject); begin Form1.Close; end; end. В процедуре описываются две дополнительных переменных и одна константа. Первым оператором переводится значение соответствующего свойства в вещественную переменную, затем производятся вычисления по известной формуле, и последним оператором выводится полученное значение (данная запись аналогична оператору вывода Writeln
).
Рисунок
12
При запуске данной программы на исполнение в поле Edit
1
необходимо ввести соответствующее значение высоты, затем нажать клавишу «Выполнить» и в поле Edit
2
будет выведен результат вычислений. Вычисления можно производить для различных значений высоты. Для того чтобы завершить работу программы необходимо нажать клавишу «Закрыть». Компонент Edit
может в определенной мере заменить операторы ввода — вывода, но не является совсем удобным для вывода подсказок и сообщений. Для этой цели может быть использован компонент Label
, позволяющий выводить не редактируемый текст. Разместим два данных компонента на форме и свойству Caption
одной из них дадим значение «Высота падения (м)», а второй — «Время падения (с)», после чего форма примет вид, изображенный на рисунке 12. Компоненты, размещенные на форме с заданными начальными свойствами посредством инспектора объектов, а также текст соответствующего модуля и самого проекта, представляют собой программу на языке программирования Delphi
. Чтобы при запуске программы не отображался в компонентах Edit
текст «Edit
1
», «Edit
2
» сделайте «пустым» значение свойства Text
у данных компонентов. Замечание.
Редактор кода оснащен набором свойств, обеспечивающих выполнение целого ряда вспомогательных функций. Эти средства имеют общее название Code
Insight
— интуитивный помощник написания кода. Посредством функции дополнительного кода
могут быть легко введены имена свойств, методов и обработчика событий объектов. Сначала необходимо ввести имя объекта, поставив в конце точку, и после некоторой паузы на экране отобразится список всех свойств и методов данного объекта (рисунок 11). Кроме этого, если правильно записать имя функции или процедуры и открытую скобку, то появится подсказка относительно аргументов и их типов. Комбинация клавиш <CTRL> + J приведет к появлению окна, в котором перечисляются все возможные структуры. Выбрав любой элемент, появится заготовка с перечислением необходимых для заполнения полей. Аналогичная заготовка появится при записи первого слова из данной конструкции, например, слова if
или for
. Если вам не нравится, что при запуске форма расположена там, где вы ее оставили при разработке, то обратитесь у формы к свойству Position
.
Задания
:
1. Выполните пример, описанный в лабораторной работе. 2. Реализуйте на языке программирования Delphi
задачи из лабораторных работ 1, 2, 3 по языку Pascal
. 3. Напишите программу «Калькулятор».
Лабораторная работа 3
.
Компоненты ввода и вывода данных
Цель:
изучить компоненты ввода и отображение текстовой информации. Рассмотрим более подробно компоненты ввода — вывода данных, для чего условно разделим их на несколько различных блоков: 1) компоненты вывода текстовой информации на экран; 2) однострочные поля ввода текстовой и числовой информации; 3) многострочные поля ввода. Для вывода определенной информации на экран, кроме уже описанного компонента Label
, есть и другие компоненты. Текст, который будет отображен, можно задавать как на этапе разработки формы, так и в процессе выполнения программы, присвоив значение свойству Caption
. Таблица 1. Основные свойства компонента
Label
Свойство
Описание
Name
Имя компонента, используемое в программе для доступа Caption
Текст, отображаемый в поле компонента Font
Шрифт, который используется для отображения текста Color
Цвет компонента Left
Расстояние от левой границы формы до левой границы компонента Тор
Расстояние от верхней границы формы до верхней границы компонента Width
Ширина поля компонента Height
Высота поля компонента AutoSize
Свойство, определяющее, будет ли размер компонента зависеть от текста в его поле. В случае AutoSize
= True
, размер компонента будет ограничен текстом в поле компонента. В противном случае размер компонента определяется значениями свойств Width
и Height
Transparent
Признак необходимости задания прозрачного цвета для поля компонента. Если Transparent
= True
, то цвет компонента определяется цветом поверхности, на которой он находится. В противном случае цвет определяется значением свойства Color
Align
Определяет границу, к которой будет прижат компонент: Alignment
Способ выравнивания текста в поле компонента. Текст может быть прижат к левому (taLeftJustify
), правому краям (taRightJustify
) или находиться посередине (taCenter
) Visible
Если Visible
= True
, то компонент отображается на форме, а в противном случае не отображается Отдельно рассмотрим свойство Font
класса TFont
, определяющее шрифт. При выборе данного свойства на этапе проектирования проявляется диалоговое окно, в котором непосредственно задаются характеристики шрифта: стиль, размер и цвет. На этапе выполнения доступ к элементам шрифта осуществляется с помощью свойств класса TFont
: Color
— цвет шрифта, Height
и Size
высота шрифта, заданного либо в пикселях, либо Свойство Label
1.
Color
задает цвет самого компонента, а свойство Label
1.
Font
.
Color
— цвет, который используется для надписи внутри данного компонента. Рассмотрим несколько простых примеров использования данных компонентов. Пример 1
При нажатии на кнопку, на экране выдается, а затем при повторном нажатии исчезает некоторое сообщение, например «Моя первая программа на языке Delphi
». При повторном выводе размер надписи должен увеличиваться. Для этого поместим на форме компонент Label
и кнопку Button
. Затем определим соответствующее значение свойства Caption
и создадим процедуру обработки нажатия кнопки, которая имеет следующий вид: procedure TForm1.Button1Click(Sender: TObject); begin label1.Visible:=not label1.Visible; if label1.Visible then label1.Font.Size:=label1.Font.Size+1; end; В этой программе при каждом очередном нажатии происходит изменение свойства Visible
, вследствие чего надпись то появляется, то исчезает с экрана, а также происходит увеличение свойства Size
. Для вывода определенной информации на экран, кроме уже описанного компонента Label
, может быть также использован компонент Panel
с той же самой закладки или StaticText
со страницы Additional
. Они имеют Остальные компоненты позволяют вводить и редактировать информацию, включая возможность выделения, копирования, удаления и вставки фрагментов текста. Отметим общие для всех редакторов методы: Clear
— удалить весь текст, помещенный в редакторе; ClearSelect
— удалить выделенный фрагмент текста; CopyToClipboard
— копировать в буфер выделенных фрагмент, CutToClipboard
— удалить из текста выделенный фрагмент и поместить его в буфер, PasteFromClipboard
— копировать текст из буфера в то место редактора, где в данный момент находится курсор. Для всех редакторов определено дополнительное событие OnChange
, возникающее, когда изменяется текст, находящийся в редакторе. Для ввода или вывода одной строки могут использоваться компоненты Edit
со страницы Standart
и MaskEdit
со страницы Additional
.
Основное свойство данных компонентов — это строка, которая либо вводится, либо выводится. Данное свойство имеет имя Text
и тип String
, доступное как во время подготовки, так и время выполнения. Логическое свойство ReadOnly
позволяет запретить изменения, а целочисленное свойство GetTextLen
выдает текущую длину строки. Пример 2
Сделать так, чтобы при вводе текста в первом компоненте Edit
, во втором отображалась реальная длина вводимой строки. Кроме этого, при выходе из компонента Edit
1
его содержимое копировалось в буфер и удалялось, а при возвращении появлялось снова. В данном случае будем использовать три события, а именно OnChange
, OnEnter
и OnExit
. Тогда программа будет иметь следующий вид: procedure TForm1.Edit1Change(Sender: TObject); begin edit2.Text:= IntToStr(edit1.GetTextLen); end; procedure TForm1.Edit1Enter(Sender: TObject); begin edit1.PasteFromClipboard; end; procedure TForm1.Edit1Exit(Sender: TObject); begin edit1.SelectAll; edit1.CopyToClipboard; edit1.Clear; end; Событие клавиатуры возникает только в том случае, если нажата или отпущена произвольная клавиша. Имеет значение, была ли нажата клавиша с управляющим символом или с читаемым символом, поэтому имеются несколько различных событий. Событие OnKeyPress
происходит лишь при нажатии клавиши, с которой связан читаемый символ, а событие OnKeyDown
и OnKeyUp
вызываются при нажатии или отпускании произвольной клавиши клавиатуры. Во всех этих событиях присутствует параметр — переменная Key
, в которой после события помещается код нажатой клавиши, а также параметр Shift
. Пример 3
Сделать так, чтобы в Edit
нельзя было вводить подряд два одинаковых символа. Поместим на форму компонент Edit
и опишем глобальную переменную ch
типа char
, в которой будет храниться последний нажатый символ. Затем создаем процедуру обработки события KeyPress
, где параметр Key
типа char
содержит символ нажатой клавиши. Если вновь введенный символ совпадает с только что нажатым символом, то он игнорируется. Var ch:char; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if ch=key then key:=#0 else ch:=key; end; Пример
4
Написать программу, которая считает количество нажатий на кнопку и выдает это значение в компоненте Edit
. Для решения данной задачи поместим на форму компоненты Button
(кнопка, количество нажатий на которую будем считать) и Edit
(строка, procedure TForm1.Button1Click(Sender: TObject); begin i:=i+1; Edit1.Text:=IntToStr(i); end; Однако остается вопрос, где описывать данную переменную i
. Если сделать это внутри данной процедуры, то также необходимо осуществлять обнуление переменной, а это приведет к получению одного и того результата, равного единице. Следовательно, переменная i
должна быть глобальной в модуле, а ее начальная инициализация должна происходить в процедуре, которая выполняется всего один раз, и всего один раз происходит это событие. Таким событием создание формы OnCreat
произойдет один раз и процедура FormCreate
(Sender
:TObject
) будет вызвана всего один раз. Следовательно, описание переменной и процедур обработки событий в реализационной части будет иметь вид: Var i:integer; procedure TForm1.FormCreate(Sender: TObject); begin i:=0; end; procedure TForm1.Button1Click(Sender: TObject); begin i:=i+1; Edit1.Text:=IntToStr(i); end; При возникновении необходимости сделать данную переменную i
общедоступной, можно поместить описание переменной в интерфейсной части модуля после служебного слова public
. Именно так, как правило, type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public i:integer; { Public declarations } end; В программе для обращения к переменной i
необходимо писать ее полное имя Form
1
.i
. Однако код процедур обработки событий можно и не переписывать, поскольку процедуры обработки описаны непосредственно в формы, а следовательно, данное числовое поле доступно непосредственно. Данную программу можно легко модифицировать так, чтобы после определенного количества нажатий появлялось некоторое сообщение или кнопка блокировалась, или приложение автоматически закрывалось. Результат можно отображать не только посредством компонента Edit
, но Свойству Visible
компонента Label
присваиваем False
, т. е. при открытии формы надпись отражаться не будет. Затем, как и ранее, при нажатии на кнопку переменная i
увеличивается на 1. Когда значение переменной i
будет равно 10, 20, 30 или 40 компонент Label
становится видимым, implementation {$R *.dfm} Var i:Integer; procedure TForm1.FormCreate(Sender: TObject); begin i:=0; end; procedure TForm1.Button1Click(Sender: TObject); begin Label1.Visible:=False; i:=i+1; if (i=10)or(i=20)or(i=30)or(i=40) then Begin Label1.Visible:=True; Label1.Caption:='Вы нажали '+intToStr(i)+'раз'; end; if i=50 then Begin Label1.Visible:=True; Label1.Caption:='Вы нажали УЖЕ'+intToStr(i)+'раз'; Button1.Enabled:=False; end; end; В отличие от компонента Edit
компонент MaskEdit
, обладая теми же возможностями редактирования, позволяет определять маску, на основании которой будет осуществляться ввод информации. Маска редактируется с помощью пункта EditMask
инспектора объектов, выбор которого приводит к появлению диалогового окна (рис. 13). Можно выбрать любой имеющийся шаблон ввода текстовой информации или создать собственный. На этапе выполнения вводимый текст должен отвечать этому шаблону.
Рисунок
13
Компонент LabeledEdit
отличается от компонента Edit
только тем, что имеет привязанный к нему компонент Label
, свойства которого содержатся в раскрывающейся вкладке EditLabel
. Свойство LabelPosition
отвечает за расположение Label
относительно Edit
, а свойство LabelSpacing
— за количество пробелов, разделяющих Edit
, и прикрепленный к нему Label
. Оба компонента находятся на закладке Addition
. Для ввода целых чисел стандартных компонентов нет, однако имеется возможность самим сконструировать компонент. Для этого необходимо на форму поместить компонент Edit
и компонент UpDown
со страницы Win
32
, а затем свойству Associate
данного компонента придать значение Edit
1
. После выполнения этой операции компоненты будут связываться между собой, при выполнении программы — располагаться рядом. Основные свойства компонента UpDown
: Min
— минимальное и Max
— максимальное значения. Если последние свойства имеют значение 0, то число, задаваемое в компоненте, не имеет ограничений. Свойство Increment
определяет, на сколько будет изменяться значение при каждом Для ввода или вывода нескольких строк могут использоваться компоненты Memo
со страницы Standard
и RichEdit
со страницы Win
32
(полный текстовый редактор для RTF
-файлов).
Многие свойства у данных компонентов аналогичны свойствам компонента Edit
, однако для возможности доступа к строкам вместо свойства Text
имеется свойство Lines
, при выборе которого во время проектирования задается начальное значение строк с помощью следующего диалогового окна, представленного на рисунке 14. Во время исполнения данное свойство представляет собой указатель на содержимое окна.
Рисунок
14
Для доступа к строкам во время выполнения программы также используется свойство Lines
класса TString
. Подробнее остановимся на классе TString
, с которым в последствии мы будем еще встречаться. Класс TString
обладает также рядом методов, среди которых отметим следующие: Add
(St
:
String
):
integer
добавляет строку St
и возвращает номер этой строки; Delete
(Index
:
Integer
) удаляет строку с номером Index
; Insert
(Index
:
Integer
,
St
:
String
) вставляет строку с номером Index
, Clear
полностью уничтожает все содержимое компонента. Все содержимое компонента можно записать в файл с помощью метода SaveToFile
или прочитать из файла посредством методом LoadFromFile.
Аналогичным образом можно поступить и с потоком, направив в него весь файл, или прочитать файл из потока. Важным свойством компонентов Memo
и RichEdit
является ScrollBar
, которое определяет, будет ли окно содержать горизонтальные или вертикальные линейки прокрутки. Пример 5
Задается текст в компоненте Memo1
и номер строки в компоненте Edit1
. Необходимо вырезать строку с данным номером и поместить ее Для решения данной задачи поместим все необходимые компоненты на форму и напишем процедуру обработки события, в которой задается значение компонента Edit
2
и удаляется строка из Memo
1
: procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text:=memo1.Lines[strToInt(edit1.Text)-1]; memo1.Lines.Delete(strToInt(edit1.Text)-1); end; Пример 6
Cохранить набранный в Memo
файл с именем, определенным в Edit
. Для решения данной задачи поместим на форму компонент Memo
1
,
Рисунок
15
Процедура обработки события будет состоять из одной строки, и соответственно, листинг будет иметь следующий вид: procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.SaveToFile(Edit1.Text); end; Компонент RichEdit
обладает всеми характеристиками, присущими компоненту Memo
, однако имеет богатые возможности для работы с текстовым форматом RTF
. Данный формат предполагает возможность разбивать текст на параграфы. Для этого существуют специальные свойства: SelAttributes
определяет атрибуты выделенного фрагмента и Paragraph
— атрибуты абзаца. Задания
:
1. Проверьте все программы из данной лабораторной работы и выполните задание, которое соответствует номеру вашего варианта. 2. Создайте приложение, в котором при нажатии на одну из кнопок 3. Сделайте компонент Edit
таким образом, чтобы в него можно было бы вводить только цифры. 4. Создайте приложение, в котором при наборе текста в компоненте Edit
в момент нажатия буквы t
все содержимое данной строки добавляется новой строкой в компонент Memo
. 5. Создайте приложение, в котором в строку вводится буква я
, выдается некоторое сообщение.
Лабораторная работа 4
. Компоненты-переключатели Цель:
изучить компоненты выбора переключения с зависимой и независимой фиксацией. Для организации ветвления в языке программирования Pascal
используются два оператора: оператор ветвления If
…then
и оператор выбора Case
. Выбор конкретной ветви алгоритма может осуществляться несколькими различными способами. Можно программно анализировать полученные ранее данные, однако в реальном программировании часто встречается ситуация, когда дальнейшие действия должны зависеть от выбора пользователя. Именно для таких ситуаций существует множество компонентов, которые позволяют визуально выбирать некоторый способ продолжения выполнения программы. Эти компоненты будем условно называть переключателями. Существуют два принципиально различных вида переключателей, это, во-первых, те, которые могут принимать единственное значение из предлагаемого набора (иногда они называются переключателями с зависимой фиксацией) и, во-вторых, переключатели, которые в любой момент времени могут быть либо включены, либо выключены (по аналогии они называются переключателями с независимой фиксацией или включателями). Рассмотрим первый тип переключателей. Изображаются они в виде небольшого кружка. У выделенного переключателя внутри этого кружка помещается черная точка. К переключателям относятся компоненты: RadioButton
— выбор из одной альтернативы, RadioGroup
— выбор из набора альтернатив, ComboBox —
выбор из комбинированного списка, который переключателем как таковым не является, но может выполнять подобные функции. Все эти компоненты находятся на странице Standat
. Первый компонент RadioButton
позволяет выбирать из одной альтернативы, поэтому на этапе выполнения существует ключевое свойство Checked
, которое принимает значение True
, если данная альтернатива выбрана, и False
— в противном случае. С помощью этого свойства на этапе выполнения можно проверять состояние переключателя. Однако выбор из одной альтернативы не является выбором как таковым, поэтому либо группируют несколько подобных компонентов, либо используют другие компоненты. Рассмотрим компонент RadioGroup
. На этапе подготовки, пользуясь инспектором объектов, можно редактировать альтернативы с помощью свойства Items
класса TString
. При выборе данного свойства появляется редактор, где можно перечислять все возможные варианты действий. Данный редактор «
String
list
edit
»
аналогичен тому, который появляется при выборе свойства Lines
компонента Memo
. Используя свойство Columns
, можно задать число столбцов, где будут помещены выбираемые альтернативы. На этапе выполнения с помощью свойства ItemIndex
можно определить номер выбранной альтернативы, при этом нумерация начинается с 0. Если ни одна альтернатива не выбрана, то данное свойство принимает значение равное –1. Выбор начальной альтернативы можно установить Событие OnClick
возникает в тот момент, когда выбирается другой вариант. Приведем пример, использующий компонент RadioGroup
. Пример 1
Вычислить время падения с некоторой высоты при условии, что высота может задаваться в метрах, сантиметрах и дюймах. Задача уже была решена раньше, однако не учитывалась возможность ввода данных различного типа. Для решения этой задачи, кроме ранее используемых компонентов, поместим на форму компонент RadioGroup
После выполнения данных операций форма будет иметь вид, представленный на рисунке 16.
Рисунок
16
Как и раньше, будем анализировать нажатие на кнопку «Вычислить», но в расчетах учтем выбор соответствующей единицы измерения. Тогда процедура может иметь вид: procedure TForm1.Button1Click(Sender: TObject); Const g=9.81; Var h,t : Real; Begin h:=StrToFloat(edit1.Text); Case radioGroup1.ItemIndex of 0: t:=sqrt(2*h/g); {Высота задается в метрах} 1: t:=sqrt(2*h/100/g); {Высота задается в сантиметрах} 2: t:=sqrt(2*h*2.54/100/g); {Высота задается в дюймах} End; edit2.Text:=FloatToStr(t); end; Недостаток компонента RadioGroup
заключается в том, что имеется возможность определить только номер выбранной альтернативы, а не ее текстовое содержание. Для того чтобы определить и текстовое содержание альтернативы, можно использовать комбинированную строку, компонент ComboBox
. Комбинированная строка ввода объединяет в себе свойство строки и списка. В обычном состоянии она имеет вид строки Edit
со стоящей рядом кнопкой с изображением направленной вниз стрелки. Если нажать эту кнопку, то появится список строк, где можно выбрать произвольную. Данный компонент имеет свойство Items
, поэтому задание альтернатив, которые в данном случае будут раскрывающимся списком, происходит аналогичным образом. Однако на этапе выполнения допустимо свойство Text
, в котором находится выбранная из списка строка. При работе с данным компонентом необходимо различать свойства ComboBox
.
Items
.
Text
и ComboBox
.
Text
. Если первое — это свойство, где находятся все строки списка, включая разделители (это свойство имеет подобный смысл и для RadioGroup
), то второе содержит выбранную из списка строку. Если в предыдущем примере использовать компоненты ComboBox
Рисунок
17
Процедура обработки будет: procedure TForm1.Button1Click(Sender: TObject); Const g=9.81; Var h,t : Real; Begin h:=StrToFloat(edit1.Text); if ComboBox1.Text='метры' then t:=sqrt(2*h/g); {Высота задается в метрах} if ComboBox1.Text='сантиметры' then t:=sqrt(2*h/100/g); {Высота задается в сантиметрах} if ComboBox1.Text='дюймы' then t:=sqrt(2*h*2.54/100/g); {Высота задается в дюймах} edit2.Text:=FloatToStr(t); end; Выбор между компонентами RadioGroup
и ComboBox
во многом зависит от вкусов программистов, поскольку они выполняют одинаковую роль, а имеют различные внешний вид и применение. Необходимо отметить, что в языке Delphi
есть большое количество компонентов, имеющих одинаковую область применения, однако отличающихся некоторыми частными внешними особенностями и доступными для применения методами. Рассмотрим пример. Пример 2 (психологический тест)
Пусть имеется заданный набор из n
, заранее фиксированного числа вопросов. На каждый из вопросов может быть выбран один из трех ответов: «да», «нет», «не знаю». После ответов на все вопросы должен выдаваться результат. Предположим, что необходимо выдавать только количество первых, вторых и третьих ответов, хотя в реальных тестах, как правило, происходит подсчет баллов, на основании некоторого принципа. Для решения данной задачи поместим на форму компонент Edit
, в котором будет выдаваться очередной вопрос, а следовательно, свойству ReadOnly
придадим значение True
. Компонент RadioGroup
служит для задания вариантов ответов, которые в данном случае будут «да», «нет», «не знаю», при этом начальное значение свойства ItemIndex
должно быть равно единицы. Компонент Label
1
будет необходим для выдачи результатов тестирования. В модуле опишем константу n
для задания количества вопросов и целочисленные переменные i
, i
1
, i
2
, i
3
, в первой из которых будет содержаться номер вопроса, а в остальных — количество ответов каждого В данной задаче нельзя воспользоваться событием OnClick
для самого компонента RadioGroup
, поскольку не всегда на следующий вопрос будет выбираться другой ответ. Следовательно, на форму необходимо поместить два компонента Button
. При нажатии на первую кнопку происходит начало тестирования, т. е. обнуляются соответствующие переменные,
Рисунок
18
В модуле опишем дополнительную функцию, которая на основании целочисленного значения формировала соответствующий вопрос. Для создания реального теста эту функцию необходимо доработать в соответствии со способом задания вопросов, например, вопросы можно читать из файла. Тогда программа может иметь вид: Const n=5; Var i,i1,i2,i3:Integer; function Query(i:integer):String ; begin Query:='Вопрос'+IntToStr(i);{Функция формирования очередного вопроса} end; procedure TForm1.FormCreate(Sender: TObject); begin i:=1; Edit1.Text:=Query(1) end; procedure TForm1.Button1Click(Sender: TObject); begin i:=1; i1:=0; i2:=0; i3:=0; Edit1.Text:=Query(1); Label1.Caption:=''; end; procedure TForm1.Button2Click(Sender: TObject); begin i:=i+1; Case RadioGroup1.ItemIndex of 0:i1:=i1+1; 1:i2:=i2+1; 2:i3:=i3+1; end; if i<=n then Edit1.Text:=Query(i) else begin Label1.Caption:=' " Да" '+IntToStr(i1)+ ' "Нет" '+IntToStr(i2)+ ' "Не знаю" '+IntToStr(i3); Label1.Visible:=True; end; end; Переключатель с независимой фиксацией (выключатель) предназначен для задания одного из двух (трех) состояний. Во включенном состоянии К ним можно отнести компоненты CheckBox
со страницы Standat,
CheckListBox
со страницы Additional
и компонент ListBox
, который может выполнять функции переключателя. Основное свойство AllowGrayed
определяет, может ли опция находиться в двух или трех состояниях (включена, выключена и включена частично). В случае, если опция может находиться в двух различных состояниях, логическое свойство Checked
определяет, выбрана или нет данная опция. Если имеются три различных варианта, необходимо применять свойство State
, значение которого может быть cbUnChecked
— опция выключена, cbChecked
— опция включена, cbGrayed
— опция включена, однако изображается серым цветом. Пример 3
Необходимо на основании курса подсчитать, сколько лет еще необходимо учиться. Для решения данной задачи поместим на экран компонент CheckBox
, свойству AllowGrayed
придадим значение True
. В этом случае данный компонент может имееть три состояния, что соответствует трем возможным вариантам ответа: включена — имеется высшее образование, выключена — нет высшего образования, частично включена — неполное высшее. Поместим на форме компонент RadioGroup
, в котором посредством свойства Item
зададим возможные варианты курсов: первый, второй Проанализируем два различных события: нажатие на компоненты CheckBox
1
и RadioGroup
1
. При первом событии происходит анализ его состояния, если он включен частично, то на экран выводится группа переключателей, во всех других случаях данную группу убираем с экрана, Вся программа может иметь следующий вид: procedure TForm1.CheckBox1Click(Sender: TObject); begin If CheckBox1.State=cbGrayed Then begin RadioGroup1.Visible:=True; RadioGroup1.ItemIndex:=-1; Label1.Caption:=’’ end Else begin RadioGroup1.Visible:=False; If CheckBox1.State=cbChecked Then Label1.Caption:=’Есть высшее образование’ Else Label1.Caption:=’Нет высшего образования’ end; end; procedure TForm1.RadioGroup1Click(Sender: TObject); begin Label1.Caption:=’Еще учиться’+IntToStr(5-RadioGroup1.ItemIndex) end; Рассмотрим компоненты, которые могут задавать несколько опций, Пример 4
Выбрать все отмеченные опции из компонента CheckListBox
в Memo
. Данную задачу можно интерпретировать как составление счета, при условии, что список опций — это меню. Поместим на экран компонент CheckListBox
, в нем с помощью пункта Item
зададим начальные опции (пункты, которые могут быть выбраны). procedure TForm1.Button1Click(Sender: TObject); Var i:Integer; begin Memo1.Lines.Clear; for i:=0 to CheckListBox1.Items.Count-1 do begin If CheckListBox1.Checked[i] then Memo1.Lines.Add(CheckListBox1.Items.Strings[i]); end; end; Компонент ListBox
предназначен для отображения на экране списка строк и в отличие от компонента CheckListBox
, позволяющего включать или выключать опции, помогает выбирать некоторые строки из списка. На этапе проектирования, кроме свойства Item
, рассмотрим два логических свойства MultiSelect
и EnternetSelect
. Если первое свойство имеет значение True
, то можно выделять несколько строк, в противном случае выделяется только одна строка. Второе свойство определяет способ выделения строк. Если оно имеет значение True
, то выбор нескольких рядом стоящих строк осуществляется с помощью клавиши Shift
, а не рядом стоящих строк посредством клавиши Ctrl
. Для проверки выбранных строк на этапе выполнения может использоваться целочисленное свойство ItemIndex
, задающий номер единственной выбранной строки и логическое свойство Selected
[Index
], принимающее значение True
, если соответствующая строка выбрана. Задания:
1. Проверьте все примеры из лабораторной работы. 2. Доработайте пример 3 таким образом, чтобы имелась возможность вернуться на один вопрос назад. 3. Задана компонента ComboBox
, в свойстве Items
записаны различные цвета. Сделайте, чтобы при выборе определенного цвета, изменялся цвет формы. Данную задачу выполните и с RadioGroup
.
Лабораторная работа 5
.
Компоненты
-таблицы Цель:
изучить возможности обработки табличной информации, используя компоненты StringGrid
и DrawGrid
. Для обработки табличных данных предусмотрены компоненты StringGrid
, представляющий собой таблицу строк, и DrawGrid
, являющийся таблицей более общего назначения, в ячейках которого может храниться произвольная информация произвольной природы, например, текст, числа, рисунок и т. д. Оба компонента находятся на странице Additional
. Компоненты таблицы имеют форму и функциональные возможности электронных таблиц. В компоненте DrawGrid
можно отображать какие-либо данные (числа, рисунки, пиктограммы) в форме таблиц. Кроме того, имеется возможность редактировать данные в каждой ячейке по отдельности. С помощью компонента StringGrid
можно обрабатывать строки С помощью инспектора объектов в свойстве ColCount
можно определить количество строк, а в свойстве RowCount
задать количество столбцов. Свойства DefaulColWidth
и DefaulRowWidth
задают ширину всех строк и высоту всех столбцов. Свойство ScrollBar
является логическим Каждая таблица должна иметь ячейки, в которых будет выводиться служебная информация, постоянно находящаяся на экране, даже если применяются линейки прокрутки. Поэтому существуют свойства FixedCol
, FixedRows
и FixedColor
, задающие количество фиксированных строк и столбцов таблицы, их цвет (по умолчанию FixedCol
=
1 и FixedRows
=
1). Любая таблица должна иметь хотя бы одну строку и один столбец подобных ячеек. Необходимо помнить, что нумерация и строк, и столбцов начинается с нуля. Поэтому, если оставить одну фиксированную строку и столбец, нумерация, доступная для редактирования, будет начинаться с 1.
Рисунок
19
С помощью составного свойства Options
можно задать флаги, определяющие поведение таблицы. Среди них отметим следующие: goEditing
— показывает, может ли редактироваться содержимое ячеек, goAlweysShowEditing
— определяет, становится ли выделенная ячейка сразу и активной (в противном случае ячейка активизируется либо нажатием клавиши F2, либо двойным щелчком мыши, либо нажатием произвольной символьной клавиши). На рисунке 19 изображена форма с компонентом StringGrid
. Большинство описанных свойств представлены в инспекторе объектов. Следует знать в виду, что в силу своей универсальности таблица типа DrawGrid
не имеет конкретного средства отображения реальных изображений в ячейках таблицы и для каждого нового вида изображений необходимо создавать свои средства, поэтому остановимся более подробно на таблице типа StringGrid
. Для доступа к ячейкам таблицы на этапе выполнения программы можно воспользоваться свойствами Cells
[ACol
,
ARow
], Cols
[ACol
],
Rows
[ARow
]. Cells
[ACol
,
ARow
] определяет ячейку, находящуюся в столбце ACol
Cols
[ACol
] определяет колонку; Rows
[ARow
] определяет строку.
Значения целочисленных свойств Col
и Row
, допустимых только во время выполнения, указывают на активную в данный момент ячейку, строку или столбец. При работе с таблицами дополнительно обрабатываются события, связанные с изменениями в ячейках. Замечание.
На этапе проектирования заполнять таблицу начальными данными нельзя. Пример 1
Заполнить таблицу произвольного размера произвольными числами. Поместим на форму компонент StringGrid
, где будем располагать числа; два компонента Edit
, в которых будут вводиться размеры таблицы; кнопку Button, при нажатии на нее произойдет заполнение таблицы. Тогда процедура будет иметь следующий вид: procedure TForm1.Button1Click(Sender: TObject); var i,j:Integer; begin with StringGrid1 do begin ColCount:=StrToInt(Edit1.Text)+1; RowCount:= StrToInt(Edit1.Text)+1; for i :=1 to ColCount do for j:=1 to RowCount do Cells[i,j]:=IntToStr(50-Random(100)); end; end; Пример 2
В числовой таблице, заданной произвольным образом, подсчитать количество отрицательных значений в каждой строке и в дополнительном столбце. procedure TForm1.Button2Click(Sender: TObject); var i,j,k:Integer; begin with StringGrid1 do begin ColCount:= StrToInt(Edit1.Text)+2; for i:=1 to RowCount-1 do begin k:=0; for j:=1 to ColCount-2 do If StrToInt(Cells[j,i])<0 Then k:=k+1; Cells[ColCount-1,i]:=IntToStr(k); end; end; end; При использовании компонента DrawGrid
элементом каждой ячейки является рисунок класса TRect
, возможности обработки которого будут продемонстрированы нами в лабораторной работе 7 при изучении графических возможностей. При работе с компонентом StringGrid
имеется один досадный факт, Procedure SaveGrid; var f:textfile; x,y:integer; Begin assignfile (f,’Filename’); rewrite (f); writeln (f, StringGrid1.colcount); writeln (f, StringGrid1.rowcount); For X:=0 to StringGrid1.colcount-1 do For y:=0 to StringGrid1.rowcount-1 do writeln (F, StringGrid1.cells[x,y]); closefile (f); end; Procedure LoadGrid; var f:textfile; temp,x,y:integer; tempstr:string; begin assignfile (f,’Filename’); reset (f); readln (f,temp); StringGrid1.colcount:=temp; readln (f,temp); StringGrid1.rowcount:=temp; For X:=0 to StringGrid1.colcount-1 do For y:=0 to StringGrid1.rowcount-1 do begin readln (F, tempstr); stringgrid.cells[x,y]:=tempstr; end; closefile (f); end; Задания:
1. Проверьте все примеры из лабораторной работы. 2. Дана таблица размера n×n
, посчитайте количество четных элементов главной диагонали. 3. Заполните две таблицы случайными числами и перемножить их по правилу перемножения матриц. Ответ выводится в третьей таблице. 4. Дана таблица размера n×n
. Забейте таблицу случайными числами 5. Реализуйте на языке программирования Delphi
задания из лабораторных работ по теме «Массива».
Лабораторная работа 6
.
Окна сообщений и диалоговые окна
Цель:
изучить возможности формирования сообщений и использования диалоговых компонентов. До сих пор нами рассматривались те компоненты, которые не только могут располагаться на форме, но и при выполнении остаются там же. Однако часто возникает необходимость в выдаче каких-либо сообщений или получении определенной информации от пользователя. Для этой цели в языке программирования Delphi
имеются некоторые функции, процедуры и компоненты. Процедура ShowMessage
(
Msg
:
String
)
формирует и выдает на экран окно с сообщением Msg
. Помимо сообщения это окно имеет кнопку Ok
, при нажатии на которую закрывается данное окно. Заголовок окна совпадает с названием приложения. При необходимости выдаваемая информация разбивается на строки. Окно, сформированное данной процедурой, так же, как и все окна, работает в модальном режиме, когда блокируется выполнение приложения до закрытия данного окна. Процедура ShowMessagePos
(
Msg
:
String
,
X
:
Integer
;
Y
:
Integer
)
выдает окно так, чтобы его левый верхний угол находился в точке с абсолютными координатами (X
, Y
). Пример использования данной процедуры может иметь следующий вид: ShowMessage (‘Текст содержит‘ +IntToStr (RichEdit1.Lines.Count )); Данные процедуры позволяют выдавать на экран сообщение, но Общий вид данной функции: MessageDlg(Msg:String; aType:TmsgDlg
Type; aButton:TmsgDlgButton; HelpCtx: LongInt): Word;
В переменной Msg
задается текст выдаваемого сообщения, в переменной aType
тип окна. Всего имеется пять предопределенных окон сообщения, следовательно, параметр aType
может иметь пять различных значений, которые перечислены в таблице 2. Таблица 2. Значения параметра
aType
Свойство
Описание
mtWarning
Окно-предупреждение mtError
Окно-сообщение об ошибке mtInformation
Информационное окно mtConfirmation
Окно-подтверждение mtCustom
Окно-сообщение Параметр aButton
определяет, какие кнопки будет содержать окно сообщения. Это параметр имеет тип множество
, и его значение должно быть заключено в квадратные скобки. Для данного параметра могут задаваться значения, перечисленные в таблице 3. Таблица 3. Значения параметра
aButton
Значение
Описание
mbYes
Кнопка Yes
(Да) MbNo
Кнопка No
(Нет) MbOk
Кнопка Ok
mbCancel
Кнопка Cancel
(Отмена) mbHelp
Кнопка Help
(Помощь) mbAbort
Кнопка Abort
(Прекратить) mbIgnore
Кнопка Ignore
(Игнорировать) mbAll
Кнопка All
(Все) mbRetry
Кнопка Retry
(Продолжить) Параметр HelpCtx
определяет текст справки, которая должна выводиться, если пользователь нажмет клавишу [F1]. Оператор вывода на экран окна может работать и как процедура (т. е. не иметь выходных параметров), и как функция. В этом случае результатом является значение, определяющее, какая кнопка была нажата: либо mbNone
(т. е. ни одна кнопка не была нажата), либо значение соответствующей клавиши, префиксом mr
. Примеры использование функции MessageDlg
. Пример 1
При нажатии на кнопку формы появляется диалоговое окно. При нажатии на кнопку Yes
содержимое компонента RichEdit
1
сохраняется procedure TForm1.Button1Click(Sender: TObject); begin if MessageDlg('Изменения сохранить ',mtWarning, [mbYes, mbNo, mbCancel],0)=mrYes then RichEdit1.Lines.SaveToFile('D:\Temp\Пример.dat'); end; В данном примере вызывается диалоговое окно предупреждения. Пример 2
Вычислить значение f
(x
) = ln
(x
)×x
c проверкой области значения данной функции. Значение переменной x
определяется в компоненте Edit
1
. procedure TForm1.Button1Click(Sender: TObject); Var x,y:Real; begin x:=StrToFloat(Edit1.Text); if x<=0 then MessageDlg('Логарифм данного аргумента не существует', mtError, [mbOk],0) else begin y:=ln(x)*x; Edit2.Text:=FloatToStr(y); end; end; Пример 3
Использовать окна можно и во время создания формы. Например, можно сделать так, чтобы до появления основной формы появлялось диалоговое окно с приглашением. procedure TForm1.FormCreate(Sender: TObject); begin MessageDlg('Добро пожаловать', mtCustom,[mbYes],0); end; Диалоговое окно MessageDlg
позволяет определить нажатую кнопку, но не имеет возможности для передачи информации от пользователя InputBox
(Caption
,Msg
,Default
:String
):String
— функция, которая выводит диалоговое окно с заголовком Caption
, сообщением Msg
и поле для ввода информации, в котором вначале находится текст, заданный строкой Default
, а также двумя кнопками Ok
и Cancel
. Если диалоговое окно закрывается нажатием кнопки Ok
, то функция возвращает набранную строку, в противном случае возвращается строка по умолчанию Default
. InputQuery
(Caption
,Msg
:String
, Var
Value
|