- •Литература
- •Содержание
- •1. Основные понятия ооп
- •2. Программирование для Windows
- •3. Визуальное программирование и среда Delphi
- •Создание приложений в средеDelphi
- •Компоненты общего назначения tMainMenu- главное меню формы (программы)
- •TPopupMenu- вспомогательное (локальное) меню
- •TLabel- метка для отображения текста
- •TEdit-ввод и отображение строки
- •TMemo- ввод и отображение текста
- •TButton- кнопка
- •TBitBtn- кнопка с изображением
- •TSpeedButton- кнопка для инструментальных панелей
- •TCheckBox- независимый переключатель
- •TRadioButton- зависимые переключатели
- •TRadioGroup- группа зависимых переключателей
- •TListBox- список выбора
- •TComboBox- раскрывающийся список выбора
- •TPanel- панель
- •TTabControl- набор закладок
- •TPageControl- набор страниц с закладками
- •4. Особенности языка ооп Object Pascal
- •Процедуры и функции Выход из процедур и фукнций и возврат результата
- •Передача параметров
- •Параметры со значениями по умолчанию
- •Перегрузка функций
- •Динамическое распределение памяти
- •Указатели
- •Операции с указателями
- •Операция @
- •Самоадресуемые записи
- •Динамические массивы Одномерные динамические массивы
- •Многомерные динамические массивы
- •Исключения и их обработка
- •Защита кода зачистки в блокахtry...Finally
- •Защита кода зачистки на уровне модуля — разделfinalization
- •Обработка исключений в блокахtry...Except
- •Последовательность обработки исключений
- •5. Классы и объекты
- •Классы и объекты
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Составляющие класса Поля
- •Одноименные методы
- •Свойства
- •События
- •Объявление класса
- •Операции с классами
- •Ссылки на классы
- •TObjectи информация о классах
- •Регистрация и обнаружение классов
- •6. Создание объектов во время выполнения, поиск компонентов
- •Клонирование объектов
- •Поиск компонента
- •Двукратное освобождение объекта
- •7. Построение собственных компонентов
- •Как и для чего следует строить компоненты
- •Общие руководящие принципы
- •Ключевые идеи
- •Компиляция компонентов
- •Отладка компонентов
- •Примечание
- •Примечание
- •Примечание
- •8. Работа с потоками
- •Классы потоковDelphi
- •Файловые потоки
- •Примечание
- •Методы потоков в действии: программаMemoStr
- •Потоки памяти
- •Пример программыMemoryS
- •Примечание
- •Написание заказного класса потока
- •9. Работа с com-объектами, использование серверов ole-автоматизации
2. Программирование для Windows
В отличие от традиционного процедурного, программирование для Windows является объектно-ориентированным, хотя для этого могут быть использованы и не объектно-ориентированные языки. Система Windows представляет собой набор объектов, и именно с ними приходится сталкиваться и при работе, и при программировании. Основной чертой всех Windows-приложений является то, что они поддерживают оконный интерфейс, используя при этом множество стандартных элементов управления (кнопки, линейки, шкалы, списки и т. д.). Эти элементы поддерживаются с помощью динамических библиотек (DLL), которые являются частью операционной системы. Именно поэтому элементы доступны любым приложениям. Самым важным объектом является окно.
Окно (window) — прямоугольная область экрана для организации обмена между пользователем и приложением. Окно совместно использует экран с другими окнами, в том числе и других приложений. Единовременно пользователь может осуществлять ввод только в одно окно и приложение, к которому это окно относится.
Окно первым появляется при запуске системы или любого приложения и последним исчезает при завершении работы. Общение с объектом-окном возможно при помощи сообщений. (Объектно-ориентированные языки обеспечивают взаимодействие между объектами при помощи методов — функций-сообщений.)
Все Windows-приложения являются программами, управляемыми событиями (event-driven applications), что коренным образом отличает их от программ с фиксированной последовательностью выполнения. Программы, управляемые событиями, обладают большей гибкостью в смысле выбора пользователем порядка выполнения операций. Однако разработчик не может заранее предсказать последовательность вызовов функций и даже выполнения операторов своего приложения, так как эта последовательность определяется на этапе выполнения кода. Характерно то, что последовательность большей частью определяется не программой, а системой Windows и зависит от потока сообщений о событиях в системе. Большую часть времени приложение, управляемое событиями, находится в состоянии ожидания событий, точнее, сообщений о событиях. Сообщения могут поступать от различных источников, но все они попадают в очередь системных сообщений. Только некоторые из них система передаст в очередь сообщений вашего приложения. Все это время ваше приложение выполняет цикл ожидания сообщений. Как только придет сообщение, адресованное вашему приложению, система передаст управление вашей оконной процедуре.
В случае многопотокового приложения (multithreaded application) сообщение приходит активному потоку (thread) приложения.
Наступление события обозначается поступлением сообщения. Все сообщения Windows имеют стандартные имена, многие из которых начинаются с префикса WH_ (Windows Message). Например, WM_PAINT именует сообщение о том, что необходимо перерисовать содержимое окна того приложения, которое получило это сообщение. Идентификатор сообщения WM_PAINT — это символьная константа, обозначающая некое число.
Механизм сообщений в Windows реализуется при помощи очереди сообщений, поддерживаемой системой. Каждое сообщение попадает в такую очередь, где и ожидает последующей обработки.
Многие основные черты Windows обязаны своей спецификой тому факту, что она является системой, основанной на сообщениях. Такой подход к программированию заключается он в том, что реакция (и поведение) программы определяется внешними событиями. Windows сообщает приложению, а точнее, окну приложения о некотором событии при помощи сообщения, которое описывает некоторое изменение, произошедшее в окружающей приложение среде. Более того, механизм сообщений является единственным способом связи самих приложений со своими окнами. Происходит это через операционную систему, которая перенаправляет сообщения нужному объекту (окну). Сообщения используются для настройки, изменения и диагностики состояния всех окон. Таким образом, сообщения — это вход в приложение. Они представляют собой события, на которые, при необходимости, должно реагировать приложение. Каждое сообщение связывается с конкретным окном, с каждым из которых, в свою очередь, связана собственная оконная процедура. Все сообщения, источником которых служат аппаратные средства, система помещает в определенную структуру данных — первичную входную очередь (raw input queue).
Каждое окно в Windows имеет специальную функцию, которая вызывается для обслуживания сообщений. Операционная система может только послать сообщение окну, а оно уже само решает, что с ним делать. Точнее, программист определяет реакцию окна на получаемые сообщения. В течение этого процесса окно действует как автономный объект, живущий своей собственной жизнью.
Рассмотрим такой пример. Пользователь приложения нажимает клавишу на клавиатуре, а система вырабатывает сообщение об этом событии. Вы знаете, что Windows обеспечивает поддержку клавиатуры, не зависящую от типа устройства (device-independent support). Для каждого типа клавиатуры она устанавливает соответствующий драйвер, то есть специальную программу, которая служит посредником между клавиатурой и операционной системой. Клавиатурная поддержка Windows не зависит также от языка общения с системой. Это достигается использованием специальной клавиатурной раскладки (layout), которую пользователь выбрал в данный момент. Каждой клавише присвоено уникальное значение — идентификатор клавиши, зависящий от типа устройства и называемый скан-кодом. Когда пользователь вводит символ, то клавиатура генерирует два скан-кода: один — когда он нажимает клавишу, и другой — когда отпускает. Скан-коды с клавиатуры поступают в клавиатурный драйвер, который, используя текущую раскладку, транслирует их и преобразует в сообщения.
Клавиатурный драйвер интерпретирует скан-код и преобразует его в определяемый Windows код виртуальной клавиши (virtual-key code), не зависящий от типа устройства и идентифицирующий функциональный смысл клавиши. После этого преобразования скан-кода драйвер создает сообщение, в которое включаются: скан-код, виртуальный код и другая информация о нажатии клавиши, и помещает его в очередь системных сообщений. Windows выбирает сообщение из этой очереди и посылает его в очередь сообщений соответствующего потока (thread). В конце концов цикл выборки сообщений данного потока передает его соответствующей оконной процедуре для обработки. Модель ввода с клавиатуры в системе Windows представлена на рис.
Рис. Схема генерации и движения сообщений Windows