- •Основы программирования
- •Введение
- •Основы delphi
- •Общая технология программирования
- •Язык программирования
- •Объектно-ориентированное программирование
- •Визуальное программирование
- •Событийно управляемое программирование
- •Windows-приложение
- •Среда программирования
- •Первоначальные сведения о проекте приложения
- •Встроенный отладчик
- •Использование встроенных классов
- •Иерархия классов
- •Использование палитры компонентов и инспектора объектов
- •Использование графики
- •Основные инструменты
- •Основные характеристики шрифтов
- •Графические данные и палитра
- •Некоторые общие свойства компонентов
- •Сохранение проекта
- •Построение простейшего проекта
- •Понятие исключительной ситуации
- •Введение в object pascal
- •Структура приложения
- •Структура программы-проекта
- •Структура модуля
- •Пример 1
- •Описания программных элементов
- •Программные элементы и адреса памяти
- •Области видимости
- •Правила записи имен
- •Время жизни идентификаторов
- •Использование локальных переменных в примере 1
- •Использование глобальных переменных в примере 1
- •Простые типы
- •Целые типы
- •Целые типы
- •Некоторые операции с целым типом
- •Символьные типы
- •Логические типы
- •Тип перечень
- •Интервальный тип
- •Вещественный тип
- •Вещественные типы
- •Некоторые операции с вещественным типом
- •Тип дата-время
- •Выражения
- •Константы
- •Типизированные константы.
- •Переменные
- •Операции
- •Унарная операция not (отрицание)
- •Логические операции and, or, xor
- •Функции
- •Порядок вычисления выражений
- •Виды операторов
- •Простые операторы
- •Составной оператор
- •Операторы условного перехода
- •Оператор if
- •Пример 2
- •Оператор case
- •Пример 3
- •Использование enter в примере 3
- •Операторы цикла
- •Оператор цикла for
- •Пример 4
- •Оператор цикла while
- •Пример 5
- •Оператор цикла repeat
- •Пример 6
- •Использование процедур break и continue
- •Пример 7
- •Массивы
- •Статические массивы
- •Динамические массивы
- •Пример 8
- •Пример 9
- •Записи (объединения)
- •Оператор with
- •Пример 10
- •Совместимость и преобразование типов данных
- •Идентичность типов
- •Совместимость типов
- •Совместимость по присваиванию
- •Преобразование типов
- •Операторы обработки исключительных ситуаций
- •Пример 11
- •Множества
- •Операции над множествами
- •Пример 12
- •Вариантный тип данных
- •Процедуры и функции
- •Процедура
- •Функция
- •Рекурсия
- •Формальные и фактические параметры
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Параметры без типа
- •Массивы открытого типа
- •Парамеры по умолчанию
- •Процедура exit
- •Директивы подпрограммы
- •Соглашения по передаче данных
- •Директива forward
- •Директива external
- •Директива assembler
- •Перегруженные подпрограммы
- •Пример 13
- •Инкапсуляция
- •Класс как объектный тип
- •Наследование
- •Области видимости
- •Операции is и as
- •Виды методов
- •Методы virtual и полиморфизм
- •Методы dynamic
- •Методы message
- •Методы abstract
- •Методы override
- •Методы class
- •Пример 14
- •Динамическое создание компонентов
- •Использование класса со счетчиком объектов
- •Отслеживание разрушения объектов
- •События
- •Указатели на методы
- •Пример 15
- •Типы ссылки на класс
- •Свойства
- •Свойства simple
- •Свойства enumerated
- •Свойства set
- •Свойства object
- •Свойства array
- •Задание начальных значений свойствам
- •Пример 16
- •Файловые типы
- •Текстовые файлы
- •Типизированные файлы
- •Файлы без типа
- •Дополнительные процедуры и функции
- •Пример 17
- •Компонент tmainmenu
- •Указатели
- •Пример 18
- •Динамические структуры данных
- •Однонаправленные списки
- •Двунаправленные списки
- •Стеки, очереди
- •Бинарные деревья
- •Пример 19
- •Процедурный тип
- •Программные единицы dll
- •Пример 20
- •Технологии программирования
- •Потоки данных
- •Пример 21
- •Пример 22
- •Интерфейс drag and drop
- •Пример 23
- •Технология drag and dock
- •Пример 24
- •Использование функций windows api при работе с файлами
- •Пример 25
- •Использование отображаемых файлов
- •Пример 26
- •Программные потоки
- •Приоритеты потоков
- •Класс tthread
- •Пример 27
- •Использование блокировки в примере 27
- •Многопоточное приложение в примере 28
- •Проблемы синхронизации потоков
- •Список используемых в примерах компонентов
- •Список используемых компонентов и других классов
- •Библиографический список
- •Оглавление
Пример 1
Создадим приложение, выполняющее какие-либо “полезные” действия. Для этого продолжим работу над проектом, форма которого представлена на рис.11. Пусть приложение будет выполнять сложение двух чисел s = a + b. Создадим форму, приведенную на рис.13.
Рис. 13. Форма к примеру 1.
В данном проекте использовались два новых компонента TLabel и TEdit (по сравнению с рис. 11). Компонент TLabel позволяет отобразить статический, нередактируемый текст. Используя этот компонент, задаются заголовки для других интерфейсных элементов. Текст заголовка вводится с помощью инспектора объектов (свойство Caption). Если свойство AutoSize равно “True”, то размер компонента динамически изменяется в зависимости от размера текста. Для того чтобы текст располагался в нескольких строчках, нужно свойству WordWrap задать True.
Компонент TEdit понадобился для создания полей ввода. С помощью этого компонента строятся строки редактирования – прямоугольные окна, в которых возможен ввод и редактирование текста. TEdit – однострочный редактор. Этот редактор содержит свойство Text, с помощью которого можно передавать данные внутрь приложения. Числа вводятся в виде текста, полученный текст программно преобразуется в числа с помощью функций преобразования. Окончание ввода осуществляется путем передачи фокуса другому компоненту, используя нажатие клавиши Tab. Если свойству ReadOnly задать значение True, то можно запретить ввод данных в данное поле ввода и использовать компонент TEdit для вывода результатов расчетов.
В качестве события, инициализирующего выполнение сложения, выберем нажатие на первую кнопку Button1 (кнопка “Расчет”). Выберем подходящее встроенное для кнопки Button1 событие - событие OnClick.
В рассматриваемом примере используются Label1, Label2, Label3, Edit1, Edit2, Edit3, Button1, Button2. Так как вводятся числа, то первоначально в свойстве Text интерфейсных элементов Edit1 и Edit2 нужно удалить с помощью инспектора объектов имеющийся текст. Далее необходимо задать свойство TabOrder для всех элементов – оно задает порядок “обегания” всех объектов на форме с помощью клавиши Tab. После запуска приложения фокус должен быть на Edit1. Поэтому необходимо задать свойство TabOrder для элемента Edit1 равным 0. Для Edit2 свойство TabOrder необходимо задать равным 1, Button1 - 2, Button2 – 3.
Далее запрограммируем обработчик события на нажатие кнопки “ Расчет”. Для этого в редакторе кода необходимо “вызвать” заготовку требуемого обработчика. Заготовку события OnClick в редакторе кода будет сгенерирована, если выполнить двойной щелчок с помощью левой клавиши мыши на элементе Button1. Между begin и end нужно написать код обработки события, выполняющий следующее:
взять строку Edit1.Text и преобразовать ее в число;
взять строку Edit2.Text и преобразовать ее в число;
выполнить сложение этих чисел;
полученный числовой результат преобразовать в текст и этот текст поместить в свойство Edit3.Text для отображения на экране дисплея.
Примем, что в данном случае будем работать с целыми числами. Решим проблему ограничения ввода только цифр. Этого можно достичь, если задать обработчик событий OnKeyPress – этот обработчик обрабатывает каждое нажатие клавиши на клавиатуре при вводе текста (в данном случае чисел). Таких обработчиков нужно два: для Edit1 и Edit2.
Вначале сформируем обработчик OnKeyPress для Edit1. Для этого необходимо выполнить следующее: мышью выбрать Edit1 на форме, в инспекторе объектов перейти на страницу событий (Events), выбрать OnKeyPress и выполнить двойное нажатие левой кнопкой мыши в поле справа от названия события. Появится редактор кода, в котором будет заготовка нужного обработчика. Введем текст:
If not (key in [‘0’..’9’]) then Key:=#0;
Этот оператор “отсеет” все символы, кроме цифр. Фактически этот обработчик исполняет роль фильтра, заменяя введенные нецифровые символы на самый первый символ (#0) из таблицы ASCII, который не имеет графического начертания.
Теперь сформируем обработчик OnKeyPress для Edit2. Так как он будет таким же, что и для Edit1, поступим следующим образом. Выберем Edit2, перейдем на страницу событий в инспекторе объектов, мышью выберем OnKeyPress - справа в этой строчке будет стрелка. Мышью нажмем на стрелку - появится в окошке строка Edit1KeyPress. Выберем мышью эту строку – один обработчик события OnKeyPress будет работать на два элемента Edit1 и Edit2.
Ниже приводится полный текст модуля Unit1.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
{Список используемых интерфейсных элементов}
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject;
var Key: Char);
end;
var Form1: TForm1;
implementation
{$R *.dfm}
{Программные коды используемых обработчиков событий}
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit3.Text:=IntToStr(StrToInt(Edit1.Text)+
StrToInt(Edit2.Text));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject;
var Key: Char);
begin
if not (key in ['0'..'9','-',#8,#13]) then key:=#0;
end;
end.
В обработчике OnKeyPress фильтр был расширен, чтобы появилась возможность ввода следующих дополнительных символов: ‘-‘, #8 – Backspace, #13 – Enter.
Самым замечательным в приведенной выше программе является то, что разработчик должен набрать всего три строки – это строки между begin и end в трех обработчиках событий.
