Справочник от Автор24
Поделись лекцией за скидку на Автор24

Знакомство со средой программирования Delphi

  • 👀 719 просмотров
  • 📌 647 загрузок
Выбери формат для чтения
Загружаем конспект в формате doc
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Знакомство со средой программирования Delphi» doc
1. Знакомство со средой программирования Delphi 1.1 Структура среды программирования Delphi – система быстрой разработки приложений для операционной системы Windows. Концепция Delphi была реализована в конце 1994 г., когда вышла первая версия среды разработки. В основу этого программного продукта легли концепции объектно-ориентированного программирования и визуального подхода к построению интерфейса приложения. На сегодняшний момент вышла седьмая версия среды. От версии к версии разработчики улучшают средства для разработки приложений. Delphi – это комбинация нескольких важнейших технологий: • Высокопроизводительный компилятор в машинный код • Объектно-ориентированная модель компонентов • Визуальное построение приложений из программных прототипов • Масштабируемые средства для построения баз данных Приложение для Windows – это специальный тип программы, которая: • Имеет специальный формат исполняемого файла (*.exe) • Работает только с Windows • Обычно работает в прямоугольном окне на экране • При выводе на экран следует рекомендациям по стандартному пользовательскому интерфейсу • Может работать одновременно с другими программами для Windows, включая другие экземпляры этого же приложения • Может взаимодействовать и совместно использовать данные с другими приложениями Windows Среда Delphi состоит из нескольких отдельно расположенных окон. Рисунок 1 Главное окно Delphi Ниже перечислены основные составные части Delphi: 1. Главное окно 2. Дизайнер Форм (Form Designer)  3. Окно Редактора Исходного Текста (Editor Window) 4. Палитра Компонент (Component Palette) 5. Инспектор Объектов (Object Inspector) 6. Справочник (On-line help) Есть, конечно, и другие важные составляющие Delphi, вроде линейки инструментов, системного меню и многие другие, нужные для точной настройки программы и среды программирования. Рассмотрим функции каждого составляющего. Главное окно управляет процессом разработки приложения. Оно управляют файлами, включаемых в приложение и выполняет всю работу, связанную с их сопровождением, компиляцию и отладкой. Главное окно имеет • Главное меню (MenuBar), располагается непосредственно под строкой заголовка главного окна и позволяет получить доступ ко всем функциях среды разработки. • Панель инструментов (SpeedBar) предоставляет быстрый доступ к большинству команд главного меню. Располагается под главным меню. • Палитра компонентов (Component Palette) предоставляет доступ к визуальным компонентов, которые можно помещать на форму. Программисты на Delphi проводят большую часть времени, переключаясь между Дизайнером Форм и Окном Редактора Исходного Текста (которое для краткости называют Редактор). Дизайнер Форм в Delphi столь интуитивно понятен и прост в использовании, что создание визуального интерфейса превращается в детскую игру. Окно формы представляет собой проект Windows-окна будущей программы. Вначале это окно пусто. Точнее, оно содержит стандартные для Windows интерфейсные элементы – кнопки вызова системного меню, максимизации, минимизации и закрытия окна, полосу заголовка и очерчивающую рамку. Вся рабочая область окна обычно заполнена точками координатной сетки, служащей для упорядочения размещаемых на форме компонентов (вы можете убрать эти точки, вызвав с помощью меню Tools | Environment options соответствующее окно настроек и убрав флажок в переключателе Display Grid на окне, связанном с закладкой Preferences). Значительную часть времени программист занят увлекательным занятием, напоминающим работу с набором деталей конструктора Lego: он “достает” из палитры компонентов, как из коробки с деталями, нужный компонент и размещает его на “наборном поле” окна формы, постепенно заполняя форму интерфейсными элементами. Собственно, именно в этом процессе наполнения формы и заключается главная изюминка визуального программирования. Программист в любой момент времени контролирует содержание окна создаваемой программы и может внести в него необходимые изменения. Несмотря на всю важность Дизайнера Форм, местом, где программисты проводят основное время является Редактор. Логика является движущей силой программы и Редактор – то место, где Вы ее “кодируете”. Палитра компонентов - это главное богатство Delphi. Она занимает правую часть главного окна и имеет закладки, обеспечивающие быстрый поиск нужного компонента. Под компонентом понимается некий функциональный элемент, содержащий определенные свойства и размещаемый программистом в окне формы. С помощью компонентов создается каркас программы, во всяком случае - ее видимые на экране внешние проявления: окна, кнопки, списки выбора и т. д. Палитра Компонент позволяет Вам выбрать нужные объекты для размещения их на Дизайнере Форм. Для использования Палитры Компонент просто первый раз щелкните мышкой на один из объектов и потом второй раз - на Дизайнере Форм. Выбранный Вами объект появится на проектируемом окне и им можно манипулировать с помощью мыши. Палитра Компонент использует постраничную группировку объектов. Внизу Палитры находится набор закладок - Standard, Additional, Dialogs и т.д. Если Вы щелкнете мышью на одну из закладок, то Вы можете перейти на следующую страницу Палитры Компонент. Принцип разбиения на страницы широко используется в среде программирования Delphi и его легко можно использовать в своей программе. Слева от Дизайнера Форм Вы можете видеть Инспектор Объектов. Любой размещаемый на форме компонент характеризуется некоторым набором параметров: положением, размером, цветом и т. д. Часть этих параметров, например, положение и размеры компонента, программист может изменять, манипулируя с компонентом в окне формы. Для изменения других параметров предназначено окно Инспектора объектов. Это окно содержит две страницы – Properties (Свойства) и Events (События). Страница properties служит для установки нужных свойств компонента, страница Events позволяет определить реакцию компонента на то или иное событие. Совокупность cвойств отображает видимую сторону компонента: положение относительно левого верхнего угла рабочей области формы, его размеры и цвет, шрифт и текст надписи на нем и т. п.; совокупность событий - его поведенческую сторону: будет ли компонент реагировать на щелчок мыши или на нажатие клавиш, как он будет вести себя в момент появления на экране или в момент изменения размеров окна и т. п. Каждая страница окна Инспектора объектов представляет собой двухколончатую таблицу, левая колонка которой содержит название свойства или события, а правая – конкретное значение свойства или имя подпрограммы [Если вам еще не знаком этот термин, считайте, что подпрограмма – это просто относительно небольшой фрагмент программы.], обрабатывающей соответствующее событие. В верхней части окна Инспектора объектов располагается раскрывающийся список всех помещенных на форму компонентов. Поскольку форма сама по себе является компонентом, ее имя также присутствует в этом списке. Страница событий связана с Редактором; если Вы дважды щелкнете мышкой на правую сторону какого-нибудь пункта, то соответствующий данному событию код автоматически запишется в Редактор, сам Редактор немедленно получит фокус, и Вы сразу же имеете возможность добавить код обработчика данного события. Окно кода предназначено для создания и редактирования текста программы. Этот текст составляется по специальным правилам и описывает алгоритм работы программы. Совокупность правил записи текста называется языком программирования. В системе Delphi используется язык программирования Object Pascal, который представляет собой расширенную и усовершенствованную версию широко распространенного языка Паскаль, впервые предложенного швейцарским ученым Н. Виртом еще в 1970 г. и усовершенствованного сотрудниками корпорации Borland (созданные ими языки назывались Turbo Pascal, Borland Pascal и Object Pascal). Первоначально окно кода содержит минимальный исходный текст, обеспечивающий нормальное функционирование пустой формы в качестве полноценного Windows-окна. В ходе работы над проектом программист вносит в него необходимые дополнения, чтобы придать программе нужную функциональность. Поскольку для создания даже простых программ вам понадобится создавать и изменять (редактировать) код программы, ниже описываются основные приемы работы с окном кода. Сразу после открытия нового проекта в нем будут минимально необходимые строки кода для описния формы. Последняя важная часть среды Delphi – Справочник (on-line help). Для доступа к этому инструменту нужно просто выбрать в системном меню пункт Help и затем Contents. На экране появится Справочник. Справочник является контекстно-зависимым; при нажатии клавиши F1, Вы получите подсказку, соответствующую текущей ситуации. Например, находясь в Инспекторе Объектов, выберите какое-нибудь свойство и нажмите F1 - Вы получите справку о назначении данного свойства. Если в любой момент работы в среде Delphi возникает неясность или затруднение - жмите F1 и необходимая информация появится на экране. 1.2 Проект Delphi Основная программа, которая использует написанные программистом модули, называется проектом. Проект может включать формы, модули, установки параметров проекта, ресурсы, графическую информацию и т.д. Вся эта информация хранится в различных файлах, которые используются в головной программе, т.е. в проекте. Любой проект имеет, по-крайней мере шесть файлов, связанных с ним. Три из них относятся к управлению проектом из среды и напрямую программистом не меняются. Ниже приводится список файлов, которые обязательно содержатся в проекте. • Главный файл проекта, изначально называется PROJECT1.DPR. • Первый модуль программы (unit), который автоматически появляется в начале работы. Файл называется UNIT1.PAS по умолчанию, но его можно назвать любым другим именем, вроде MAIN.PAS. • Файл главной формы, который по умолчанию называется UNIT1.DFM, используется для сохранения информации о внешнем виде главной формы. • Файл PROJECT1.RES содержит иконку для проекта, создается автоматически. • Файл, который называется PROJECT1.DFO по умолчанию, является текстовым файлом для сохранения установок, связанных с данным проектом. Например, установленные разработчиком директивы компилятора сохраняются здесь. • Файл PROJECT1.CFG содержит информацию о состоянии рабочего пространства. Разумеется, если сохранить проект под другим именем, то изменят название и файлы с расширением RES, DFO и CFG. Кроме того, в проекте сохраняются файлы резервных копий (т.е. файлы с расширениями *.~df, *.~dp, *.~pa). Поскольку проект содержит множество файлов, то рекомендуется для каждого проекта создавать отдельную директорию. Все манипуляции с файлами (сохранение, переименование, редактирование и т.д.) рекомендуется производить только в среде разработки. После компиляции программы получаются файлы с расширениями: DCU – скомпилированные модули EXE – исполняемый файл 1.3 Главное меню среды Пункт меню “File” New предлагает выбрать тип нового приложения New Application начинает новый проект для оконного приложения New Form создает новую форму и модуль, связанный с ней Open открывает при необходимости любой модуль или просто текстовый файл. Если модуль описывает форму, то эта форма тоже появится на экране. Open Project открывает существующий проект. Reopen открывает ранее открывавшийся проект Save сохраняет только редактируемый файл, но не весь проект. Save As сохраняет редактируемый файл под другим именем. Save Project As сохраняет проект Save All сохранить все файлы Close удаляет текущий файл из окна Редактора. Close All закрывает все файлы проекта Рисунок 2 Пункт меню “Edit” “Edit” содержит команды Undo и Redo, которые могут быть очень полезны при работе в редакторе для устранения последствий при неправильных действиях, например, если случайно удален нужный фрагмент текста. Команды Cut, Copy, Paste и Delete - как во всех остальных приложениях Windows, но их можно применять не только к тексту, но и к визуальным компонентам. Bring To Front, Send To Back, Align и Size используются для выравнивания и управления внешним видом компонентов на форме. Пункт меню “View” Project manager позволяет видеть содержимое проекта. Object Inspector показывает окно Инспектора объектов. Пункт меню “Project” Add to Project позволяет добавлять форму в проект. Remove from Project удаляет форму из проекта. View Source показывает содержимое файла проекта. Syntax Check только проверяет правильность кода программы, но не обновляет DCU файлы. Пункт меню “Run” Run F9 компилирует и запускает приложение на исполнение Program Reset снимает с выполнения приложение. 1.4 Первое приложение на Delphi Рассмотрим процесс построения простейшего приложения, которое работает следующим образом. При нажатии кнопки появляется сообщение «Здравствуй, мир!». Порядок действий: 1. Запустите Delphi. (Пуск/ Программы/Borland Delphi 5) При этом автоматически открывается новый проект для оконного приложения с одной главной формой и модулем, соответствующим этой форме. 2. Выберите в Палитре компонентов закладку Standard. и перенесите с Палитры компонентов на форму компонент и TButton. Для этого поочередно подводите курсор мыши к компонентам, читая подсказки, до тех пор, пока не появится TButton. Выберете его, нажав левую кнопку мыши, а затем переместите указатель на форму и нажмите еще раз на кнопку мыши. Помещенный на форму компонент будет иметь имя Button1. При этом текст модуля будет иметь вид unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) Button1: TButton; private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} end. 3. Для того, чтобы при нажатии на кнопку происходили какие-либо действия нужно написать обработчик события Button1Click. Для этого выберите на форме Button1 и щелкните на него дважды. Вы окажетесь в окне редактирования. 4. Приведите обработчик события нажатия кнопки к следующему виду: procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(‘Здравствуй, мир!'); end; 5. Сохраните Приложение, выбрав пункт в главном меню File -> Save All. Название проекта и название программного модуля не должно совпадать! Рекомендуется создать отдельную директорию для файлов проекта. 6. Запустите на выполнение ваше Приложение. Для этого выберете в главном меню пункт Run->Run, или нажмите клавишу F9. Рисунок 3 Работа приложения 7. Изменим в Инспекторе объектов у кнопки свойство Caption на Привет. При этом изменится надпись на кнопке. 8. Если изменим у кнопки свойство Name на MyButton, то текст модуля также изменится TForm1 = class(TForm) MyButton: TButton; procedure MyButtonClick(Sender: TObject); private { Private declarations } public { Public declarations } end; Текст файла проекта при этом будет выглядеть так. program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. С каждым проектом связан глобальный объект Application, который инкапсулирует свойства и методы приложения для Windows. В файле проекта, который среда генерирует автоматически, вызываются методы этого объекта: инициализация, создание формы, функционирование приложения. 1.5 Контрольные вопросы 1. Назовите основные составляющие среды DELPHI и их назначение. 2. Назовите состав и назначение пунктов главного меню системы. 3. Каково назначение Инспектора объектов? 4. Из каких основных файлов состоит проект приложения? 5. Как производится размещение, перемещение, изменение размеров компонентов на форме? 6. Как запустить приложение на выполнение из среды DELPHI? 2. Библиотека визуальных компонентов (VCL) 2.1 Иерархия базовых классов VCL Библиотека визуальных компонентов включает множество классов, которые можно использовать при разработке приложений. VCL тесно связана со средой разработки (все визуальные компоненты расположены на Палитре компонентов) и позволяет быстро создавать интерфейс приложения. Множество классов, входящих в библиотеку визуальных компонентов, организовано в виде иерархии. На самом верхнем уровне иерархии находится класс TObject, который является предком для любого класса. От него каждый класс получает в наследство механизмы создания и уничтожения экземпляра класса. Все классы библиотеки визуальных компонентов произошли от группы базовых классов, которые лежат в основе иерархии. Класс TComponent является важнейшим классом, поскольку является предком для визуальных компонентов. Он наделен взаимодействием компонента со средой разработки, с Палитрой компонентов и Инспектором Объектов. Благодаря этим возможностям компоненты начинают работают уже во время разработки интерфейса приложения. Визуальные компоненты можно разбить на две группы: видимые и невидимые. Видимые компоненты видны не только во время дизайна интерфейса, но и во время работы приложения. Невидимые компоненты не видны во время работы программы, они осуществляют взаимодействие с ресурсами либо с другими компонентами. Непосредственно от класса TComponent можно порождать невидимые визуальные компоненты. Класс TControl является прямым предком для видимых визуальных компонентов и имеет соответствующие свойства и метода, отвечающие за внешний вид компонентов. Видимые компоненты, которые имеют фокус ввода, т. е. имеют возможность получать и обрабатывать сообщения Windows (например, от клавиатуры), порождаются от класса TWinControl. 2.2 Типы свойств компонентов. Изменение свойств Каждый компонент имеет свой набор характеристик или свойств. Для пользователя (программиста) свойство выглядит как простое поле какой-либо структуры, содержащее некоторое значение. Однако в отличие от “просто” поля, любое изменение значения некоторого свойства компонента сразу же приводит к изменению визуального представления этого компонента, поскольку свойство инкапсулирует в себе методы (действия), связанные с чтением и записью этого поля (которые, в свою очередь, включают в себя необходимую перерисовку). Каждый компонент, который помещается на форму, имеет свое отражение в окне Инспектора Объектов (Object Inspector). Инспектор Объектов имеет две “странички” - “Properties” (Свойства) и “Events” (События), где можно изменять характеристики компонента. Существует несколько типов свойств, в зависимости от их “природы”, т.е. внутреннего устройства. ◦ Простые свойства - это те, значения которых являются числами или строками. Например, свойства Left и Top принимают целые значения, определяющие положение левого верхнего угла компонента или формы. Свойства Caption и Name представляют собой строки и определяют заголовок и имя компонента или формы. ◦ Перечислимые свойства - это те, которые могут принимать значения из предопределенного набора (списка). Простейший пример - это свойство типа Boolean, которое может принимать значения True или False. ◦ Вложенные свойства - это те, которые поддерживают вложенные значения (или объекты). Object Inspector изображает знак “+” слева от названия таких свойств. Некоторые свойства, например, Font, для изменения своих значений имеют возможность вызвать диалоговое окно. Для этого достаточно щелкнуть маленькую кнопку с тремя точками в правой части строки Инспектора Объектов, показывающей данное свойство. Delphi позволяет легко манипулировать свойствами компонент как в режиме проектирования (design time), так и в режиме выполнения программы (run time). В режиме проектирования манипулирование свойствами осуществляется с помощью Дизайнера Форм (Forms Designer) илина страничке “Properties” Инспектора Объектов. Например, для того чтобы изменить свойства Height (высоту) и Width (ширину) кнопки, достаточно “зацепить” мышкой за любой ее угол и раздвинуть до нужного представления. Того же результата можно добиться, просто подставив новые значения свойств Height и Width в окне Object Inspector. С другой стороны, в режиме выполнения пользователь (программист) имеет возможность не только манипулировать всеми свойствами, отображаемыми в Инспекторе Объектов, но и управлять более обширным их списком, в том числе и свойствами других классов, которые не являются визуальными компонентами и, следовательно, не отображаются в Инспекторе объектов. Все изменения значений свойств компонент в режиме выполнения должны осуществляться путем прямой записи строк кода на языке Паскаль. В режиме выполнения невозможно использовать Object Inspector. Однако, доступ к свойствам компонентов довольно легко получить программным путем. Все, что необходимо сделать для изменения какого-либо свойства – это написать простую строчку кода аналогично следующей: MyComponent.Width := 35; Вышеприведенная строка устанавливает ширину (Width) компонента в значение 35. Если свойство Width компонента еще не было равно 35 к моменту выполнения данной строки программы, можно увидеть как компонент визуально изменит свою ширину. Таким образом, нет ничего магического в Инспекторе Объектов. Object Inspector просто является удобным способом выполнения в режиме проектирования того, что может быть осуществлено программным путем в режиме выполнения. Более того, как уже было сказано выше, у компонента могут быть свойства, не отображаемые в окне Инспектора Объектов. Объектно-ориентированный язык Паскаль, лежащий в основе Delphi, в качестве базового имеет принцип соответствия визуальных компонент тем вещам, которые они представляют. Разработчики Delphi поставили перед собой цель, чтобы, например, представление компонента Button (кнопка), инкапсулирующее некий код, соответствовало визуальному изображению кнопки на экране и являлось как можно более близким эквивалентом реальной кнопки, которую можно найти на клавиатуре. И именно из этого принципа родилось понятие свойства. Если изменить свойства Width и Height компонента Button, кнопка соответствующим образом изменит свои ширину и высоту. При этом нет необходимости после изменения свойства Width указывать объекту, чтобы он перерисовал себя, хотя при обычном программировании именно так и должно поступать. 2.3 Некоторые общие свойства компонентов Рассмотрим некоторые свойства, которыми обладает каждый визуальный компонент, поскольку эти свойства наследуются от базовых классов иерархии библиотеки визуальных компонентов. Класс TComponent является предком всех визуальных компонентов и от него компоненты получают следующие свойства. Таблица 1 Свойства класса TComponent Свойство Назначение Name идентификатор компонента Tag четырехбайтовое целое свойство, которое программист может использовать по своему усмотрению От класса TControl порождаются все видимые визуальные компонента и наследуют свойства, связанные расположением и внешним видом компонента. Эти свойства можно разбить на несколько групп. Таблица 2 Размер и местоположение компонента Свойство Назначение Top местоположение левого верхнего угла компонента по вертикали Left местоположение левого верхнего угла компонента по горизонтали Height высота компонента Width ширина компонента Таблица 3 Выравнивание и масштабирование Свойство Назначение Align выравнивание компонента относительно границ родительского компонента Alignment выравнивание надписи на компоненте Anchors фиксация компонента по сторонам родительского компонента Constraints сложное свойство, определяющее максимально и минимально допустимые размеры компонента AutoSize логическое свойство, разрешающее или запрещающее автоматическое изменение размеров компонента в соответствии с размером его содержимым Таблица 4 Внешний вид Свойство Назначение Color цвет компонента Cursor вид курсора при наведении указателя мыши на компонент Caption надпись на компоненте Font сложное свойство, определяющее тип шрифта надписи Visible логическое свойство, определяющее видимость компонента PopupMenu логическое свойство, разрешающее или запрещающее использование всплывающего меню Enabled логическое свойство, определяющее доступность компонента Hint текст подсказки, которая появляется при задержке курсора мыши на компоненте ShowHint логическое свойство, разрешающее или запрещающее использование подсказки 2.4 События в Delphi Одна из ключевых целей среды визуального программирования – скрыть от пользователя сложность программирования в Windows. При этом, однако, хочется, чтобы такая среда не была бы упрощена до такой степени, что программисты потеряют доступ к самой операционной системе. Программирование, ориентированное на события – неотъемлемая черта Windows. Delphi предоставляет полный доступ к подструктуре событий, совершаемых в операционной среде Windows. С другой стороны, Delphi упрощает программирование обработчиков таких событий. Объекты из библиотеки визуальных компонент (VCL) Delphi, равно как и объекты реального мира, имеют свой набор свойств и свое поведение - набор откликов на события, происходящие с ними. Список событий для данного объекта, на которые он реагирует, можно посмотреть, например, в Инспекторе Объектов на странице событий. (На самом деле, на этой странице представлен список свойств, которые представляют из себя ссылки на процедуры-обработчики событий.) Среди набора событий для различных объектов из VCL есть как события, портируемые из Windows (например, события, которые генерируются мышью или клавиатурой), так и события, порождаемые в результате прогона приложения путем изменения свойств объектов). Поведение объекта определяется тем, какие обработчики и для каких событий он имеет. Создание приложения в Delphi состоит из настройки свойств используемых объектов и создания обработчиков событий. Простейшие события, на которые иногда нужно реагировать - это, например, события, связанные с мышкой (они есть практически у всех видимых объектов) или событие OnClick для кнопки TButton. Все события в Delphi принято предварять префиксом on: onCreate, OnMouseMove, OnPaint и так далее. Щелкнув в Инспекторе объектов на странице Events в поле любого события, можно получить в программе заготовку метода нужного типа. При этом его имя будет состоять из имени текущего компонента и имени события (без префикса On), а относиться он будет к текущей форме. Например, обработчик щелчка левой кнопки мыши на форме будет выглядеть так: procedure TForm1.Button1Click(Sender: TObject); begin end; Поскольку события — это свойства объекта, их значения, можно изменять в любой момент во время выполнения программы. Эта замечательная возможность называется делегированием. Можно в любой момент взять способы реакции на события у одного объекта и присвоить (делегировать) их другому: Object1.OnMouseMove := Object2.OnMouseMove; Принцип делегирования позволяет избежать трудоемкого процесса порождения новых дочерних классов для каждого специфического случая, заменяя его простой подстановкой процедур. Можно при необходимости выбирать один из нескольких возможных вариантов обработчиков событий. 2.5 Некоторые общие события компонентов Для большинства видимых визуальных компонентов, т.е. потомков класса TControl, определен набор обработчиков событий, связанных с мышью. Для выполнения какого-либо действия с помощью щелчка левой кнопки мыши для большинства случаев достаточно запрограммировать обработчик событий OnClick, а для реакции на двойной щелчок используется событие OnDbClick. Для более совершенного управления мышью лучше использовать обработчики следующих событий: • OnMouseDown. Событие вызывается при нажатии любой кнопки мыши. • OnMouseMove. Событие вызывается при перемещении курсора мыши. • OnMouseUp. Событие вызывается при отпускании любой кнопки мыши. Процедуры обработки этих событий получают следующие параметры: • Sender. Параметр представляет объект, который получил это событие (т. е. на каком компоненте щелкнули мышью). • Button. Параметр имеет одно из трех значений: mbRight, mbLeft, mbMiddle и используется для определения кнопки мыши, которую нажал пользователь. • Shift. Множество, которое может содержать следующие элементы: ssShift, ssCtrl, ssAlt, ssLeft, ssRight, ssMiddle, ssDouble. Используется для определения нажатия клавиш , , (или комбинации этих клавиш) в момент щелчка мышью, а также для определения какой кнопкой мыши щелкнул пользователь. • X, Y. Координаты указателя мыши в пикселях относительно клиентской области окна с координатами (0,0) в верхнем левом углу. Необходимо отметить, что событие OnClick возникает после события OnMouseDown, но перед событием OnMouseUp. Событие OnDbClick генерируется после события OnMouseUp. Рассмотрим пример использования обработчиков событий, связанных с мышью. При нажатии правой кнопкой мыши в заголовке формы появляются координаты указателя мыши, при отпускании кнопки мыши заголовок формы очищается. Для этого создадим следующие обработчики procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin If (Button=mbRight) then Caption:=IntToStr(X)+’, ’+IntToStr(Y); end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Caption:=''; end; Визуальные компоненты, которые являются потомками класса TWinControl, кроме обработчиков событий, связанных с мышью, также обладают набором обработчиков событий от клавиатуры. • OnKeyDown Событие возникает при нажатии любой клавиши клавиатуры. • OnKeyUp Событие возникает при отпускании клавиши клавиатуры • OnKeyPress Данное событие генерирует после OnKeyDown, но перед OnKeyUp Процедуры обработки событий OnKeyDown и OnKeyUp получают следующие параметры: • Sender. Параметр представляет объект, который получил это событие (т. е. какой компонент в данный момент имеет фокус ввода). • Key. Параметр целого типа содержит виртуальный код клавиши, т.е. специальной константы, которая определена для каждой клавиши клавиатуры. Для буквенно-цифровых клавиш виртуальный код совпадает с кодом символа. • Shift. Множество, которое может содержать следующие элементы: ssShift, ssCtrl, ssAlt, ssLeft, ssRight, ssMiddle, ssDouble. Используется для определения нажатия клавиш , , (или комбинации этих клавиш), а также для определения какой кнопкой мыши щелкнул пользователь. Для процедуры обработки события OnKeyPress имеется такой набор параметров. • Sender. Параметр представляет объект, который получил это событие (т. е. какой компонент в данный момент имеет фокус ввода). • Key. Параметр символьного типа содержит символ, который получается в результате нажатия клавиш клавиатуры. Таким образом, события OnKeyDown и OnKeyUp перехватывают нажатия большинства клавиш клавиатуры, в то время как событие OnKeyPress позволяет обрабатывать только нажатие буквенно-цифровых клавиш. При этом получаемый символ Key учитывает выбранный язык (раскладку клавиатуры) и нажатую клавишу Shift. Для потомков класса TWinControl определены события OnEnter и OnExit, которые возникают в момент получения (потери) компонентом фокуса ввода. Рассмотрим следующий пример использования событий, связанных с клавиатурой. При нажатии комбинации клавиш Shift+А в заголовке формы пишется ‘Ok’. Этого эффекта можно достигнуть двумя способами. Первый способ состоит в создании следующего обработчика procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin If (Shift=[ssShift]) and (Key=Ord(‘A’)) then Caption:=’Ok’; end; Другой способ заключается в использовании события OnKeyPress. procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin If key='A' then Caption:='Оk'; end; Однако необходимо заметить, что этот обработчик будет срабатывать только, если выбран английский язык и отключена клавиша Caps Lock, поскольку только в этом случае возможно получить символ А путем нажатия комбинации Shift+А. 2.6 Контрольные вопросы 1. Какие события используются для управления курсором мыши? 2. Каким образом можно получить координаты курсора мыши на форме? 3. Как можно определить какая именно клавиша мыши была нажата? 4. Какие события используются для получения комбинации нажатых или отпущенных клавиш? 5. Какое событие позволяет определить нажатый символ? 6. Какие свойства общие для всех компонентов? 7. Какие визуальные компоненты называют невидимыми? 8. Какие свойства компонента отвечают за его местоположение на форме? 9. Каким образом можно изменять свойства компонентов? 3. Класс TForm 3.1 Роль формы в приложении Классическое приложение Windows обязательно имеет хотя бы одно окно, при этом окно приложения должно уметь выполнять целый ряд важных операций: правильно отображать себя на экране, уметь взаимодействовать с другими окнами и операционной системой, управлять размещенными на нем элементами управления, реагировать на разнообразные события. В среде разработки Delphi понятие окна приложения совмещено с понятием формы. Формой называется окно приложения на этапе разработки. На этапе разработки окно должно обладать целым рядом ценных свойств, которые обеспечивают процесс программирования и обязаны исчезнуть при запуске приложения. Самые важные из них заключаются в том, что форма умеет взаимодействовать с инструментами среды разработки (Палитрой компонентов, Инспектором объектов и т. д.) и размещенными на ней компонентами. Первое из названных свойств обеспечивается возможностями, унаследованными от базового класса иерархии VCL TComponent. Второе свойство обеспечено механизмами самого класса формы. Кроме этого, форма обеспечивает еще целый ряд удобных и полезных для разработчика функций. Это разметка рабочей области, возможность выравнивания компонентов и т. д. Для хранения каждой формы проекта используются два файла. Файл с расширением dfm хранит описание свойств формы и размещенных на ней компонентов. Для хранения исходного кода класса формы и ее компонентов предназначен файл модуля с расширением раs. Формы играют исключительно важную роль в процессе создания приложения. Они обеспечивают создание пользовательского интерфейса с одной стороны, и хранение программной логики приложения — с другой. Хотя форма и является потомком класса TComponent, она не присутствует в Палитре компонентов. Для создания новой формы проекта необходимо использовать команду File / New Form из главного меню среды. С точки зрения исходного кода, любой размещенный на форме компонент представляет собой всего лишь новую переменную объектного типа, объявленную в классе формы. Это объявление осуществляется автоматически в момент размещения компонента на форме. В результате в модуле этой формы сразу же становятся доступными все свойства и методы этих компонентов. Форма, на которой находится компонент, становится его владельцем. Форма, как владелец размещенных на ней компонентов, позволяет эффективно управлять ими на этапе выполнения приложения. Для этого класс формы имеет ряд свойств и методов, которые позволяют получить доступ к любому компоненту. Например, программными средствами можно передавать фокус ввода от одного элемента управления другому; выполнять для всех компонентов или их любого подмножества заданную последовательность действий. В зависимости от настроек свойств, формы в проекте могут играть разные роли. Форма может быть главной формой проекта. Для этого необходимо, чтобы форма в файле проекта создавалась первой. В этом случае она автоматически появляется при запуске приложения, а ее закрытие приводит к завершению работы всей программы, остальные формы в проекте являются дочерними. Дочерние формы равноправны между собой. Их можно запускать в модальном и в немодальном режиме. Форма в модальном режиме не позволяет передавать фокус управления элементам управления других форм приложения. Это можно сделать только после закрытия формы. Свободное переключение возможно между формами, работающими в немодальном режиме. Также формы в приложении различаются по стилю оформления. Это может быть классическое окно с заголовком, рамкой, системными меню и кнопками или диалог и т. д. Методы-обработчики формы также играют важную роль при создании приложений. Практика программирования показывает, что практически в каждой форме имеются операции, которые необходимо выполнять при создании, открытии формы и ее закрытии и т.д. 3.2 Свойства класса TForm Одним из предков класса TForm является класс TWinControl, поэтому все свойства этого класса наследуются формой. Приведем свойства, которые являются специфическими для формы. Таблица 5Свойства TForm Свойство Назначение FormStyle перечислимое свойство, которое определяет тип окна FsNormal обычное окно FsStayOnTop окно, остающееся поверх других даже в неактивном состоянии BorderIcons сложное свойство, определяющее набор кнопок в заголовке окна. Кнопка закрытия не описана, так как она присутствует всегда при наличии у формы заголовка. biSystemMenu для вызова системного меню biMinimize для сворачивания окна biMaximize для разворачивания окна biHelp для вызова помощи BorderStyle перечислимое свойство, которое задает тип границы окна bsNone Форма представляет собой прямоугольник без рамки, заголовка и системных кнопок в заголовке. Размеры такой формы нельзя изменить без специальных приемов bsSingle Стандартное окно без возможности изменения размеров. Набор системных кнопок зависит от свойства BorderIcons bsSizeable Значение по умолчанию. Стандартная форма с возможностью изменения размеров. Набор системных кнопок зависит от свойства BorderIcons bsDialog Обрамление стандартного диалогового окна. В наборе системных кнопок отсутствуют biSystemMenu, biMinimize и biMaximize bsToolWindow Обрамление панели инструментов. Идентично стилю bssingle, но с уменьшенной высотой заголовка и системными элементами bsSizeToolWin Обрамление панели инструментов. Идентично стилю bsSizeable, но с уменьшенной высотой заголовка и системными элементами WindowState Перечислимое свойство, определяющее состояние окна wsNormal нормальное состояние wsMinimized свернутое состояние wsMaximized развернутое состояние Icon свойство задает значок, с помощью которым которого форма в свернутом состоянии отображается на панели задач Menu свойство определяет текущее главное меню для формы PopupMenu свойство определяет текущее всплывающее меню для формы Position свойство задает размеры и положение формы на экране при работе приложения poDesigned Принять те значения положения и размеров, которые были определены во время разработки приложения poDefault Принять положение и размеры, определенные средой Windows по умолчанию poDefaultPosOnly Принять только положение, определенное средой Windows по умолчанию poDefaultSizeOnly Принять только размеры, определенные средой Windows пo умолчанию poScreenCenter Поместить окно по центру экрана. В случае наличия нескольких мониторов в системе, форма размещается в центре монитора по умолчанию poDesktopCenter Поместить окно по центру рабочего стола (в том числе составленного из нескольких мониторов) poMainFormCenter Поместить окно по центру главной формы приложения poOwnerFormCenter Поместить окно по центру формы владельца HorzScrollBar VertScrollBar сложные свойства, определяющие внешний вид полос прокрутки (горизонтального и вертикального) AutoScroll автоматическое размещение полос прокрутки на форме 3.3 События формы При создании и отображении формы происходят пять следующих событий Таблица 6 Cобытия TForm при создании и отображении формы Событие Назначение OnCreate Возникает при создании окна, но до его появления на экране. Позволяет распределить ресурсы и провести необходимую инициализацию компонентов и форм. OnShow Возникает при появлении окна на экране. К этому времени все компоненты и формы созданы и инициализированы OnResize Возникает при изменении размеров окна OnActivate Возникает в момент активизации окна (при получении фокуса ввода) OnPaint Возникает при необходимости прорисовки окна Событие OnCreate происходит один раз за все время существования формы, прочие события могут вызываться неоднократно. При закрытии и уничтожении формы также генерируются пять событий. Таблица 7 Cобытия TForm при закрытии и уничтожении формы Событие Назначение OnCloseQuery Возникает перед закрытием окна, в ответ на действия, закрывающие окно. Обработчик получает логическую переменную CanClose, определяющую может ли форма быть закрыта. OnClose Возникает перед закрытием окна. Параметр Action уточняет необходимые действия: саNоnе – не закрывать окно; caHide – спрятать окно; caFree – уничтожить окно; caMimimize – минимизировать окно OnDeactivate Возникает при передаче активности другому окну той же программы OnHide Возникает перед исчезновением окна OnDestroy Возникает перед уничтожением окна. Обычно используется для освобождения ресурсов, выделенных в OnCreate. Кроме этих событий, для формы определены события от мыши и клавиатуры, которые класс TForm наследует от своих предков. 3.4 Пример использования событий формы Рассмотрим фрагмент кода, который восстанавливает размеры и положение формы (свойства Top, Left, Width, Height, Caption), сохраненные в файл при предыдущем закрытии. Для этого создадим обработчик события OnCreate, в котором необходимые свойства формы инициализируются значениями из файла. procedure TForm1.FormCreate(Sender: TObject); var f: TextFile; begin AssignFile(f, ‘myfile.txt’); If FileExists(f) then begin Readln(f, IntToStr(Top)); Readln(f, IntToStr(Left)); Readln(f, IntToStr(Width)); Readln(f, IntToStr(Height)); Readln(f, Caption); end; end; При попытке закрытия формы, т.е. при генерации события OnCloseQuery, создается диалоговое окно для подтверждения закрытия окна. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin If MessageDlg('Exit now?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then CanClose:=True else CanClose:=False; end; end; В обработке события закрытия формы OnClose значения необходимых свойств записываются в файл. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var f: TextFile; begin AssignFile(f, ‘myfile.txt’); WriteLn(f, IntToStr(Top)); WriteLn(f, IntToStr(Left)); WriteLn(f, IntToStr(Width)); WriteLn(f, IntToStr(Height)); WriteLn(f, Caption); end; 3.5 Контрольные вопросы 1. Какова роль формы в приложении? 2. Какую форму называют главной? дочерней? 3. В каком свойстве содержится заголовок формы? 4. Назовите возможные значения свойства BorderStyle класса TForm. Поясните их смысл. 5. Для чего используется свойство BorderIcons класса TForm? 6. На что влияет свойство Formstyle класса TForm? 4. Графические возможности визуальных компонентов Большое внимание в Delphi уделено возможностям работы с деловой графикой: простота и удобство ее использования напрямую сказываются на простоте и удобстве созданных приложений. Вместо сложного графического интерфейса Windows разработчик имеет возможность использовать несколько графических инструментов для создания графических изображений. Такими инструментами являются шрифт, перо и кисть (классы TFont, TPen, TBrush), назначением которых является удобный доступ к свойствам инструментов и прозрачная для пользователя обработка всех их изменений.. Эти классы не используются самостоятельно, а являются составными частями класса TCanvas. Класс TCanvas входит в качестве свойства Canvas во многие визуальные компоненты, которые должны уметь нарисовать себя и отобразить какую-либо графическую информацию, при этом свойство Canvas определяет область, куда выводится графическая информация. 4.1 Свойства класса TCanvas Основными свойствами класса TCanvas являются Font, Pen, Brush. Типы этих свойств – классы TFont, TPen, TBrush соответственно. Класс TFont инкапсулирует шрифт Windows. В Delphi допускаются только горизонтально расположенные шрифты. В конструкторе объекта по умолчанию принимается шрифт System цвета clWindowText и размером 10 пунктов. Приведем некоторые свойства этого класса. Таблица 8 Класс TFont Свойство Назначение Name Содержит имя (начертание) шрифта, например, Arial Style Содержит стиль (особенности начертания) шрифта fsBold жирный fsItalic курсив fsUnderline подчеркнутый fsStrikeOut перечеркнутый Color Определяет цвет шрифта Charset Содержит номер набора символов шрифта. По умолчанию равно 1 (default_charset). Для вывода символов кириллицы требуется RUSSIAN_CHARSET Height Содержит значение высоты шрифта в пикселах Класс ТРеn инкапсулирует свойства пера стандартного графического интерфейса Windows. В конструкторе по умолчанию создается непрерывное (pssolid) черное перо шириной в один пиксел. Свойства этого класса приведены ниже. Таблица 9 Класс ТРеn Свойство Назначение Color Определяет цвет пера Style Определяет стиль линии, рисуемой пером. psSolid сплошная линия psDash пунктирная линия psDot точечная линия psDashDot точечно-пунктирная линия psDashDotDot точечно-пунктирная линия psClear прозрачная линия psInsideFrame Width Содержит значение толщины пера в пикселах Пунктирные и штрихпунктирные линии (стили psDash, psDot, psDashDot, psDashDotDot) могут быть установлены только для линий единичной толщины. Более толстые линии должны быть сплошными — такое ограничение существует в Windows. Класс TBrush инкапсулирует свойства кисти — инструмента для заливки областей. Когда создается экземпляр этого класса, первоначально создается белая сплошная кисть. Приведем свойства этого класса. Таблица 10 Класс TBrush Свойство Назначение Color Определяет цвет кисти Style Определяет стиль кисти (фактура закраски) bsSolid сплошная заливка bsClear прозрачная заливка bsHorizontal горизонтальная штриховка bsVertical вертикальная штриховка bsFDiagonal диагональная штриховка с наклоном вправо bsBDiagonal диагональная штриховка с наклоном влево bsCross перекрещенная штриховка bsDiagCross диагональная перекрещенная штриховка Для поточечного рисования можно получить доступ к каждому пикселу, используя значение свойства Pixels[X, Y: Integer], которое соответствует цвету точки с координатами X, Y. Необходимость рисовать отдельную точку возникает нередко, но если нужно модифицировать все или хотя бы многие точки изображения, свойство pixels надо сразу отбросить — настолько оно неэффективно. 4.2 Методы класса TCanvas Канва содержит методы-надстройки над всеми основными функциями рисования GDI Windows и свойства, которые приведены ниже в табл. 8.4. При их рассмотрении имейте в виду, что все геометрические фигуры рисуются текущим пером. Те из них, которые можно закрашивать, закрашиваются с помощью текущей кисти. Кисть и перо при этом имеют текущий цвет. Таблица 11 Методы TCanvas procedure Arc (XI, Y1, Х2, Y2, Х3, Y3, Х4, Y4: integer); Метод рисует сегмент эллипса. Эллипс определяется описывающим прямоугольником (Х1, Y1) — (Х2, Y2); его размеры должны лежать в диапазоне от 2 до 32767 точек. Начальная точка сегмента лежит на пересечении эллипса и луча, проведенного из его центра через точку (ХЗ, Y3). Конечная точка сегмента лежит на пересечении эллипса и луча, проведенного из его центра через точку (Х4, Y4). Сегмент рисуется против часовой стрелки. procedure Chord (XI, Y1, Х2, Y2, ХЗ, Y3, Х4, Y4 : Integer); Рисует хорду и заливает отсекаемую ею часть эллипса. Эллипс, начальная и конечная точки хорды определяются как в методе Arc procedure Ellipse (XI, Y1, Х2, Y2: Integer); Рисует и закрашивает эллипс, вписанный в прямоугольник (Х1, Y1) – (Х2, Y2) procedure LineTo(X, Y: Integer); Проводит линию текущим пером из текущей точки в (X, Y) procedure MoveTo(X, Y: Integer); Перемещает текущее положение пера (свойство PenPos) в точку (X, Y) procedure FillRect(const Rect: TRect) ; Производит заливку прямоугольника (текущей кистью) procedure Pie(XI, Yl, X2, Y2, X3, Y3, X4, Y4: Integer); Рисует сектор эллипса, описываемого прямоугольником (Х1, Y1) — (X2, Y2). Стороны сектора лежат на лучах, проходящих из центра эллипса через точки (X3, Y3) и (X4, Y4) procedure Polygon(const Points: array of TPoint); Строит многоугольник, используя массив координат точек Points. При этом последняя точка соединяется с первой и внутренняя область закрашивается procedure Polyline(const Points: array of TPoint); Строит ломаную линию, используя массив координат точек Points procedure Rectangle(X1, Y1,X2, Y2: Integers); Рисует прямоугольник с верхним левым углом в (Х1, Y1) и нижним правым в (X2, Y2) Procedure RoundRect(XI, Yl, X2, Y2, X3, Y3: Integers); Рисует прямоугольник с закругленными углами. Координаты вершин — те же, что и в методе Rectangle. Закругления рисуются как сегменты эллипса с размерами осей по горизонтали и вертикали X3 и Y3 procedure TextOut(X, Y; Integer; const Text: string); Производит вывод строки Text. Левый верхний угол помещается в точку канвы (X, Y) Предусмотрено два события для пользовательской реакции на изменение канвы: OnChange и OnСhanging. Эти события возникают при изменениях свойств и вызовах методов TCanvas, меняющих вид канвы (то есть, при любом рисовании; в методе MoveTo, например, они не возникают). Отличие их в том, что событие onChanging вызывается до начала изменений, а событие OnChange — после их завершения. 4.3 Примеры использования свойств и методов класса TCanvas Заполнение формы разноцветными точками. procedure TForm1.FormPaint(Sender: TObject); var i,j: integer; begin for i:=0 to Width-1 do for j:=0 to Height-1 do Canvas.Pixels[i,j]:=i*j; end; Рисование отрезка с координатами начала и конца (10, 10) и (20, 20) толстой сплошной линией красного цвета. begin Canvas.Pen.Color:=clRed; Canvas.Pen.Width:=10; Canvas.MoveTo(10,10); Canvas.LineTo(20,20); end; Рисование прямоугольника с координатами (20,30) и (80,100) синей пунктирной линией с заливкой красного цвета. begin Canvas.Pen.Color:=clBlue; Canvas.Pen.Width:=1; Canvas.Pen.Style:=psDash; Canvas.Brush.Color:=clRed; Canvas.Rectangle( 20,30,80,100); end; Рисование окружности с центром в (100, 100) и радиусом 50 белой точечной линией со штрихованной заливкой синего цвета. with Canvas do begin pen.Color:=clWhite; Pen.Width:=1; Pen.Style:=psDot; Brush.Color:=clBlue; Brush.Style:=bsCross; Ellipse(100-50,100-50,100+50,100+50); end; Рисование замкнутой ломаной линии (пятиугольной звезды) Canvas.Pen.Color := clWhite; Canvas.Polyline([Point(40, 10), Point(20, 60), Point(70, 30), Point(10, 30), Point(60, 60), Point(40, 10)]); Рисование верхней четверти окружности (эллипса) Canvas.Arc(10, 10, 100, 100, 100, 10, 10, 10); 5. Использование визуальных компонентов Визуальные компоненты представляют собой элементы, из которых конструируется интерфейс работающего приложения. Однако существует значительное количество компонентов, которые не создают видимого изображения, но тем не менее играют важную роль в программной реализации приложения. Правильнее думать о компонентах как о заранее приготовленных фрагментах программы, которые можно вставлять, если в этом есть необходимость, в разрабатываемую программу. В этом разделе приводится начальный обзор компонентов, который дает самое общее представление о богатстве возможностей Delphi. Библиотеки компонентов для разных версий Delphi строятся по принципу расширения: в первой версии было около 70 компонентов, в то время как в состав Delphi 6 входит более 300 компонентов. Ниже компоненты группируются по функциональному признаку, приводятся их краткие описания. 5.1 Метки Метки предназначены для размещения на форме различного рода текстовых надписей. Для этого служит центральное свойство компонента – Caption. С помощью свойства Font можно разнообразить вид надписи. С меткой может быть связан оконный управляющий элемент, который выбирается при нажатии Alt+Буква, где Буква - выделенная подчеркиванием буква в тексте метки (такие символы в терминологии Windows называются акселераторами). Визуальные компоненты TLabel (закладка Standart на Палитре компонентов) и TStaticText (закладка Additional) являются примерами меток. Класс TLabel является потомком класса TControl и обладает всеми свойствами этого класса. В отличие от TLabel класс TStaticText в качестве предка имеет класс TWinControl. Приведем характерные свойства метки, которые совпадают для обоих классов. Таблица 12 свойства TLabel и TStaticText Transparent Логическое свойство, определяющее прозрачность фона метки. Если False, фон закрашивается собственным цветом Color, в противном случае используется фон родительского компонента Wordwrap Логическое свойство, разрешающее (запрещающее) разрыв строки на границе слова. FocusControl Содержит имя оконного компонента, который связан с меткой-акселератором ShowAccelChar Если содержит True, то символ & в тексте метки предшествует символу-акселератору Layout Определяет выравнивание текста по вертикали относительно границ метки: tlTop – текст располагается вверху; tlCenter – текст центрируется по вертикали; tlBottom – текст располагается внизу Для TStaticText определено свойство BorderStyle, которое определяет тип границ компонента: sbsNone– нет границы, sbsSingle – границы толщиной в один пиксел, sbsSunken – дает эффект вдавленности компонента. 5.2 Кнопки Кнопки широко используются в Windows для управления приложениями. Управлять кнопками можно с помощью щелчка мыши, с клавиатуры или программно. Визуально и функционально компонент кнопка напоминает кнопку клавиатуры. В Delphi имеется несколько разновидностей кнопок: обычные кнопки, кнопки с изображением, быстрые кнопки, т.е. классы TButton (закладка Standart), TBitBtn (закладка Addittional), TSpeedButton (закладка Additional). Все они являются потомками класса TWinControl. Рассмотрим специфические свойства визуального компонента TButton. Таблица 13 специфические свойства TButton Cancel Если имеет значение True, событие OnClick кнопки возникает при нажатии клавиши Esc Default Если имеет значение True, событие OnClick кнопки возникает при нажатии клавиши Enter ModalResult Определяет результат, с которым было закрыто модальное окно В терминологии Windows модальными окнами называются такие специальные окна, которые, появившись на экране, блокируют работу пользователя с другими окнами вплоть до своего закрытия. Обычно с их помощью реализуется диалог, требующий от пользователя принятия некоторого решения. Для этого в состав модального окна включается несколько кнопок. Если у кнопки определено свойство ModalResult, нажатие на нее приводит к закрытию модального окна и возвращает в программу значение ModalResult как результат диалога с пользователем. В Delphi определены следующие стандартные значения ModalResult: mrNone – модальное окно не закрывается, mrIgnore – нажата кнопка Ignore, mrOk – нажата кнопка Oк, mrYes – нажата кнопка Yes, mrCancel – нажата кнопка Cancel, mrNo – нажата кнопка No, mrAbort – нажата кнопка Abort, mrAll – нажата кнопка All, mrRetry – нажата кнопка Retry. В отличие от большинства других видимых компонентов кнопка TButton является компонентом операционной системы Windows и поэтому не может изменять свой цвет произвольным образом – изменение цвета кнопки происходит вместе с изменением палитры Windows. Кнопка всегда имеет системный цвет clBtnFace и не имеет свойства Color. Шрифт надписи на кнопке может менять свой стиль и размер, но компонент игнорирует изменение цвета надписи. В качестве примера использования кнопки приведем обработчик события OnClick, где в метку отображается количество нажатий на кнопку procedure TForm1.Button1Click(Sender: TObject); Var i:Integer; Begin i:= StrToInt (Label2.Caption); Label1.Caption:= IntToStr (i+1); end; Пиктографическая кнопка TBitBtn представляет собой популярную разновидность стандартной кнопки TButton. Ее отличительная особенность – свойство Glyph, с помощью которого определяется растровое изображение, рисуемое на поверхности кнопки. Свойство Kind определяет одну из 11 стандартных разновидностей кнопки, показанных на рисунке. Нажатие любой из них, кроме bkCustom и bkHelp, закрывает модальное окно и возвращает в программу результат mrxxx: bkOk – mrОk, bkCancel – mrCancel и т. д. Кнопка bkClose для модального окна возвращает mrCancel, а для главного окна программы - закрывает его и завершает работу программы. Кнопка bkHelp автоматически вызывает раздел справочной службы, связанный с HelpContext формы, на которую она помещена. Если у кнопки была изменена пиктограмма Glyph, Delphi автоматически установит свойство Kind равным bkCustom. Это произойдет также в случае, когда кнопка указана как умалчиваемая (Default=True), но Kind не содержит bkОk или bkYes, а также если ее свойство Cancel содержит True, a Kind нe содержит bkCancel или bkNo. Свойства Cancel, Default и ModalResult кнопка TBitBtn унаследовала у своего родительского класса TButton. С помощью свойства Default кнопку можно сделать умалчиваемой – в этом случае нажатие Enter автоматически вызывает обработчик ее события OnClick. Однако умалчиваемыми можно сделать только кнопки bkYes и bkNo, остальные значения свойства Kind будут заменяться на bkСustom при размещении в Default значения True и наоборот – в Default автоматически помещается False при установке в Kind любого значения, кроме bkYes, bkNo или bkСustom. Специфичные свойства кнопки с изображением указаны ниже: Таблица 14 Специфичные свойства TBitBtn Glyph Определяет от 1 до 4 связанных с кнопкой растровых изображения Kind Определяет разновидность кнопки Layout Определяет край кнопки, к которому прижимается пиктограмма: blGlyphLeft – к левому; blGlyphRight – к правому; blGlyphTop – к верхнему; blGlyphBottom – к нижнему) Цвет поверхности кнопки с изображением не может изменяться программно, но в отличие от TButton можно менять цвет надписи на кнопке. Кнопки TSpeedButton отличаются от TBitBtn тремя обстоятельствами: во-первых, они могут фиксироваться в утопленном состоянии, во-вторых, они не могут закрыть модальное окно и в третьих, они не могут быть умалчиваемыми. Во всем остальном они повторяют свойства и методы TBitBtn. Для фиксации кнопка должна быть отнесена к какой-либо группе кнопок (эта группа может состоять из нее одной – вариант одиночной фиксируемой кнопки). Для этого используется свойство GroupIndex целого типа, которое не должно быть равно 0. Поведение кнопки определяется логическим свойством AllowAllup: если это свойство имеет значение True, утопленная кнопка отпускается только при нажатии любой другой кнопки, входящей в ту же группу; если AllowAllup равно False, то кнопку можно освободить повторным щелчком. Индикатором состояния кнопки служит логическое свойство Down, которое имеет значение True, если кнопка утоплена. Свойство доступно для записи, что позволяет изменять состояние кнопки программно. Для кнопки TSpeedButton предусмотрено событие onDbkClick, которое возникает при двойном щелчке на утопленной кнопке. 5.3 Редактируемые компоненты Часто бывает необходимо не только показать статический (неизменяемый) текст на форме, но и редактировать (вводить с клавиатуры) нужную информацию. Для этой цели разработан ряд редактируемых визуальных компонентов. Примерами редактируемых компонентов являются TEdit (закладка Standart), TMemo (закладка Standart), TMaskEdit (закладка Additional). Все эти компоненты имеют общего предка – класс TWinControl. Компонент класса TEdit представляет собой однострочный редактор текста. С его помощью можно вводить и/или отображать отдельную текстовую строку. Компоненты класса TMemo используются для ввода, редактирования и/или отображения достаточно длинного текста, который может располагаться на нескольких строках. Следующие свойства являются общими для всех редактируемых компонентов. Таблица 15 Свойства редактируемых компонентов Text Содержит редактируемую строку (для TEdit) или редактируемый текст в виде одной строки (для TMemo) ReadOnly Логическое свойство, разрешающее или запрещающее редактирование текста в компоненте MaxLength Определяет максимально допустимую длины текста в символах. Если имеет значение 0, длина строки не ограничена. HideSelection Если содержит False, выделение текста сохраняется при потере компонентом фокуса ввода Для однострочного редактора существует ряд специфичных свойств и методов. Приведем некоторые из них. Таблица 16 Свойства однострочного редактора AutoSelect: Указывает, будет ли выделяться весь текст в момент получения компонентом фокуса ввода CharCase Определяет автоматическое преобразование высоты букв: ecNormal – нет преобразования; ecUpperCase –- все буквы заглавные; ecLowerCase – все буквы строчные. Правильно работает с кириллицей PasswordChar Если символ PasswordChar определен, он заменяет собой любой символ текста при отображении в окне. Используется для ввода паролей SelLength Содержит длину выделенной части текста SelStart Содержит номер первого символа выделенной части текста SelText Содержит выделенную часть текста Для работы с однострочным редактором можно использовать методы компонента. Таблица 17 Методы однострочного редактора Сlears Удаляет весь текст ClearSelection Удаляет выделенный текст SelectAll Выделяет весь текст Undo Восстанавливает текст в том виде, в каком он был перед последним получением компонентом фокуса ввода В компоненте TMemo текст хранится в свойстве Lines класса TStrings и, таким образом, представляет собой пронумерованный набор строк (нумерация начинается с нуля). С помощью свойств и методов класса TStrings (Count, Add, Delete, Clear и т. д.) можно динамически формировать содержимое компонента. Для загрузки в компонент текста из файла и для сохранения текста в файле удобно использовать методы LoadFromFile и SaveToFile класса TStrings. Например, следующий обработчик события OnCreatе формы Form1 загружает в Memo1 текст проектного файла программы: procedure TForm1.FormCreate(Sender: TObject); begin Memol.Lines.LoadFromFile(ChangeFileExt(Application.ExeName,'.dpr')) end; Специализированный редактор TMaskEdit предназначен для ввода текста, соответствующего некоторому шаблону, задаваемому свойством EditMask: String. Если это свойство не задано, TMaskEdit работает как обычный редактор TEdit. Свойство IsMasked: Boolean доступно только для чтения и содержит True, если строка шаблона задана. Свойство EditText: string содержит текст до наложения на него маски шаблона (т. е. то, что ввел пользователь), а свойство Text: String может (в зависимости от шаблона см. ниже) содержать либо исходный текст, либо результат наложения на него маски шаблона. Для всех редактируемых компонентов определено событие OnChange, которое генерируется при изменении содержимого компонента. Для примера приведем обработчик события OnChange, в котором изменяется надпись при наборе текста в строке редактирования. procedure TForm1.Edit1Change(Sender: TObject); begin Label1.Caption:='Идет ввод текста'; end; 5.4 Списки выбора Списки выбора являются удобными интерфейсными элементами Windows, с помощью которых пользователь может выбрать один или несколько элементов выбора. На закладке Standart имеются два компонента, которые служат примерами списков выбора: TListBox (обычный список выбора) и TComboBox (раскрывающийся список выбора). Оба эти компонента имеют общего предка TWinControl. Рассмотрим свойства компонента TListBox. Таблица 18 Свойства компонента TListBox AutoComplete Логическое свойство, которое определяет, будет ли компонент автоматически получать фокус ввода при нажатии пользователем на клавиатуру. BorderStyle Перечислимое свойство определяет стиль рамки: bsNone – нет рамки; bsSingle – рамка толщиной в один пиксел. Canvas Канва для программной прорисовки элементов. Columns Определяет количество колонок элементов в списке. ItemIndex Содержит индекс сфокусированного элемента. Если свойство MultiSelect равно False, то Itemlndex совпадает с индексом выделенного элемента Items Содержит набор строк, показываемых в компоненте MultiSelect Логическое свойство, разрешающее (отменяющее) возможность выбора нескольких элементов SelCount Содержит количество выбранных элементов Selected[X: Integer] Индексированное свойство, которое содержит признак выбора (True/False) для элемента с индексом Х (первый элемент имеет индекс 0) Sorted Логическое свойство, которое разрешает/отменяет сортировку строк в алфавитном порядке Style Перечислимое свойство, которое определяет способ прорисовки элементов в компоненте: lbStandard – элементы рисует Windows; lbOwnerDrawFixed, lbOwnerDrawVariable – прорисовка элементов осуществляется программно. TopIndex: Integer Индекс первого видимого в окне элемента Создание элементов (опций) списка компонента реализуется с помощью методов свойства Items (типа TStrings) – Add, Append, Insert или LoadFromFile. Для примера рассмотрим процедуру переноса выбранных строк из одного списка в другой. procedure TForm1.BitBtn1Click(Sender: TObject); var i: integer; begin for i:=0 to ListBox1.Items.Count-1 do If ListBox1.Selected[i] then ListBox2.Items.Add(ListBox1.Items[i]); end; Комбинированный список TComboBox представляет собой комбинацию списка TListBox и редактора TEdit, и поэтому большинство его свойств и методов заимствованы у этих компонентов. Существуют пять модификаций компонента, определяемые его свойством Style: csSimple, csDropDown, csDropDownList, csOwnerDrawFixed и csOwnerDrawVariabie. В первом случае список всегда раскрыт, в остальных он раскрывается после нажатия кнопки справа от редактора. В модификации csDropDownList редактор работает в режиме отображения выбора и его нельзя использовать для ввода новой строки (в других модификациях это возможно). Модификации csOwnerDrawFixed и csOwnerDrawVariable используются для программной прорисовки элементов списка. Собственными у компонента являются лишь свойства и события, связанные с раскрытием списка. Таблица 19 Свойства и события TComboBox, связанные с раскрытием списка DropDownCount Определяет количество элементов списка, появление которых еще не приводит к необходимости прокрутки списка По умолчанию это свойство имеет значение 8: если в списке указано 9 и более элементов (т. е. больше, чем содержит DropDownCount), при его раскрытии к окну будет добавлена полоса прокрутки. DroppedDown Определяет, раскрыт ли в данный момент список. Это свойство доступно также для записи, что позволяет программно управлять состоянием списка. Событие OnDropDown происходит при изменении состояния списка. 5.5 Меню Визуальный компонент класса TMainMenu определяет главное меню формы, которое может быть только у формы. На форму можно поместить сколько угодно объектов этого класса, но отображаться в полосе меню в верхней части формы будет только тот из них, который указан в свойстве Menu формы. После установки компонента на форму необходимо создать его опции. Для этого следует дважды щелкнуть по компоненту левой кнопкой мыши, либо нажать на нем правую кнопку и выбрать команду Menu Designer в появившемся вспомогательном меню. Процесс создание опций меню имеет интуитивно понятный интерфейс. Перейдите в окно Инспектора объектов и введите текст опции в строке caption, после чего нажмите Enter – опция готова, и можно переходить к следующей. Каждая опция главного меню может раскрываться в список подопций или содержать конечную команду. Для создания подопций щелкните мышью по строке ниже опции и введите первую подопцию. Продолжайте ввод, пока не будет создан весь список подопций, после чего щелкните по пустому прямоугольнику справа от первой опции и введите вторую опцию. В названиях опций можно указать символ “&” перед тем символом, который определит клавишу быстрого выбора опции (в терминологии Windows такие клавиши называются акселераторами). Например, на рисунке показана опция Файл, которую можно выбрать сочетанием клавиш Alt+Ф. При создании меню эта опция в строке Сaption в Инспекторе объектов содержала текст &Файл. При желании можно вставить разделительную черту, отделяющую группы подопций. Для этого необходимо назвать очередной элемент меню именем “–”. Для создания разветвленных меню, т. е. таких, у которых подопций вызывают новые списки подопций, щелкните по подопций и нажмите Ctrl+вправо, где вправо – клавиша смещения курсора вправо. Такого же эффекта можно добиться после щелчка правой кнопкой мыши на подопций и выборе продолжения Сreate Submenu. На рисунке показан пример разветвленной структуры меню. Таблица 20Свойства компонента TMainMenu AutoHotkeys Перечислимое свойство, определяющее будет ли следить программа за уникальностью клавиш быстрого выбора для всех опций меню: maAutomatic – автоматически при создании опции; maManual – с помощью вызова специального метода; maРarent – по правилу, установленному для опции верхнего уровня Images Содержит ссылку на объект – хранилище изображений, которые могут появляться около индивидуальных элементов (пунктов) в меню Items Открывает индексированный доступ к опциям меню Каждый элемент меню является объектом класса TMenuItem. Свойства этого класса описаны в следующей таблице. Термин “родительская опция” означает опцию, выбор которой приводит к раскрытию подменю с данной опцией. Таблица 21 Свойства TMenuItem AutoCheck Логическое свойство, которое определяет, будет или нет автоматически изменяться свойство Сhecked при выборе опции меню AutoHotkeys Определяет, будет ли следить программа за уникальностью клавиш быстрого выбора для подопций: maAutomatic – автоматически при создании подопции; maManual – с помощью вызова специального метода; maParent – по правилу, установленному для опции верхнего уровня Bitmap Содержит ссылку на связанное с опцией изображение. Это изображение (если оно есть) появляется слева от опции. Свойство игнорируется, если установлено свойство ImageIndex (см. ниже) Break Перечислимое, которое позволяет создать многоколончатый список подменю (см.ниже) Checked Если свойство содержит True, рядом с опцией появляется галочка Count Содержит количество опций в подчиненном меню, связанном с данным элементом (только для чтения) ImageIndex Содержит индекс связанного с опцией изображения из компонента TImageList. Это изображение (если оно есть) появляется слева от опции. Если свойство имеет значение -1, с опцией не связано никакого изображения из TImageList Items[Index: Integer] Позволяет обратиться к любой опции подчиненного меню по ее индексу Shortcut Задает клавиши-акселераторы для быстрого выбора данной опции В Delphi 4 (5 и 6) появилась возможность связывать с опциями меню небольшие изображения. Эти изображения можно задать либо свойством BitMap, либо свойством ImageIndex. В последнем случае предполагается, что для меню в целом определено свойство Images. Изображение показывается слева от опции. Например, на рисунке показан фрагмент главного меню Delphi с раскрытой опцией File. Как видим, опции Open, Оpen Project, Save и т. д. снабжены небольшими пиктограммами. Введение пиктограмм в меню повышает наглядность Свойство Break по умолчанию имеет значение mbNone. Два других возможных значения этого свойства используются для создания многоколончатых списков подменю. Значение mbBarBreak заканчивает предыдущую колонку и начинает новую. Эта опция меню будет открывать новую колонку, которая отделяется от предыдущей вертикальной чертой. Значение mbBreak также создает новую колонку, но не вставляет разделительную черту. Эти значения игнорируются в опциях самого первого уровня. В окне конструктора многоколончатое меню отображается как обычное. Для элемента меню определено единственное событие OnClick, которое возникает при щелчке на опции или при нажатии Enter, если в этот момент данная опция была выбрана (подсвечена). Обработчик события становится доступен после двойного щелчка на опции в окне конструктора меню. Компоненты класса TPopupMenu используются для создания вспомогательных (локальных) меню, появляющихся после нажатия правой кнопки мыши. В отличие от главного меню, вспомогательное меню может быть создано для любого оконного компонента. Чтобы связать щелчок правой кнопкой мыши на компоненте с раскрытием вспомогательного меню, в свойство PоpupMеnu компонента необходимо поместить имя компонента-меню. Вспомогательное меню создается с помощью конструктора меню и содержит элементы описанного в п. 18.1.2 класса TMenuItem, поэтому процесс создания и свойства вспомогательного меню ничем не oтличаются от процесса создания и свойств TMainMenu. 5.6 Диалоговые компоненты Существует множество различных ситуаций, когда пользователю необходимо сделать некий выбор, например, выбрать имя файла для записи или для открытия. Для этой цели служат диалоговые компоненты, которые обеспечивают создание и показ диалоговых окон во время работы приложения. Диалоговые компоненты сосредоточены на закладке Dialogs на Палитре компонентов. Рассмотрим компоненты TSaveDialog и TOpenDialog. Эти компоненты имеют идентичные свойства и поэтому рассматриваются вместе. Пример окна, которое реализует компонент TOpenDialog показан на рисунке. Таблица 22 Свойства TSaveDialog и TOpenDialog FileName Содержит маршрут поиска и выбранный файл при успешном завершении диалога Filter Используется для фильтрации (отбора) файлов, показываемых в диалоговом окне. InitialDir Содержит имя начального каталога DefaultExt С помощью свойства DefaultExt формируется полное имя файла, если при ручном вводе пользователь не указал расширение. В этом случае к имени файла прибавляется разделительная точка и содержимое этого свойства. Title Содержит заголовок диалогового окна Программа может использовать это свойство FileName для доступа к файлу с целью читать из него данные (TOpenDialog) или записывать в него (TSaveDialog), при этом пользователь может ввести произвольное имя и, следовательно, указать несуществующий файл. Для записи это не имеет значения, но при чтении отсутствие файла может привести к краху программы. Чтобы избежать этого, можно проверить существование файла глобальной функцией FileExists. Свойство Filter можно устанавливать с помощью специального редактора на этапе конструирования формы или программно. Для доступа к редактору достаточно щелкнуть по кнопке в строке Filter окна Инспектора объектов. При программном вводе фильтры задаются одной длинной строкой, в которой символы “|” служат для разделения фильтров друг от друга, а также для разделения описания фильтруемых файлов от соответствующей маски выбора. Например, оператор OpenDialog1.Filter := 'Текстовые файлы|*.txt| Файлы Паскаля|*.раs'; задает две маски для отбора файлов с расширениями раs и TXT. Главным методом компонентов TSaveDialog и TOpenDialog является функция Execute, которая показывает окно диалога и возвращает значение True, если диалог успешно завершен, т.е. пользователь ввел подходящее имя файла и нажал кнопку Сохранить/ Открыть. В противном случае, функция Execute возвращает значение False. В диалоговом окне для ручного ввода имени файла предусмотрен элемент TEdit, который при желании можно заменить на TCоmbовох. Для этого необходимо свойству FileEditStyle придать значение fsComboBox вместо умалчиваемого fsEdit. Если выбран комбинированный список, с ним можно связать протокол выбора имен. Для этого используется свойство HistoryList, содержимое которого будет появляться в выпадающем списке. Этот список не пополняется автоматически, поэтому за его содержимым должна следить программа. Например: if OpenDialog1.Execute then begin HistoryList.Add(OpenDialog1.FileName); end; Настройка диалога может варьироваться с помощью сложного свойства Options. Логические подсвойства этого свойства имеют следующий смысл. Таблица 23 Значения свойства Options ofReadOnly Устанавливает переключатель Только для чтения ofOverwritePrompt Требует согласия пользователя при записи в существующий файл ofHideReadOnly Прячет переключатель Только для чтения оfNoChangeDir Запрещает смену каталога ofShowHelp Включает в окно кнопку Help ofNoValidate Запрещает автоматическую проверку правильности набираемых в имени файла символов оfAllowMultiSelect Разрешает множественный выбор файлов ofExtensionDifferent При завершении диалога наличие этого значения в свойстве Оptions говорит о том, что пользователь ввел расширение, отличающееся от умалчиваемого ofPathMustExist Разрешает указывать файлы только из существующих каталогов ofFileMustExist Разрешает указывать только существующие файлы ofCreatePrompt Требует подтверждения для создания несуществующего файла ofShareAware Разрешает выбирать файлы, используемые другими параллельно выполняемыми программами оfNoReadOnlyReturn Запрещает выбор файлов, имеющих атрибут Только для чтения ofNoTestFileCreate Запрещает проверку доступности сетевого или локального диска оfNoNetworkButton Запрещает вставку кнопки для создания сетевого диска ofNoLongNames Запрещает использование длинных имен файлов ofOldStyleDialog Создает диалог в стиле Windows 3-х Приведем пример обработчика нажатия пункта Open главного меню формы. При этом файл с выбранным именем (с помощью диалога TOpenDialog) загружается в многострочный редактор TMemo. procedure TForm1.Open1Click(Sender: TObject); begin If OpenDialog1.Execute then If FileExists(OpenDialog1.FileName) then Memo1.Lines.LoadFromFile( OpenDialog1.FileName) end; 5.7 Таблица строк Компонент TStringGrid (закладка Additional) предназначен для создания таблиц, в ячейках которых располагаются произвольные текстовые строки. Таблица делится на две части – фиксированную и рабочую. Фиксированная часть служит для показа заголовков столбцов/рядов и для ручного управления их размерами. Обычно фиксированная часть занимает крайний левый столбец и самый верхний ряд таблицы, однако с помощью свойств FixedCols и FixedRows можно задать другое количество фиксированных столбцов и рядов (если эти свойства имеют 0, таблица не содержит фиксированной зоны). Рабочая часть – это остальная часть таблицы. Она может содержать произвольное количество столбцов и рядов, более того, эти величины могут изменяться программно. Рабочая часть может не умещаться целиком в пределах окна компонента, в этом случае в него автоматически помещаются нужные полосы прокрутки. При прокрутке рабочей области фиксированная область не исчезает, но меняется ее содержимое – заголовки строк и рядов. Центральным свойством компонента является Cells – двухмерный массив ячеек строкового типа, каждая из которых может содержать произвольный текст. Конкретная ячейка определяется парой чисел – номером столбца и номером ряда, на пересечении которых она находится (нумерация начинается с нуля). Количество ячеек по каждому измерению хранит пара свойств ColСount (количество столбцов) и RowCount (количество рядов). Значения-этих свойств и, следовательно, размеры таблицы могут меняться как на этапе разработки программы, так и в ходе ее работы, однако их значения должны быть как минимум на единицу больше соответственно значений в свойства FixedCols и FixedRows, определяющих размеры фиксированной зоны. Таблица 24Свойства компонента TStringGrid BorderStyle Определяет рамку компонента: bsNone – нет рамки; bsSingle – рамка толщиной 1 пиксель Cells[ACol, ARow] Определяет содержимое ячейки с табличными координатами (ACol, ARow) Col Содержит номер столбца сфокусированной ячейки ColCount Содержит количество столбцов таблицы Cols[Index: Integer] Содержит все строки колонки с индексом Index ColWidths[Index: Longint] Содержит ширину столбца с индексом Index EditorMode Логическое свойство, которое разрешает/запрещает редактирование ячеек. Игнорируется, если свойство Options включает goAlwayseShowEditor или не включает goEditing FixedColor Определяет цвет фиксированной зоны FixedCols Определяет количество столбцов фиксированной зоны FixedRows Определяет количество рядов фиксированной зоны GridHeight Содержит высоту таблицы GridWidth Содержит ширину таблицы Options Содержит параметры таблицы Row Содержит номер ряда сфокусированной ячейки RowCount Содержит количество рядов таблицы Rows[Index: Integer] Содержит все строки ряда с индексом Index ScrollBars Определяет полосы прокрутки: ssNone – нет полос; ssHorizontal – в таблицу вставляется горизонтальная полоса; ssVertical – вставляется вертикальная полоса; ssBoth – вставляются обе полосы В следующем примере компонент TStringGrid используется для показа значений функции с заданным шагом и на заданном отрезке (границы вводятся с клавиатуры в компоненты TEdit). Для TStringGrid в Инспекторе объектов необходимо установит свойства: ColCount=2 RowCount=2 FixedCols=0 FixedRows=1 При создании формы происходит заполнение заголовка (фиксированной части) таблицы. procedure TForm1.FormCreate(Sender: TObject); begin with StringGrid1 do begin Cells[0,0]:='x'; Cells[1,0]:='sin x'; end; При нажатии кнопки таблица заполняется значениями функции. procedure TForm1.Button1Click(Sender: TObject); var y:real; i:integer; begin y:=strtofloat(Edit1.text); i:=1; while y<=strtofloat(Edit2.text) do begin with StringGrid1 do begin cells[0,i]:=floattostr(y); cells[1,i]:=floattostr(sin(y)); RowCount:=RowCount+1; end; y:=y+0.25; i:=i+1; end; end; 5.8 Переключатели Переключатели используется для того, чтобы пользователь мог указать свое решение типа Да/Нет или Да/Нет/Не совсем. Различают независимые и зависимые переключатели. В составе диалогового окна может быть несколько переключателей. Если состояние любого из них не зависит от состояния остальных, то такие переключатели называются независимыми, в противном случае – зависимыми. На закладке Standart имеются визуальные компоненты-переключатели: TCheckBox (независимый переключатель) и TRadioButton (зависимый переключатель). Таблица 25Свойства компонента TCheckBox. Alignment Определяет положение текста: taLeftJustify – с левой стороны компонента; taRightJustify – с правой стороны AllowGrayed Логическое свойство, которое разрешает/запрещает использование состояния cbGrayed (Не совсем) Caption Содержит связанный с компонентом текст Checked Логическое свойство, которое содержит выбор пользователя типа Да/Нет. Состояния cbUnchecked и cbGrayed отражаются как False State Содержит состояние компонента: cbUnchecked – нет; cbChecked – да; cbGrayed – не совсем Типичное использование компонента: if CheckBox1.Checked then ShowMessage(‘Yes’) else ShowMessage(‘No’) Или: case CheckBox1.State of cbChecked : ShowMessage(‘Yes’); cbUnchecked: ShowMessage(‘No’); cbGrayed : ShowMessage(‘Not sure’); end; Свойство Color компонента фактически игнорируется, а свойства Height и Width определяют размеры прямоугольника, в котором выводится связанный с переключателем текст, и не влияют на размеры прямоугольного окошка. Сам текст указывается в свойстве Caption. В отличие от TCheckBox компонент TRadioButton представляет собой зависимые переключатель, предназначенные для выбора одного из нескольких взаимоисключающих решений. На форму необходимо поместить по меньшей мере два таких компонента. Они могут иметь только два состояния, определяемых свойством Сhecked. Если в одном компоненте это свойство принимает значение True, во всех других компонентах, расположенных в том же контейнере, свойства Сhecked принимают значения False. Например, так выглядит стандартное завершение сеанса работы в Windows. Как и в TCheckBox, программист не может изменять размеры и цвет круглого окошка компонента. Для компонентов TCheckBox и TRadioButton определено событие OnClick, которое генерируется в момент щелчка мыши по компоненту. Компонент класса TRadioGroup представляет собой специальный контейнер с заголовком, предназначенный для размещения зависимых переключателей класса TRadioButton. Таблица 26Свойства компонента TRadioButton После размещения на форме компонент пуст. Чтобы создать в нем хотя бы один переключатель, следует раскрыть редактор списка Items и ввести хотя бы одну строку: строки Items используются как поясняющие надписи справа от переключателей, а их количество определяет количество переключателей в группе. После создания компонента его свойство ItemIndex по умолчанию имеет значение -1, т.е. ни один переключатель в группе не выбран. Если в момент появления компонента на экране в каком-то переключателе выбор уже должен быть установлен, необходимо на этапе конструирования с помощью Инспектора объектов или программно (например, в обработчике OnActivate формы) установить в свойство ItemIndex номер соответствующего переключателя (нумерация начинается с 0). Это же свойство позволяет программе проанализировать выбор пользователя. Таблица 27Свойства компонента TRadioButton Рассмотрим следующий пример. На форме размещен компонент TRadioGroup с двумя опциями, которые определяют положение полос прокрутки на компоненте Memo. Формирование опций компонента происходит во время создания формы. procedure TForm1.FormCreate(Sender: TObject); begin RadioGroup1.Items.Add(' Вертикальная'); RadioGroup1.Items.Add(' Горизонтальная'); RadioGroup1.ItemIndex := 2; end; procedure TForm1.RadioGroup1Click(Sender: TObject); begin if RadioGroup1.Items[RadioGroup1.ItemIndex] = ' Вертикальная' then Memo1.ScrollBars:= ssVertical; if RadioGroup1.Items[RadioGroup1.ItemIndex] = ' Горизонтальная' then Memo1.ScrollBars:= ssHorizontal; end; Или case RadioGroup1.ItemIndex of 0: Memo1.ScrollBars:= sbVertical; 1: Memo1.ScrollBars:= sbHorizontal; else ..... //Не выбран ни один переключатель end; Подобно тому как TRadioGroup группирует зависимые переключатели, TСheckListBox группирует независимые переключатели, позволяя обратиться к любому из них по индексу. Чтобы вставить в компонент группу независимых переключателей, следует раскрыть редактор его свойства Items и ввести одну или несколько текстовых строк – каждая строка будет соответствовать поясняющей надписи справа от переключателя. Таблица 28Свойства компонента TСheckListBox AllowGrayed Логическое свойство, которое разрешает/запрещает использовать в переключателях третье состояние cbGrayed BorderStyle Определяет тип рамки, очерчивающей компонент: bsNone – нет рамки; bsSingle – рамка толщиной в 1 пиксель Checked[Index:Integer] Содержит выбор пользователя типа Да/Нет для переключателя с индексом Index. Состояния cbUnchecked и cbGrayed отражаются как False Columns Определяет количество колонок опций Flat Логическое свойство, которое разрешает/запрещает трехмерную прорисовку окошек выбора Header[Index: Integer] Логическое свойство, запрещающее прорисовку окошка выбора для опции с номером Index. Таким образом вставляются заголовки отдельных секций ItemЕnabled[Index:Integer] Разрешает/запрещает выбор опции с индексом Index ItemIndex Содержит индекс выбранной опции (индексация опций начинается с нуля) Items Содержит опции компонента MultiSelect Если содержит True, пользователь может выбирать несколько опций SelCount Содержит количество выбранных опций компонента, если свойство MultiSelect содержит True Selected[Index: Integer] Содержит True, если опция с индексом Index выбрана Sorted; Логическое свойство, разрешающее сортировку по алфавиту надписей на переключателях State[Index: Integer] Содержит состояние переключателя с индексом Index: cbUnchecked – нет; cbChecked – да; cbGrayed – не совсем Для компонента определено событие OnClickCheck, которое наступает при изменении состояния любого переключателя. procedure TForm1.FormCreate(Sender: TObject); begin CheckListBox1.Items.Add('Выравнивание'); CheckListBox1.Items.Add('Цвет'); CheckListBox1.ItemIndex := 2; end; procedure TForm1.CheckListBox1Click(Sender: TObject); begin if CheckListBox1.Checked[0] then Memo1.Alignment:= taCenter else Memo1.Alignment:= taLeftJustify; if CheckListBox1.Checked[1] then Memo1.Color:= clAqua else Memo1.Color:=clBlue; end; 5.9 Контрольные вопросы 1. Как вызвать Дизайнер Меню? 2. Как создать подменю? 3. Каким образом можно поместить иконки для пунктов меню? 4. Как установить быстрые клавиши для пунктов меню? 5. На что влияет свойство Break пункта меню? 6. Какие компоненты используются для организации диалога при сохранении и открытии файлов? 7. Какой метод активизирует диалоговые компоненты? 8. Что такое контекстное меню? 9. Что представляет собой компонент TStringGrid? 10. Чем отличаются компоненты TRadioButtom и TRadioGroup? 11. Для чего используется компонент TCheckBox? 12. Какие компоненты реализуют списки выбора? 13. Какие виды кнопок имеются среди визуальных компонентов? Лабораторная работа 1 Тема: Первое приложение на DELPHI Цель работы: Ознакомиться с основными приемами работы в среде DELPHI Порядок выполнения работы: 1. Запустите Delphi. (Пуск/ Программы/Borland Delphi 5) 2. Выберите в Палитре компонентов закладку Standard. 3. Перенесите с Палитры компонентов на форму компоненты TLabel и TButton. Для этого поочередно подводите курсор мыши к компонентам, читая подсказки, до тех пор, пока не появится Label. Выберете его, нажав левую кнопку мыши, а затем переместите указатель на форму и нажмите еще раз на кнопку мыши. Помещенный на форму компонент будет иметь имя Label1. 4. Проделайте то же самое, только с компонентом TButton . 5. Напишите обработчик события Button1Click. Для этого выберите на форме Button1 и щелкните на него дважды. Вы окажетесь в окне редактирования. Приведите обработчик события нажатия кнопки к следующему виду: procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption:='Здравствуй, мир!'; end; При нажатии на кнопку вызывается обработчик события Form1.Button1Click(Sender: TObject), в котором мы меняем свойство Caption у объекта Label1. 6. Создайте новый каталог с именем MyProject. Для этого выполните команду главного меню File \ Open file и с помощью пиктограммы «Новый каталог» создайте новый каталог. Сохраните проект в созданном каталоге, выбрав пункт в главном меню File\ Save. При этом предлагается сохранить два файла (с расширением pas и prj). 7. Запустите на выполнение созданное Приложение. Для этого выберете в главном меню пункт Run\ Run, или нажмите клавишу F9. 8. Нажмите на кнопку в запущенном Приложении и посмотрите, что из этого получилось. Закройте Приложение. 9. Поместите на форму компонент TEdit.(см. п.3) и TButton. 10. Приведите обработчик события нажатия кнопки Button2 к следующему виду (вызов обработчика см. в п.5): (Переключение между формой, инспектором объектов и окном редактирования - F12). procedure TForm1.Button2Click(Sender: TObject); begin Label1.Caption:=Edit1.Text; end; 11. Измените свойство Edit1.Text на “Привет, студент!!!”. Для этого выберете на форме объект Edit1. Перейдите в Object Inspector, в закладке Properties найдите свойство Text и замените его. 12. Запустите на выполнение ваше Приложение. Попробуйте нажимать кнопку, вводя разное значение в строку редактирования. Закройте Приложение. 13. Добавьте компоненты TLabel и TButton. Установите свойство объекта Label2.Caption равным 1 (см. п.3). 14. Приведите обработчик события нажатия кнопки Button3 к следующему виду: (см. п.5) procedure TForm1.Button3Click(Sender: TObject); Var i:Integer; Begin i:= StrToInt (Label2.Caption); Label2.Caption:= IntToStr (i+1); end; {IntToStr, StrToInt – функции, преобразующие целый тип в строковый и строковый в целый соответственно} 15. Разместите на форме все кнопки вертикально, друг под другом. Выделите все кнопки и выровняйте их размеры и положение с помощью команд Edit\Size и Edit\Align. 16. Сохраните и запустите приложение из среды. Проверьте работоспособность всех кнопок формы. 17. Показать в окне Open все файлы проекта MyProject. Сформировать для файла Project1.exe ярлык. Для этого вызвать контекстное меню для файла Project1.exe и выбрать пункт «Создать ярлык». В списке файлов проектов появится файл Ярлык для Project1.exe. Скопировать его на рабочий столWindows с помощью контекстного меню ярлыка или «перетаскиванием» его на стол. 18. Сверните систему Delphi. Запустите приложение с помощью ярлыка. Закройте приложение, удалите ярлык приложения, вернитесь в среду Delphi. ЛАБОРАТОРНАЯ РАБОТА 2 Тема: Определение нажатой клавиши и нажатого символа. Цель работы: Ознакомиться с основными клавиатурными событиями визуальных компонентов. Порядок выполнения работы: 1. Разместите на форме 6 объектов типа Label и одну кнопку с растровым изображением (компонент BitBtn на закладке Additional палитры компонентов). Установите у кнопки свойство Kind равным bkClose. 2. При создании одинаковых по размеру объектов пользуйтесь буфером обмена или командой EditSize. Для выравнивания положения объектов на форме используйте команду EditAlign 3. Для всех объектов типа Label установить свойство AutoSize равным False, свойство Aligment – taCenter. Для меток слева установите нужные свойства Caption, Font. Для меток справа удалите свойство Caption, измените свойство Font по своему усмотрению. 4. Для всех объектов типа ТLabel оформите границы, используя такие декоративные элементы, как фаски (компонент ТBevel на закладке палитры компонентов Additional). У объектов типа ТBevel установите значения свойств Shape и Style. 5. Обработка клавиатуры осуществляется путем создания обработчиков событий: OnKeyDown, OnKeyPress, OnKeyUp. Для того, чтобы события клавиатуры принимал не компонент формы, обладающий в данный момент фокусом ввода, а сама форма, используйте свойство формы KeyPreview. 6. В процедуре обработки события формы OnKeyDown необходимо выполнить следующие действия. Показать значение переменной Key (код виртуальной клавиши) в качестве нажатой клавиши. Для преобразования кода в строковую переменную используйте функцию IntToStr. Проверить были ли нажаты клавиши Shift, Alt, Ctrl (принадлежат ли элементы ssShift, ssAlt, ssCtrl множеству Shift, которое передаётся процедуре в качестве параметра). Создать строку из комбинации нажатых клавиш (например, Shift+Alt+Ctrl, если были нажаты все три клавиши) и поместить её на форму в соответствующее место. 7. Например, для проверки нажатия клавиши Alt можно использовать следующий код if ssAlt in Shift then Label6.Caption:=’Alt’; 8. Процедура обработки события OnKeyPress получает значение параметра Key, равное символу ASCII. Для отображения символа в объекте Label2 используйте Label2.Caption:=Key 9. В процедуру обработки события формы OnKeyUp добавьте операторы очистки заголовков объектов типа Label из среднего столбца. Например, Label2.Caption:=’’. ЛАБОРАТОРНАЯ РАБОТА 3 Тема: Создание главного меню Цель работы: Научится использовать в приложении главное меню. Порядок выполнения работы: 1. Поместите на форму компонент MainMenu (закладка Standart на Палитре компонентов). Вызовите Дизайнер Меню, дважды щелкнув мышкой по компоненту на форме. Затем создайте меню как показано на рисунке.Для создания подменю можно воспользоваться командой Create SubMenu в контекстном меню, которое вызывается правой кнопкой мыши. После разработки закройте Дизайнер Меню. В верхней части формы теперь можно видеть разработанное меню. 2. При нажатии на отдельный пункт меню должно появляться информационное окно, которое содержит значение соответствующей характеристики формы. Двойной щелчок по пункту меню дает заготовку обработчика. Например, нажатие пункта Ширина можно обработать следующим образом procedure TForm1.N2Click(Sender: TObject); var s:string; begin s:=format('Width %d', [width]); ShowMessage(s); end; 3. Аналогичным образом обработайте остальные пункты меню, создавая информационные окна с соответствующей информацией о форме. 4. Для быстрого вызова команд можно использовать так называемые быстрые клавиши. Для этого для каждого пункта меню установите свойство ShortCut, выбрав значение из списка. При этом нужно следить, чтобы быстрые клавиши не повторялись во избежание коллизий. 5. Поместите на форму компонент ImageList (закладка Win32 на Палитре компонентов). Дважды щелкнув на компонент, можно вызвать редактор этого компонента. Используйте кнопку Add, чтобы добавить иконки (файлы с расширением ico). Можно использовать любые готовые иконки либо создать их самостоятельно. Для этого нужно вызвать редактор изображений (пункт главного меню Tools/ Image Editor). Далее создайте новое изображение File/ New/ Icon file ( .ico). Нарисуйте икону, используя различные цвета и инструменты на панели. Сохраните иконку в свою директорию. Рекомендуется добавить в ImageList 5-6 различных иконок. 6. Выделите компонент MainMenu1 и установите свойство Images равным ImageList1. После этого для каждого пункта меню установите свойство ImageIndex, выбрав из списка нужную иконку. Меню может выглядеть так. 7. Для каждого из пунктов меню Размеры установите свойство Break равным mbBarBreak. Запустите приложение, проверьте его работу. Необходимая информация. Диалоговые окна используются для вывода какой-либо информации или для запросов. procedure ShowMessage(const Msg: string); Показывает на экране окно с сообщением Msg и с кнопкой ОК. Пример использования этой процедуры показан на рисунке. ShowMessage('Hello!!!'); ЛАБОРАТОРНАЯ РАБОТА 4 Тема: Создание простейшего текстового редактора Цель работы: Освоить использование основных диалоговых компонентов Порядок выполнения работы: 1. Поместите на форму компонент ТMainMenu. Структура меню должна иметь вид: 2. Пункты меню About, Exit запрограммируйте следующим образом. При выборе пункта About появляется информационное окно с данными автора. Пункт Exit позволяет выйти из приложения. 3. Запустите приложение. Проверьте работу приложения. 4. Поместите на форму компонент всплывающее меню – ТPopupMenu, которое должно появляться на работающем приложении при щелчке правой кнопкой мыши по форме. Это меню должно содержать пункты About, Save, Exit с назначенными им клавишными эквивалентами для быстрого выполнения пунктов меню. 5. Для того, чтобы форма могла использовать объект PopupMenu, определите значение свойства PopupMenu для формы. 6. Для создания обработчиков событий, поступающих от всплывающего меню, для объекта About2 определите значение события OnClick, выбрав из раскрывающегося списка значение About1Click, которое использовалось для объекта About1 главного меню. Аналогичным образом определите значение события OnClick для объекта Exit2. Таким образом, события для разных объектов будут совместно использовать один обработчик события. 7. Запустите приложение и проверьте работу всплывающего меню. 8. Поместите на форму компонент Label. Присвойте свойству Caption значение FileName. 9. Поместите на форму компонент Edit под компонентом Label. Очистите значение свойства Text объекта Edit1. В дальнейшем здесь будет имя редактируемого файла. 10. Поместите на форму объект Memo (многострочный редактор), измените его размер и выровняйте визуальные компоненты, расположенные на форме, используя в главном меню Delphi EditAlign. Уберите у свойства Lines объекта Memo1 его значение. Установите вертикальную и горизонтальную полосы прокрутки, используя свойство ScrollBar объекта Мемо1. 11. Поместите на форму компоненты OpenDialog и SaveDialog, расположенные на закладке Dialogs палитры компонентов. Для объектов OpenDialog1 и SaveDialog1 определите свойства DefaultExt, Filter, FilterIndex, Title. 12. Для активизации диалогового компонента OpenDialog используйте его метод Execute в обработчике событий для пункта меню Open. Если пользователь закрывает диалоговое окно, щелкнув на кнопке OK, то функция Execute возвращает значение True и содержимое файла загружается в многострочный редактор Например, If OpenDialog1.Execute then Memo1.Lines.LoadfromFile(OpenDialog1.FileName); Для проверки существования файла используйте функцию FileExists, поскольку открываться может только уже существующий файл. Используйте метод Clear для очистки окна Memo1 при открытии нового файла. При сохранении файла в диалоговом окне должно предлагаться имя, заданное в компоненте TEdit. 13. Для обработки события OnClick объекта Open2 всплывающего меню подключите ту же процедуру Open1Click. 14. Аналогичные действия проделайте и с пунктом Save, при этом проверку на существование файла делать не нужно, поскольку если такой файл не существует, то приложение автоматически его создаст. Содержимое редактора Мемо1 загружается в файл методом SavetoFile. При сохранении файла в диалоговом окне должно предлагаться имя, заданное в компоненте TEdit. Для того, чтобы курсор установился в окно редактора, необходимо после загрузки файла в окно редактора установить значение свойства ActiveControl равным Мемо1. Поэтому в процедуру обработки события OnActivate формы добавьте следующий оператор: Form1.ActiveControl:=Memo1; 15. Запустите приложение и проверьте его работу. ЛАБОРАТОРНАЯ РАБОТА 5 Тема: Создание заставки текстового редактора. Создание таймера Цель работы: Научиться использовать различные виды форм. Порядок выполнения работы: Создание заставки 1. Используйте ранее созданный текстовый редактор. Откройте с помощью FileNew новую форму Form2. Удалите значение свойства Caption. Свойству BorderStyle присвойте значение bsNone (результат увидите только при запуске программы). Для удаления кнопок минимизации, максимизации формы и системного меню установите у свойства BorderIcons значения подсвойств biMinimize, biMaximize, biSystemMenu равными False( результат увидите только при запуске программы). 2. Свойство Enabled установите равным False для того, чтобы заблокировать обработку событий и лишить возможности пользователя управлять окном с помощью клавиатуры или мыши. 3. Сохраните проект, определив имя второго программного модуля проекта. 4. Выберите Project  Options. В предложенном окне выберите закладку страницы Forms. Переместите Form2 из списка AutoCreate в список Available для рационального использования памяти и ресурсов. 5. Преобразуйте исходный файл проекта. Для этого выполните команду Project Viewt Sourсe и измените операторы между begin и end следующим образом: Form2:=TForm2.Create(Application); {Этот оператор создает объект формы заставки и присваивает его адрес переменной Form2, которая определена в программном модуле заставки} Form2.Show; Form2.Update; {Отображение объекта из памяти на экране и обновление его содержимого} Application.CreateForm(TForm1,Form1); Form2.Hide; Form2.Free; { Скрытие формы заставки и освобождение занимаемой ею памяти} Application.Run; 6. Для того, чтобы заставка оставалась на экране несколько секунд, для обработчика события OnCreate главной формы Form1 добавьте следующие операторы: CurrentTime:=GetTickCount div 1000; { Процедура CurrentTime возвращает время работы Windows в миллисекундах} while((GetTickCount div 1000)<(CurrentTime+4)) do; { Организация паузы в 4 секунды} Объявите переменную CurrentTime типа longint. 7. Поместите на форму заставки компонент Image из закладки Additional палитры компонентов. Если два раза щелкнуть мышью на объекте Image1, то появится окно Picture Editor. Щелкнув по кнопке Load, выберите файл с картинкой для загрузки картинки в окно Picture Editor. (Можно загрузить стандартные картинки C:\Program Files\Common Files\Borland Shared\Images\…) Для того, чтобы растровое изображение внутри объекта Image1 занимало всю клиентную область, требуется изменить значение свойства Strech образа на True. 8. Поместите на форму заставки справа и снизу от рисунка два компонента Label из закладки Standard палитры компонентов. Отобразите на них информацию об авторе приложения и название приложения, используя различный размер, цвет и начертание шрифта. 9. Запустите приложение и проверьте его работу. Создание таймера 1. Добавьте к проекту новую форму Form3. Переместите Form3 из списка AutoCreate в список Available для рационального использования памяти и ресурсов. 2. Измените границы окна у Form3, сделайте их невидимыми, уберите значки максимизации, минимизации, системного меню. 3. Поместите на форму Form3 компонент Label, свойству Caption этого компонента присвойте значение 00:00:00. Выберите для своих часов шрифт, размер и стиль. 4. Преобразуйте исходный файл проекта. Для этого выполните команду Project Viewt Sourсe и добавьте перед строкой Application.Run операторы Form3:=TForm3.Create(Application); Form3.Show; Form3.Update; 5. Поместите на форму Form3 компонент Timer из закладки System. В обработчик события OnTimer объекта Тimer1 добавьте следующую строку: Label1.Caption:=TimeToStr(Time); {TimeToStr преобразует текущее время в строку} 6. Для события OnCreate формы Form3 выберите обработчик Timer1Timer, который был создан для компонента Timer1. Тогда текущее время будет записано в метку до появления окна. 7. Для формы Form3 установите свойство Formstyle равным fsStayOnTop для того, чтобы часы были расположены всё время поверх других окон. Кроме того, установите свойство Visible в True. Правила получения зачета Зачет выставляется студентам, которые успешно выполнили лабораторные работы и контрольную работу.
«Знакомство со средой программирования Delphi» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Помощь с рефератом от нейросети
Написать ИИ
Получи помощь с рефератом от ИИ-шки
ИИ ответит за 2 минуты

Тебе могут подойти лекции

Смотреть все 588 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot