- •Delphi
- •Краткий экскурс в историю
- •Языки программирования
- •Объектно-ориентированное программирование
- •Визуальное программирование
- •Среда программирования Delphi
- •Технология Java
- •Среда программирования Kylix
- •Технология .NET
- •... и опять среда Delphi
- •Что вы найдете в этой книге
- •Возможные трудности освоения
- •Глава 1. Основы визуального программирования
- •1.1. Краеугольные камни визуального программирования
- •1.2. Подготовка к работе
- •1.3. Первый запуск среды Delphi
- •1.4. Исследуем среду разработки программ
- •1.5. Первая программа
- •1.6. Итоги
- •Глава 2. Основы языка Delphi
- •2.1. Алфавит
- •2.1.1. Буквы
- •2.1.2. Числа
- •2.1.3. Слова-идентификаторы
- •2.1.4. Комментарии
- •2.2. Данные
- •2.2.1. Понятие типа данных
- •2.2.2. Константы
- •2.2.3. Переменные
- •2.3. Простые типы данных
- •2.3.1. Целочисленные типы данных
- •2.3.2. Вещественные типы данных
- •2.3.3. Символьные типы данных
- •2.3.4. Булевские типы данных
- •2.3.5. Определение новых типов данных
- •2.3.6. Перечисляемые типы данных
- •2.3.7. Интервальные типы данных
- •2.3.8. Временной тип данных
- •2.3.9. Типы данных со словом type
- •2.4. Операции
- •2.4.1. Выражения
- •2.4.2. Арифметические операции
- •2.4.3. Операции отношения
- •2.4.4. Булевские операции
- •2.4.5. Операции с битами
- •2.4.6. Очередность выполнения операций
- •2.5. Консольный ввод-вывод
- •2.5.1. Консольное приложение
- •2.5.2. Консольный вывод
- •2.5.3. Консольный ввод
- •2.6. Структура программы
- •2.6.1. Заголовок программы
- •2.6.2. Подключение модулей
- •2.6.3. Программный блок
- •2.7. Операторы
- •2.7.1. Общие положения
- •2.7.2. Оператор присваивания
- •2.7.3. Оператор вызова процедуры
- •2.7.4. Составной оператор
- •2.7.5. Оператор ветвления if
- •2.7.6. Оператор ветвления case
- •2.7.7. Операторы повтора — циклы
- •2.7.8. Оператор повтора for
- •2.7.9. Оператор повтора repeat
- •2.7.10. Оператор повтора while
- •2.7.11. Прямая передача управления в операторах повтора
- •2.7.12. Оператор безусловного перехода
- •2.8. Подпрограммы
- •2.8.1. Общие положения
- •2.8.2. Стандартные подпрограммы
- •2.8.3. Процедуры программиста
- •2.8.4. Функции программиста
- •2.8.5. Параметры процедур и функций
- •2.8.6. Опущенные параметры процедур и функций
- •2.8.7. Перегрузка процедур и функций
- •2.8.8. Соглашения о вызове подпрограмм
- •2.8.9. Рекурсивные подпрограммы
- •2.8.10. Упреждающее объявление процедур и функций
- •2.8.11. Процедурные типы данных
- •2.9. Программные модули
- •2.9.1. Структура модуля
- •2.9.2. Стандартные модули языка Delphi
- •2.9.3. Область действия идентификаторов
- •2.10. Строки
- •2.10.1. Строковые значения
- •2.10.2. Строковые переменные
- •2.10.3. Строки в формате Unicode
- •2.10.4. Короткие строки
- •2.10.5. Операции над строками
- •2.10.6. Строковые ресурсы
- •2.10.7. Форматы кодирования символов
- •2.10.8. Стандартные процедуры и функции для работы со строками
- •2.11. Массивы
- •2.11.1. Объявление массива
- •2.11.2. Работа с массивами
- •2.11.3. Массивы в параметрах процедур и функций
- •2.11.4. Уплотнение структурных данных в памяти
- •2.12. Множества
- •2.12.1. Объявление множества
- •2.12.2. Операции над множествами
- •2.13. Записи
- •2.13.1. Объявление записи
- •2.13.2. Записи с вариантами
- •2.14. Файлы
- •2.14.1. Понятие файла
- •2.14.2. Работа с файлами
- •2.14.3. Стандартные подпрограммы управления файлами
- •2.15. Указатели
- •2.15.1. Понятие указателя
- •2.15.2. Динамическое распределение памяти
- •2.15.3. Операции над указателями
- •2.15.4. Процедуры GetMem и FreeMem
- •2.16. Представление строк в памяти
- •2.17. Динамические массивы
- •2.18. Нуль-терминированные строки
- •2.19. Переменные с непостоянным типом значений
- •2.19.1. Тип данных Variant
- •2.19.2. Значения переменных с типом Variant
- •2.20. Delphi + ассемблер
- •2.20.1. Встроенный ассемблер
- •2.20.2. Подключение внешних подпрограмм
- •2.21. Итоги
- •Глава 3. Объектно-ориентированное программирование (ООП)
- •3.1. Краеугольные камни ООП
- •3.1.1. Формула объекта
- •3.1.2. Природа объекта
- •3.1.3. Объекты и компоненты
- •3.1.4. Классы объектов
- •3.1.5. Три кита ООП
- •3.2. Классы
- •3.3. Объекты
- •3.4. Конструкторы и деструкторы
- •3.5. Методы
- •3.6. Свойства
- •3.6.1. Понятие свойства
- •3.6.2. Методы получения и установки значений свойств
- •3.6.3. Свойства-массивы
- •3.6.4. Свойство-массив как основное свойство объекта
- •3.6.5. Методы, обслуживающие несколько свойств
- •3.7. Наследование
- •3.7.1. Понятие наследования
- •3.7.2. Прародитель всех классов
- •3.7.3. Перекрытие атрибутов в наследниках
- •3.7.4. Совместимость объектов различных классов
- •3.7.5. Контроль и преобразование типов
- •3.8. Виртуальные методы
- •3.8.1. Понятие виртуального метода
- •3.8.2. Механизм вызова виртуальных методов
- •3.8.3. Абстрактные виртуальные методы
- •3.8.4. Динамические методы
- •3.8.5. Методы обработки сообщений
- •3.9. Классы в программных модулях
- •3.10. Разграничение доступа к атрибутам объектов
- •3.11. Указатели на методы объектов
- •3.12. Метаклассы
- •3.12.1. Ссылки на классы
- •3.12.2. Методы классов
- •3.12.3. Виртуальные конструкторы
- •3.13. Классы общего назначения
- •3.13.1. Классы для представления списка строк
- •Свойства:
- •Методы:
- •События:
- •3.13.2. Классы для представления потока данных
- •Общие свойства:
- •Общие методы:
- •3.14. Итоги
- •Глава 4. Исключительные ситуации и надежное программирование
- •4.1. Ошибки и исключительные ситуации
- •4.2. Классы исключительных ситуаций
- •4.3. Обработка исключительных ситуаций
- •4.3.1. Создание исключительной ситуации
- •4.3.2. Распознавание класса исключительной ситуации
- •4.3.3. Пример обработки исключительной ситуации
- •4.3.4. Возобновление исключительной ситуации
- •4.3.5. Доступ к объекту, описывающему исключительную ситуацию
- •4.4. Защита выделенных ресурсов от пропадания
- •4.4.1. Утечка ресурсов и защита от нее
- •4.5. Итоги
- •Глава 5. Динамически загружаемые библиотеки
- •5.1. Динамически загружаемые библиотеки
- •5.2. Разработка библиотеки
- •5.2.1. Структура библиотеки
- •5.2.2. Экспорт подпрограмм
- •5.2.3. Соглашения о вызове подпрограмм
- •5.2.4. Пример библиотеки
- •5.3. Использование библиотеки в программе
- •5.3.1. Статический импорт
- •5.3.2. Модуль импорта
- •5.3.3. Динамический импорт
- •5.4. Использование библиотеки из программы на языке C++
- •5.5. Глобальные переменные и константы
- •5.6. Инициализация и завершение работы библиотеки
- •5.7. Исключительные ситуации и ошибки выполнения подпрограмм
- •5.8. Общий менеджер памяти
- •5.9. Стандартные системные переменные
- •5.10. Итоги
- •Глава 6. Интерфейсы
- •6.1. Понятие интерфейса
- •6.2. Описание интерфейса
- •6.3. Расширение интерфейса
- •6.4. Глобально-уникальный идентификатор интерфейса
- •6.5. Реализация интерфейса
- •6.6. Использование интерфейса
- •6.7. Реализация нескольких интерфейсов
- •6.8. Реализация интерфейса несколькими классами
- •6.9. Связывание методов интерфейса с методами класса
- •6.10. Реализация интерфейса вложенным объектом
- •6.11. Совместимость интерфейсов
- •6.12. Совместимость класса и интерфейса
- •6.13. Получение интерфейса через другой интерфейс
- •6.14. Механизм подсчета ссылок
- •6.15. Представление интерфейса в памяти
- •6.17. Итоги
- •Глава 7. Проект приложения
- •7.1. Проект
- •7.1.1. Понятие проекта
- •7.1.2. Файлы описания форм
- •7.1.3. Файлы программных модулей
- •7.1.4. Главный файл проекта
- •7.1.5. Другие файлы проекта
- •7.2. Управление проектом
- •7.2.1. Создание, сохранение и открытие проекта
- •7.2.2. Окно управления проектом
- •7.2.3. Группы проектов
- •7.2.4. Настройка параметров проекта
- •7.2.5. Компиляция и сборка проекта
- •7.2.6. Запуск готового приложения
- •7.3. Форма
- •7.3.1. Понятие формы
- •7.3.2. Имя и заголовок формы
- •7.3.3. Стиль формы
- •7.3.4. Размеры и местоположение формы на экране
- •7.3.5. Цвет рабочей области формы
- •7.3.6. Рамка формы
- •7.3.7. Значок формы
- •7.3.8. Невидимая форма
- •7.3.9. Прозрачная форма
- •7.3.10. Полупрозрачная форма
- •7.3.11. Недоступная форма
- •7.3.12. События формы
- •7.4. Несколько форм в приложении
- •7.4.1. Добавление новой формы в проект
- •7.4.2. Добавление новой формы из Хранилища Объектов
- •7.4.3. Переключение между формами во время проектирования
- •7.4.4. Выбор главной формы приложения
- •7.4.5. Вызов формы из программы
- •7.5. Компоненты
- •7.5.1. Понятие компонента
- •7.5.2. Визуальные и невизуальные компоненты
- •7.5.3. «Оконные» и «графические» компоненты
- •7.5.4. Общие свойства визуальных компонентов
- •7.5.5. Общие события визуальных компонентов
- •7.6. Управление компонентами при проектировании
- •7.6.1. Помещение компонентов на форму и их удаление
- •7.6.2. Выделение компонентов на форме
- •7.6.3. Перемещение и изменение размеров компонента
- •7.6.4. Выравнивание компонентов на форме
- •7.6.5. Использование Буфера обмена
- •7.7. Закулисные объекты приложения
- •7.7.1. Application — главный объект, управляющий приложением
- •7.7.2. Screen — объект, управляющий экраном
- •7.7.3. Mouse — объект, представляющий мышь
- •7.7.4. Printer — объект, управляющий принтером
- •7.7.5. Clipboard — объект, управляющий Буфером обмена
- •7.8. Итоги
- •Глава 8. Меню, строка состояния и панель инструментов
- •8.1. Меню
- •8.1.1. Идея меню
- •8.1.2. Главное меню
- •8.1.3. Дизайнер меню
- •8.1.4. Пункты меню
- •8.1.5. Разделительные линии
- •8.1.6. Комбинации клавиш
- •8.1.7. Обработка команд меню
- •8.1.8. Пункты-переключатели
- •8.1.9. Взаимоисключающие переключатели
- •8.1.10. Недоступные пункты меню
- •8.1.11. Контекстное меню
- •8.1.12. Значки в пунктах меню
- •8.2. Полноценное приложение для просмотра графических файлов
- •8.2.1. Диалоговые окна открытия и сохранения файла
- •8.2.2. Отображение рисунков
- •8.3. Строка состояния
- •8.3.1. Создание строки состояния
- •8.3.2. Подсказки в строке состояния
- •8.4. Прокрутка
- •8.4.1. Прокрутка рабочей области формы
- •8.4.2. Отдельная область прокрутки
- •8.4.3. Полосы прокрутки
- •8.5. Панель инструментов
- •8.5.1. Панель
- •8.5.2. Кнопки
- •8.5.3. Значки на кнопках
- •8.5.4. Надписи на кнопках
- •8.5.5. Разделительные линии
- •8.5.6. Кнопки-переключатели
- •8.5.7. Обработка нажатий кнопок
- •8.5.8. Подсказки к кнопкам
- •8.5.9. Управление видимостью панели кнопок
- •8.6. Список команд
- •8.6.1. Создание списка команд
- •8.6.2. Команды
- •8.6.3. Привязка команд
- •8.6.4. Реакция на команды
- •8.6.5. Управление состоянием команд
- •8.7. Итоги
- •Глава 9. Окна диалога
- •9.1. Понятие окна диалога
- •9.2. Окно "About"
- •9.2.1. Подготовка формы
- •9.2.2. Кнопка
- •9.2.3. Кнопка с рисунком
- •9.2.4. Украшение окна диалога рисунком
- •9.2.5. Текстовая надпись
- •9.2.6. Рельефная канавка
- •9.2.7. Рельефная панель
- •9.2.8. Выполнение диалога
- •9.3. Компоненты для ввода данных
- •9.3.1. Фокус ввода
- •9.3.2. Переключатели
- •9.3.3. Взаимоисключающие переключатели
- •9.3.4. Группа взаимоисключающих переключателей
- •9.3.5. Панель группы компонентов
- •9.3.6. Поле ввода и редактор текста
- •9.3.7. Редактор с шаблоном
- •9.3.8. Раскрывающийся список
- •9.3.9. Установка и получение данных
- •9.3.10. Список
- •9.4. Законченное приложение для выдачи сигналов в заданные моменты времени
- •9.4.1. Таймер
- •9.4.2. Файлы настроек
- •9.5. Многостраничные окна диалога
- •9.5.1. Страницы с закладками
- •9.5.2. Закладки без страниц
- •9.6. Итоги
- •Рекомендуется:
Рисунок 1.5. Главные части среды Delphi
Ура! Неизвестное оказалось хорошо известным! Хаос исчез, и сообразительный читатель уже все понял: из области “палитра компонентов” надо c помощью мыши выбрать компонент (кнопку, надпись, редактор текста и т.д.), поместить на "форму" и задать значения его свойств в области “свойства“. Среда Delphi проанализирует содержимое формы, создаст соответствующий программный код, а программисту останется только внести в него детали решения задачи — отклики на события. В общем, назначение интегрированной среды понятно, теперь можно спуститься с небес и заняться деталями.
1.4. Исследуем среду разработки программ
Снова посмотрим на интегрированную среду разработки (рисунок 1.6) и дадим название каждой ее части:
22
Рисунок 1.6. Среда Delphi в деталях
Обсудим кратко каждую из составных частей. Важнейшая часть — форма (рисунок 1.7). Она имеет заголовок Form1 и пока пуста (это аналог чистого листа, на котором вы собираетесь что-то рисовать):
Рисунок 1.7. Форма
23
Обратите внимание, что форма имеет все признаки “главного окна” традиционных графических приложений: значок, заголовок, кнопки "Свернуть", "Развернуть", "Закрыть", размерную рамку и, конечно, управляется мышью. Умудренный опытом читатель-программист подумает: сколько надо попотеть, чтобы сделать все это самому, а здесь основа интерфейса практически готова...
Под формой спрятан редактор кода (рисунок 1.8):
Рисунок 1.8. Редактор кода
Именно там размещается программный код на языке Delphi, соответствующий содержанию формы. Активизация редактора кода осуществляется щелчком мыши на части окна, которая выглядывает из-под формы, либо с помощью клавиши F12 на клавиатуре. В редакторе кода вы выполняете свою часть работы — дописываете детали решения задачи. Для возврата к форме достаточно нажать на клавиатуре клавишу F12 еще раз.
С формой все ясно, займемся компонентами, которые будем на ней размещать. Они находятся в области главного окна интегрированной среды, которая называется палитрой компонентов (рисунок 1.9).
24
Рисунок 1.9. Палитра компонентов
Разработчики среды Delphi поместили в палитру компонентов то, что считают оптимальным набором “строительных кирпичиков“, достаточным для создания любых приложений. Среди компонентов вы найдете меню, кнопки, надписи, стандартные диалоговые окна и др.
Как видно на рисунке 1.9, все множество компонентов разделено на группы. Каждая группа размещена в палитре компонентов на своей вкладке: Standard
— стандартные компоненты пользовательского интерфейса, Additional — дополнительные компоненты пользовательского интерфейса, Common Controls — общепринятые для Windows компоненты пользовательского интерфейса и т.д. Описание каждой вкладки палитры компонентов приведено в приложении А.
Выбрать нужный компонент из палитры и поместить его на форму очень просто:
Перейдите к нужной вкладке в палитре компонентов;
Выберите нужный компонент;
Отметьте на форме то место, где будет находиться компонент, — он мгновенно окажется на форме;
Придайте компоненту нужные размеры, растягивая по высоте и ширине, и скорректируйте его местоположение, используя имеющуюся на форме сетку (рисунок 1.10).
25
Рисунок 1.10. Компонент Button на форме
Компонент — на форме, пора задать его свойства. Для этого обратимся к окну с заголовком Object Inspector — окну свойств (рисунок 1.11). Оно расположено слева снизу от формы и активизируется с клавиатуры нажатием клавиши F11.
Рисунок 1.11. Окно свойств
Как только компонент оказывается на форме, в окне Object Inspector отображается список его свойств. Ваша задача — присвоить свойствам нужные значения. Например, чтобы написать на кнопке слово Compute, достаточно изменить значение свойства Caption, которое изначально
26
содержит текст Button1. По мере набора строки каждая буква будет автоматически появляться на кнопке.
Нетрудно заметить, что окно Object Inspector состоит из двух вкладок:
вкладки свойств — Properties и вкладки событий — Events. На вкладке
Properties устанавливаются свойства компонента. Когда значения свойств определены, нужно активизировать вкладку Events. Вы тут же увидите список событий, на которые данный компонент может реагировать. В качестве примера приведем список событий, на которые может реагировать кнопка (рисунок 1.12):
Рисунок 1.12. Список событий компонента Button
В представленном списке нас может интересовать событие OnClick — нажатие кнопки.
Некоторые компоненты подобно форме умеют содержать другие компоненты. Например, панель (компонент Panel) может содержать кнопки, надписи, другие панели и т.д. По внешнему виду формы не всегда можно определить, какие компоненты содержит интересующий вас компонент или на каком компоненте он содержится. Для ответа на эти вопросы, обратитесь к окну Object TreeView — окну компонентов формы (рисунок 1.13). Оно расположено слева вверху от формы и активизируется нажатием комбинации клавиш Shift+Alt+F11. В окне Object TreeView компоненты представлены в виде дерева, отражающего вложенность компонентов на форме. Сейчас на форме находится лишь одна единственная кнопка, поэтому
27
дерево компонентов имеет очень простой вид: корневой элемент Form1 и один вложенный элемент Button1.
Рисунок 1.13. Окно компонентов формы
Надеемся, что важнейшие элементы интегрированной среды — форма, редактор кода, палитра компонентов, окно компонентов формы, окно свойств — навсегда запечатлелись в вашей памяти, и переходим к другим ее частям.
Для управления процессом создания приложения в целом служит главное меню. Оно расположено в главном окне среды Delphi и выполняет множество служебных функций. Меню, в общем-то, стандартно и понятно каждому, кто имел дело с компьютером. Поэтому мы предельно кратко опишем назначение важнейших разделов главного меню:
File — работа с файлами.
Edit — работа с областью обмена, размещение компонентов на форме.
Search — поиск, замена заданного символа или строки в тексте.
View — отображение различной информации.
Project — управление проектом: добавление и удаление файлов, сборка проекта, установка параметров проекта.
Run — запуск и отладка программы.
Component — разработка новых компонентов, установка готовых компонентов.
Database — запуск программ, облегчающих построение приложений баз данных.
28
Tools — настройка параметров интегрированной среды разработки, запуск вспомогательных программ.
Window — активизация нужного окна интегрированной среды разработки.
Help — получение справочной информации.
Для ускорения доступа к некоторым командам служит панель кнопок
(рисунок 1.14).
Рисунок 1.14. Панель кнопок среды Delphi
На ней вы обнаружите шестнадцать кнопок-аналогов основных команд меню. Этот список можно расширить, добавив кнопки доступа к своим любимым командам. Для этого достаточно навести указатель мыши на панель кнопок, вызвать вспомогательное меню щелчком правой кнопки мыши и выбрать команду Customize.
Справа от главного меню есть небольшая панель (рисунок 1.15) для сохранения и восстановления внешнего вида среды Delphi. Расположите окна на экране на свой вкус, подберите наиболее удобные для себя кнопки. Затем, нажав кнопку с подсказкой Save current desktop, сохраните внешний вид среды Delphi. В следующем сеансе работы вы сможете мгновенно восстановить его из списка.
29