Мы ежедневно пользуемся компьютерными программами. Нас интересует, как они работают, какие возможности предоставляют. Бывает так, что нас не устраивает функционал программы: хочется добавить какие-то функции, которые были бы полезны и которые авторы программы почему-то не предусмотрели. Поэтому добро пожаловать в “кухню” программирования. Познакомимся с одной из самых популярных систем программирования, не только использующей язык Object Pascal, но и написанной на этом языке,- уже одно это говорит о том, что мы имеем дело с мощным инструментом, способным помочь нам решить практически любую задачу. Это система Delphi. Затронутый предмет практически необъятен, поэтому вдаваться во все тонкости программирования мы не будем, ограничимся сравнительно узким кругом вопросов, чтобы дать представление об инструментах системы и некоторых приёмах работы.
- Запустим систему и познакомимся с интерфейсом программы. Какие элементы он включает? Какие заголовки имеют окна? Какие из элементов интерфейса понятны?
- Рассмотрим небольшое окно в нижнем левом углу экрана. Как оно называется? Что содержит? Какие значения отображены во втором столбце таблицы? Как эти значения соотносятся с внешним видом формы, занимающей центральную часть экрана? Попробуем изменить одно из значений (например, значение “Width”). Для этого щелкнем по строчке с числом и введём свое значение. Что изменилось? Как наше действие повлияло на внешний вид формы Form1? И нельзя ли для этой формы придумать более информативное название? Поэкспериментируем со свойствами Caption и Name.
- Знакомимся со свойствами формы через Инспектор объектов (размер, цвет, заголовок…). Какие свойства формы изменяются “на ходу”, во время изменения значений в Инспекторе объектов?
- Проведём эксперимент. Изменим свойство BorderStyle на bsNone. Что изменилось? А если посмотреть на форму в действии? Нажмём F9. Программа, над которой мы работаем (хотя и не сделали почти ничего), переходит в режим выполнения. Как теперь выглядит форма? И как ее закрыть (ведь на ней нет полосы заголовка, нет и кнопки, закрывающей окно)? Неужели призывать на помощь Диспетчер задач Windows? Не будем торопиться. На помощь придет система Delphi. Через меню Run -> Program Reset остановим выполнение нашей программы. Сделаем вывод: не все изменения, производимые нами через Инспектор объектов, тут же отражаются на состоянии формы. Некоторые свойства проявляются только во время работы программы. (Вернём форме свойство BorderStyle: bsSizeable, хотя можно этого не делать. Кстати, добиться отсутствия на форме системной закрывающей кнопки можно также путём изменения свойства BorderIcons: в раскрывающемся списке свойству biSystemMenu присвоить значение “false”)
- Зададимся вопросом: для чего нам пустая форма? Чего на ней не хватает?
- Обратимся за помощью к инструментам Delphi. На панели вверху справа есть ряд вкладок. Как они называются? Что на них расположено? Подводя указатель мыши к иконкам, попробуем разобраться с их назначением. Для этого нам потребуется некоторое знание английского языка, но ведь мы его изучаем, не так ли?
- Попробуем использовать компонент Button. Щелкнем по иконке и по форме. Что произошло? Что изменилось в окне Дерева объектов? Какие элементы теперь содержит раскрывающийся список в окне Инспектора объектов? Какие действия можно совершать с кнопкой?
- Переименуем кнопку для удобства обращения к ней: пока элементов на форме немного, можно помнить о назначении каждого компонента, но когда количество компонентов увеличивается, то становится неудобным вспоминать, какие функции должны выполнять Button1, Button2,… Button24… А ведь помимо кнопок на форме могут быть расположены и другие элементы управления! Поэтому имени компонента должен предшествовать префикс, напоминающий о природе компонента. Например, кнопки могут именоваться btClose, btRun, btNext, и по префиксу “bt” становится понятно, что речь идет о кнопке. Для формы можно использовать префикс “fm”, для надписи – “lb” и т.д. Эти имена удобнее использовать при написании процедур и функций, чем неинформативные “Form1”, “Button34”, “Label18”. Итак, пусть наша форма называется fmMain, а кнопка – btClose с заголовком (свойство Caption) “Закрыть”. Нажмём F9. Наша программа перешла в режим выполнения, на форме отображается кнопка, по которой можно щёлкать сколько угодно, но которая ничего ровным счётом не делает, т.е. не закрывает форму. Остановим выполнение программы и приступим к программированию, т.е. назначим кнопке действие: заставим её закрывать форму. Не Бог весть какая сложная задача, но ведь надо с чего-то начинать!
- Как назначить кнопке действие? Дважды щелкнем по ней. Что произошло? Как называется открывшееся окно? Каково его содержание? Где находится текстовый курсор? Обращаем внимание, что в окне модуля создана заготовка для описания процедуры щелчка по кнопке. Текстовый курсор находится между словами begin и end, т.е. там, где должно находиться тело процедуры. Впишем туда слово Close и поставим точку с запятой. Клавишей F9 запустим программу. Работает кнопка?
- Пора выполнить основное действие: сохранить проект. (Лучше всего делать это сразу после запуска системы). Как это сделать? В меню содержится четыре варианта сохранения: Save, Save As…, Save project as…, Save all. С чего начинать? Save All сохраняет все изменения во всех существующих модулях, этот вариант сохранения применяют, когда проект уже сохранен и существует. Save сохраняет изменения в текущем модуле. Save As… позволяет сохранить содержание текущего модуля под другим именем. И, наконец, Save Project As… - с этого пункта надо начинать, сохраняя проект впервые. Воспользуемся им. Обратим внимание на то, что окно сохранения открывается дважды: в первом случае мы сохраняем файл модуля формы (расширение .pas), во втором – весь проект (расширение .dpr), в котором может быть несколько форм. Для каждого нового проекта следует заводить отдельную папку. В ней сохраняются не только файлы проекта и модуля, но и целая охапка служебных файлов, в том числе и резервные копии, из которых можно будет восстановить модуль, если он по каким-то причинам окажется испорченным.
- Что дальше? Скучно наблюдать за тем, как единственная кнопка закрывает программу, так и не научившуюся выполнять что-либо разумное. Заставим форму перекрашиваться.
- Поместим на форму еще одну кнопку, назовем ее btRecolor, озаглавим “Перекрасить”. Двойным щелчком мыши откроем заготовку процедуры. Объявим три переменные: r,g,b типа byte. Напишем следующий код:
- Запустим программу (F9). Теперь, нажимая на кнопку “Перекрасить”, мы получаем бесчисленное разнообразие окрасок.
- Откроем на панели инструментов вкладку Additional, найдём компонент LabelledEdit и добавим его на форму. Изменим свойство Name: leRed; свойство Caption (Заголовок): Red (или "красный"). (Свойство Caption находится в раскрывающемся списке свойства EditLabel). Выделим компонент на форме и скопируем его (Ctrl+C) и дважды вставим (Ctrl+V). Переименуем в Инспекторе объектов соответствующие свойства: имена elGreen и elBlue, заголовки "Green" и "Blue". Выровняем эти компоненты на форме (можно воспользоваться меню Правка a выровнять). Приступим к программированию компонентов.
- Еще раз двойным щелчком по кнопке "Перекрасить" откроем процедуру обработки щелчка. В конце процедуры перед словом end разместим следующий код:
- Попробуем изменить размер формы. Зачем нам такое широкое окно? Пока можно ограничиться меньшими размерами. Что обнаружилось? Кнопки, если они были поставлены, “как положено”, в правом нижнем углу экрана, ушли за край формы, а на самой форме появились полосы прокрутки. Как избежать этой неприятности? Выделим с помощью клавиши Shift обе кнопки и обратимся к свойству Anchors в Инспекторе объектов: поставим якоря не сверху справа, а снизу слева. Теперь при изменении размеров формы кнопки послушно остаются в правом нижнем углу, не убегая за пределы формы. Но можно и предотвратить попытки изменения размеров формы пользователем. Для этого следует изменить свойства BorderStyle на bsSingle. Запустив программу, мы обнаружим, что размеры формы в работающей программе изменить невозможно.
- Какие задачи мы можем поставить перед собой и реализовать в системе Delphi? Прошу предложить варианты дальнейшей работы.
Сделайте выводы. Обратите внимание на окно “Дерево объектов”, расположенное над окном Инспектора объектов. Что в нем содержится?
randomize;
r:=random(255);
g:=random(255);
b:=random(255);
fmMain.Color:=rgb(r,g,b);
Здесь мы используем сразу несколько функций: функцию randomize, которая возвращает случайное значение (если эту функцию не использовать, порядок цветов при каждом запуске программы будет повторяться с навязчивой регулярностью); функцию random(), которая возвращает случайное число из указанного диапазона, и функцию rgb, которая формирует цвет из трех указанных составляющих: r, g, b. Обратим внимание на очень полезную функцию автозавершения кода: введя имя элемента, которому назначаем действие, и поставив точку, мы (если до этого всё было правильно) видим открывшееся окошко с перечнем доступных переменных, процедур и функций. И еще одна важная деталь: воздействуя на один объект, мы можем изменять свойства другого. Перекрашивать форму могла бы и сама форма, если бы мы создали процедуру обработки щелчка по форме, а не по кнопке. Поэкспериментируйте!
Красиво – да, но полезно ли? Небесполезно уже потому, что использованные здесь функции можно применить при написании других процедур.
leRed.Text:=IntToStr(r);
leGreen.Text:=IntToStr(g);
leBlue.Text:=IntToStr(b);
Функция InToStr() возвращает строковое значение числа, содержащегося в поле ввода. Это означает, что в окошках мы видим строку, а не число.
Что происходит при прогоне программы? Теперь мы видим значения, которые принимают переменные r,g,b после нажатия на кнопку "Перекрасить". Но что делать, если нам нужно получить конкретное значение цвета? Для этого нужно научить программу передавать введенные в поля значения форме. Как это сделать? Попробуйте решить вопрос самостоятельно. Вам может пригодиться функция обратного перевода строки в число, IntToStr().
Примеры разработанных приложений:
Литература
- С.Симонович, Г.Евсеев. Занимательное программирование: Delphi.
- Фаронов В. Delphi 6: учебный курс. – СПб, "Питер", 2002
- Жуков А. Изучаем Delphi, - СПб, "Питер", 2003
- Сайт "Королевства Delphi".