- •Сборник лекций по дисциплине «Объектно – ориентированное программирование»
- •2202 «Автоматизированные системы обработки информации и управления»
- •Рассмотрено
- •Рецензент:
- •Содержание
- •Пояснительная записка
- •Лекция №1 Тема: Введение
- •1. Определение объектно-ориентированного программирования
- •2. Свойства, события и методы объекта
- •3. Конструкторы
- •4. Компоненты: визуальные и невизуальные
- •5. Классы, наследование
- •Лекция №2 Тема: Язык Object Pascal
- •1. Синтаксические правила языка
- •2. Компилятор и его директивы
- •3. Файлы проекта Delphi
- •4. Области видимости и время жизни
- •Лекция №3 Тема: Константы, переменные, типизированные константы, процедуры и функции
- •1. Константы
- •2. Переменная
- •3. Типизированные константы
- •4. Процедуры и функции
- •1. Определение операций
- •2. Арифметические операции
- •3. Операции отношения
- •4. Булевы операции
- •5. Операции со строками
- •6. Операции с указателями
- •7. Операции с множествами
- •8. Операции с классами
- •9. Операция @
- •10. Приоритет и ассоциативность операций
- •Лекция №5 Тема: Операторы
- •1. Оператор присваивания и его соотношение с методом Assign
- •2. Оператор передачи управления goto
- •3. Оператор with
- •4. Условные операторы выбора if
- •5. Условный оператор множественного выбора case
- •6. Оператор цикла for
- •7. Оператор цикла repeat
- •8. Оператор цикла while
- •9. Прерывание цикла: оператор break, процедуры Continue, Exit и Abort
- •Лекция № 6 Тема: Динамическое распределение памяти. Исключения. Сообщения Windows.
- •1. Динамическое распределение памяти
- •2. Исключения
- •3. Последовательность обработки исключений
- •4. Преднамеренная генерация исключений
- •5. Сообщения Windows и их обработка
- •Лекция №7 Тема: Типы данных в языке Object Pascal
- •Символьные типы данных
- •Типы строк
- •1. Классификация типов данных
- •2. Порядковые типы данных
- •3. Целые типы данных
- •4. Действительные типы данных
- •5. Булевы типы данных
- •6. Символьные типы данных
- •7. Типы строк
- •8. Перечислимые типы
- •9. Ограниченные типы
- •10. Множества
- •Лекция №8 Тема: Структурные типы данных
- •1. Указатели
- •2. Файлы
- •3. Массивы
- •4. Записи
- •Лекция №9 Тема: Интегрированная Среда Разработки (иср) Delphi
- •1. Основные положения интегрированной среды разработки
- •2. Палитра компонентов
- •3. Редактор кода и инспектор объектов
- •4. Перетаскивание и встраивание окон в иср
- •5. Настройка инструментальной панели, палитры компонентов и редктора кода
- •6. Настройка интегрированной среды
- •7. Проекты Delphi
- •Лекция №10 Тема: Формы
- •1. Использование форм
- •2. Характеристики формы
- •3. Организация взаимодействия форм
- •4. Особенности модальных форм
- •5. Процедуры и функции, реализующие диалоги
- •Лекция №11 Тема: Компоненты ввода и отображения текстовой информации
- •1. Классификация компонентов ввода и отображения текстовой информации
- •2. Основные свойства, события и методы компонентов Label, StaticText и Panel
- •3. Основные свойства, события и методы окон редактирования Edit и MaskEdit
- •Символы шаблона маски:
- •4. Основные свойства, события и методов многострочных окон редактирования Memo и Richedit
- •Общие свойства окон редактирования:
- •5. Основные свойства, события и методы компонентов выбора из списков — ListBox, CheckListBox и ComboBox
- •6. Основные свойства, события и методы таблицы строк — компонент StringGrid
- •Лекция №12 Тема: Кнопки, индикаторы, управляющие элементы
- •1. Классификация компонентов кнопок, индикаторов и управляющих эелементов
- •2. Основные свойства, события и методы управляющих кнопок Button и BitBtn
- •3. Основные события и свойства кнопки с фиксацией SpeedButton
- •4. Основные свойства и события группы радиокнопок — компоненты RadioGroup, RadioButton и GroupBox
- •5. Основные свойства и события индикаторов CheckBox и CheckListBox
- •6. Основные свойства и события ползункиов и полос прокруток — компоненты TrackBar и ScrollBar
- •7. Основные свойства и события компонента Timer
- •Лекция №13 Тема: Компоненты меню
- •1. Основные свойства, события и методы главного меню — компонент MainMenu
- •2. Основные свойства, события и методы контекстного всплывающего меню — компонент PopupMenu
- •3. Горячие клавиши — компонент HotKey
- •Лекция №14 Тема: Системные диалоги
- •1. Общая характеристика компонентов — диалогов
- •2. Диалоги открытия и сохранения файлов — компоненты OpenDialog, SaveDialog, OpenPictureDialog, SavePictureDialog
- •3. Фрагменты диалогов — компоненты DriveComboBox, DirectoryListBox, FilterComboBox, FileListBox и DirectoryOutline
- •4. Диалог выбора шрифта — компонент FontDialog
- •5. Диалог выбора цвета — компонент ColorDialog
- •6. Диалоги печати и установки принтера — компоненты PrintDialog и PrinterSetupDialog
- •Лекция №15 Тема: Ввод и отображение чисел, дат и времени
- •1. Классификация компонентов ввода и отображения чисел, дат и времени
- •2. Основные свойства, события и методы компонентов UpDown и SpinEdit
- •3. Основные свойства, события и методы компонента DateTimePicker
- •4. Основные свойства, события и методы компонентов MonthCalendar и Calendar
- •5. Компонент f1Book
- •Лекция №16 Тема: Компоненты отображения заголовков и иерархических данных
- •1. Классификация компонентов отображения заголовков и иерархических данных
- •2. Основные свойства, события и методы компонентов Header HeaderControl
- •3. Основные свойства, события и методы компонентов TreeView и OutLine
- •4.Основные свойства, события и методы компонента ListView
- •Лекция №17 Тема: Отображение графической и мультимедиа информации
- •1. Классификация компонентов отображения графической информации
- •2. Основные свойства, события и методы таблиц изображений — компоненты DrawGrid и StringGrid
- •3. Основные свойства, события и методы компонента Shape
- •4. Основные свойства, события и методы компонента Chart
- •5. Основные свойства, события и методы компонентов страницы ActiveX — fiBook, Chartfx, Graph
- •6. Классификация компонентов отображения мультимедиа - компоненты Animate, MediaPlayer, ProgressBar, Gauge
- •7. Основные свойства, события и методы компонентов ProgressBar и Gauge
- •Лекция №18 Тема: Панели и компоненты внешнего оформления
- •1. Общая характеристика компонентов внешнего оформления
- •2. Панели общего назначения — компоненты Panel, GroupBox, Bevel, ScrollBox, Splitter
- •Некоторые свойства компонента Panel:
- •3. Многостраничные панели — компоненты TabControl, PageControl, TabSet, TabbedNoteBook, NoteBook
- •4. Инструментальные панели — компоненты ToolBar и PageScroller
- •5. Перестраиваемые панели - компоненты ControlBar и CoolBar
- •6. Полоса состояния StatusBar
- •7. Фреймы
- •Лекция №19 Тема: Компоненты организации управления приложением
- •1. Характеристика компонентов организации управления приложением
- •2. Диспетчеризация событий — компоненты, связанные с ActionList
- •3. Список изображений — компонент ImageList
- •4. Приложение — компонент ApplicationEvents и объект Application
- •Лекция № 20
- •1.8. Изменение размеров панелей при использовании выравнивания
- •1. Требования к интерфейсу пользователя приложений для Windows
- •1.1. Цветовое решение приложения
- •1.2. Шрифты текстов
- •1.3. Требования к меню
- •1.4. Компоновка форм
- •1.5. Последовательность фокусировки элементов
- •1.6. Подсказки и контекстно-зависимые справки
- •1.7. Проектирование окон с изменяемыми размерами
- •1.8. Изменение размеров панелей при использовании выравнивания
- •1.9. Изменение местоположения и размеров компонентов
- •1.10. Панели с перестраиваемыми границами
- •1.11. Ограничение пределов изменения размеров окон и компонентов
- •Контрольные вопросы:
- •Рекомендуемая литература: 1.1. Лекция № 21 Тема: Перетаскивание объектов
- •1. Перетаскивание информации об объектах — технология Drag&Drop
- •2. Перетаскивание и встраивание объектов — Drag&Doc. Плавающие окна
- •Лекция№22 Тема: Печать и разработка отчетов
- •1. Печать с помощью функций файлового ввода/вывода
- •2. Методы компонентов, обеспечивающие печать
- •3. Печать файлов средствами стандартных приложений Windows с помощью функции ShellExecute и обращения к серверам сом
- •4. Печать с помощью объекта Printer
- •5. Подготовка и печать отчетов с помощью QuickReport
- •5.1.Быстрый отчет (QuickRep)
- •Специфичные свойства
- •5.2. Специфичные методы
- •5.3.Специфичные события
- •5.4. Компоненты отчета
- •5.5. Основные свойства компонентов
- •Самостоятельная работа: Сформировать составной отчет.
- •Лекция № 23 Тема: Графика План:
- •2. Форматы графических файлов
- •3. Классы для хранения графических объектов tPicture, tBitMap, Tlcon и tMetafile
- •4. Редактор Изображений Image Editor
- •4.1. Создание файла изображения
- •4.2. Работа с файлами ресурсов
- •4.2.1.Создание файла ресурсов
- •4.2.2.Подключение файла ресурсов
- •5. Графические возможности Delphi
- •5.1. Холст
- •5.2. Карандаш и кисть
- •Карандаш
- •5.3. Вывод текста
- •5.4. Методы вычерчивания графических примитивов
- •5.4.1. Линия
- •5.4.2 Ломаная линия
- •5.4.3 Окружность и эллипс
- •5.4.4 Дуга
- •5.4.5 Прямоугольник
- •5.4.6 Многоугольник
- •5.4.7 Сектор
- •5.4.8 Точка
- •Самостоятельная работа: На поверхности диалогового окна, в точке нажатия левой кнопки мыши вычертить контур пятиконечной звезды.
- •Лекция № 24 Тема: Мультимедиа и анимация План:
- •1.1.2 Процедуры воспроизведения звуков Веер, MessageBeep и PlaySound
- •1.1.3. Универсальный проигрыватель MediaPlayer
- •1.1.4 Воспроизведение немых видео клипов — компонент Animate
- •2. Мультипликация
- •2.1. Метод базовой точки
- •3. Создание анимации
- •Лекция № 25 Тема: Взаимодействие приложения с внешними программами
- •2. Управление окнами внешних программ
- •1.1. Запуск внешней программы функцией WinExec
- •2. Управление окнами внешних программ
- •2.1. Определение дескриптора окна приложения
- •2.2. Некоторые функции api Windows для управления окнами
- •3. Создание динамически подключаемых библиотек (dll)
- •Лекция№26 Тема: Сообщения Windows и их обработка
- •2. Посылка сообщений
- •3. Обработка сообщений
- •4. Определение собственных сообщений
- •1. Сообщения Windows
- •2. Посылка сообщений
- •2.1. Функция SendMessage
- •2.2. Функция PostMessage
- •3. Обработка сообщений
- •4. Определение собственных сообщений
- •Лекция№27
- •1. Внедрение объектов
- •2. Технология связывания и внедрения объектов (ole)
- •3. Многопоточные приложения
- •4. Технология применения объектов com, dcom
- •Лекция №28 Тема: Динамический обмен данными — dde
- •1. Общие сведения
- •2. Установление контакта с сервером
- •3. Обмен данными между клиентом и сервером
- •3.1. Построение приложения-сервера
- •3.2. Построение приложения-клиента
- •4. Запрос данных сервера
- •5. Постоянное отслеживание информации на сервере
- •6. Передача информации от клиента к серверу
- •Лекция №29 Тема: Разработка собственных компонентов
- •1. Создание новых компонентов
- •2.Создание и установка ActiveX-элементов
- •3. Создание и установка пакетов
- •4. Использование пакетов
- •Лекция №30 Тема: Создание справочной системы. Разработка тестовых файлов
- •1. Этапы разработки
- •2. Планирование системы справок
- •3. Создание текстовых файлов
- •3.1. Задание идентифицирующей строки и организация перекрестных ссылок
- •3.2. Задание названия раздела
- •3.3. Определение ключевых слов
- •3.4. Определение условий компиляции
- •3.5. Указание порядка просмотра связанных разделов
- •3.6. Вставка графики
- •3.7. Выполнение макрокоманд
- •3.8. Отображение текста раздела в дополнительном окне
- •Лекция №31 Тема: Разработка проектного файла справочной системы
- •1. Разработка проектного файла
- •1.1. Секция options
- •1.2. Секция files
- •1.3. Секция windows
- •1.4. Секция map
- •3. Компиляция, тестирование и связывание Help-файла с программой
- •4. Макрокоманды WinHelp
- •Рекомендуемая литература
2. Перетаскивание и встраивание объектов — Drag&Doc. Плавающие окна
Начиная с Delphi 4 реализована новая технология перетаскивания и встраивания оконных объектов — Drag&Doc. Она предоставляет пользователю полную свободу в перестройке интерфейса. Отдельные окна могут объединяться вместе, создавать многостраничное окно с закладками, затем опять разъединяться и т.д. Посмотрим, как подобный подход можно реализовать в своем приложении.
У оконных компонентов введено свойство DockSite, которое по умолчанию равно false, но если его установить в true, то компонент становится контейнером: приемником, способным принимать переносимые в него компоненты — клиенты. Еще одно свойство приемника — UseDockManager. Если оно равно true (это принято по умолчанию), то процессом встраивания клиента автоматически управляет диспетчер встраивания, соответствующий тому компоненту, который является приемником. Если же задать UseDockManager равным false, то встраивание клиентов ложится на плечи программиста.
В компонентах — потенциальных клиентах надо установить свойство DragKind в dkDock. Кроме того, если вы хотите, чтобы процесс перетаскивания начинался автоматически, то, так же, как и в технологии Drag&Drop, надо установить свойство DragMode в dm Automatic. Если оставить значение DragMode равным dmManual по умолчанию, то управление процессом Drag&Doc осуществляется так же, как описывалось ранее для процесса Drag&Drop.
Посмотрим, к чему все это может привести. Давайте построим тестовое приложение, в котором осуществим Drag&Doc, не написав ни одной строчки кода.
Приемником может быть и сама форма. Укажите для формы вашего приложения DockSite равным true и выполните приложение опять. Поведение перетаскиваемых панелей несколько изменится. При щелчке на компонентах-клиентах они по-прежнему превращаются в плавающие окна, которые можно перемещать, изменять их размеры и т.п. Но при повторном щелчке они опять становятся обычными панелями, сохраняя при этом измененное местоположение и размеры. Объясняется это тем, что повторный щелчок воспринимается в этом случае как встраивание клиента в приемник — форму.
Теперь посмотрим, как можно управлять из компонента-приемника всеми этими процессами.
У приемника имеется свойство DockClients, объявленное как
DockClients[Index: Integer] : TControl;
которое позволяет получить доступ к каждому клиенту, перенесенному в приемник. Свойство DockClientCount содержит число клиентов. Оба свойства — DockClients и DockClientCount только для чтения.
В технологии определены соответствующие события, которые позволяют приемнику управлять процессом встраивания. Они генерируются только в том случае, если в компоненте установлено DockSite = true.
Первое из этих событий — OnGetSitelnfo возникает в момент начала перетаскивания и повторяется непрерывно в процессе перетаскивания. Заголовок соответствующего обработчика имеет вид:
procedure TForml.PanellGetSitelnfo(Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
В качестве параметров в обработчик передается DockClient — перетаскиваемый объект, InfluenceRect — прямоугольник рамки перетаскиваемого объекта, который можно изменять, MousePos — положение курсора мыши и CanDock — разрешение перетаскивания. Если в обработчике указать CanDock = false, это будет означать, что приемник отказывается принимать компонент.
Еще одно событие — OnDockOver возникает и повторяется в момент, когда компонент-клиент перемещается над компонентом-приемником, точнее, когда в поле приемника войдет курсор мыши, буксирующий клиента. Это событие аналогично событию OnDragOver в технологии Drag&Drop. Заголовок соответствующего обработчика имеет вид:
procedure TForml.PanellDockOver(Sender: TObject; Source: TDragDockObject; X,Y: Integer; State: TDragState; var Accept: Boolean);
В этом обработчике вы можете, как и в описанном выше, проверить, хотите ли вы, чтобы данный оконный компонент принял перетаскиваемый компонент, определяемый параметром Source. Если принимать не надо, то задается значение Accept = false.
Объект перетаскивания Source типа TDragDockObject имеет свойство DockRect типа TRect, описывающее перемещаемую рамку. Вы можете управлять ею.
Если в процессе буксировки панели Panels ее координаты выходят за пределы клиентской области приемника, то панель вытягивается вдоль соответствующего края приемника, а ее ширина равна 25. При перемещении панели внутри окна она представляется квадратом со стороной 100.
Это будет нормально срабатывать, если для приемника, например, для панели Panel1, установить UseDockManager равным false. В противном случае сначала сработает диспетчер встраивания, растянув рамку клиента, а затем наступит событие OnDockOver, так что его обработчик будет иметь дело с уже измененной рамкой, что приведет к ошибке встраивания. Поэтому надо отключить диспетчер встраивания для клиента Panel2, не отключая его для остальных клиентов. Это легко сделать, включив в обработчик события OnGetSitelnfo оператор
Panell .UseDockManager := DockClientoPanel2
Этот оператор задаст значение UseDockManager равным true для всех потенциальных клиентов, кроме Panels.
Еще одно событие, возникающее в компоненте-приемнике — OnDockDrop. Это событие возникает в момент окончания перетаскивания клиента над приемником. Оно аналогично событию OnDragDrop в технологии Drag&Drop. Заголовок соответствующего обработчика имеет вид:
procedure TForml.Panel2DockDrop(Sender: TObject;Source: TDragDockObject; X, Y: Integer);
Этот обработчик позволяет разместить клиента Source тем или иным образом в зависимости от его имени, типа, местоположения — координат X и Y. Например, в этот момент можно что-то изменить в надписях приемника, сигнализируя пользователя о приеме клиента и числе клиентов.
Событие, возникающее в компоненте-приемнике в момент, когда пользователь перетаскивает клиента из приемника — OnUnDock. Заголовок соответствующего обработчика имеет вид:
procedure TForml.PanellUnDock(Sender: TObject; Client: TControl; NewTarget: TWinControl; var Allow: Boolean);
В обработчик передаются как параметры Client — компонент, который был клиентом, NewTarget — новый приемник, в который пользователь перетаскивает клиента, и Allow — параметр, определяющий, можно ли перетащить клиента.
У оконных компонентов есть свойство Floating (только для чтения), которое показывает, является компонент свободно плавающим окном, или размещен в другом оконном компоненте-приемнике.
При переводе ранее размещенного компонента в состояние плавающего окна и при встраивании плавающего окна можно использовать свойства, в которых запоминаются размеры компонента в предыдущем состоянии:
UndockHeight - Высота компонента, которая была в последний раз, когда он отображался плавающим окном.
UndockWidth - Ширина компонента, которая была в последний раз, когда он отображался плавающим окном.
TBDockHeigh - Высота компонента, когда он в последний раз размещался в контейнере вертикально.
LRDockWidth - Ширина компонента, когда он в последний раз размещался в контейнере горизонтально.
Пользуясь этими свойствами можно восстанавливать при необходимости предшествующие размеры компонента. В частности, по умолчанию после перевода компонента из размещенного состояния, в состояние плавающего окна его размеры восстанавливаются исходя из свойств UndockHeight и UndockWidth.
В технологии существует метод ManualFloat, который переводит размещенный компонент в состояние плавающего окна. Он объявлен следующим образом:
function ManualFloat(ScreenPos: TRect): Boolean;
Параметр функции ScreenPos определяет положение и размер компонента после его перевода в состояние плавающего окна.
И последний метод, который мы рассмотрим — ManualDock, размещающий компонент в указанном приемнике. Его описание:
function ManualDock(NewDockSite: TWinControl;
DropControl: TControl = nil;
ControlSide: TAlign = alNone): Boolean;
Параметр NewDockSite определяет приемник, в котором должен размещаться клиент. Второй параметр DropControl определяет другой компонент в приемнике NewDockSite, который должен разместить данного клиента. Как правило, этот параметр задается равным nil. Параметр ControlSide определяет выравнивание клиента внутри приемника. Если это единственный клиент в приемнике, то значение этого параметра безразлично. Но если там уже есть клиенты, то задание, например, ControlSide = alLeft приведет к перестановке, если только данный клиент не самый левый в приемнике.
Имеется, однако, особенность, не оговоренная в документации: метод ManualDock срабатывает только в случае, если компонент-клиент был ранее в состоянии плавающего окна. Так что вам придется предварительно один раз перевести Рапеl в это состояние или щелчком на панели, или с помощью кнопки, соответствующей ранее рассмотренному методу ManualFloat. Другой способ обойти эту трудность автоматически — ввести соответствующий метод ManualFloat в обработчик события формы OnCreate.
И еще одно нестандартное использование методов ManualFloat и ManualDock. Пусть, например, вы хотите иметь форму, содержащую несколько панелей, которые пользователь мог бы перемещать, не переводя их в состояние плавающего окна и не изменяя размеров. Тогда вы можете в форме установить DockSite = true, сделать в панелях соответствующие установки свойств DragKind в dkDock и DragMode в dm Automatic, а в событии формы OnCreate выполнить для каждой панели методы ManualFloat и ManualDock, назначив приемником в ManualDock форму. Вы получите приложение, в котором пользователь сможет перемещать панели мышью. Это может быть полезно в каких-то приложениях, связанных с проектированием топологии или конструированием.
Контрольные вопросы:
Где реализуются технологии Drag&Doc и Drag&Drop?
С какого метода начинается перетаскивание информации из одного объекта в другой?
Перечислите события, которые участвуют в процессе перетаскивания информации.
Перечислите события, которые участвуют в процессе встраивания объектов.
Какое свойство определяет режим перетаскивания?
Рекомендуемая литература:1.1, 1.3, 2.1.
