Компонент Timer позволяет задавать в приложении интервалы времени. Таймер находит многочисленные применения: синхронизация мультипликации, закрытие каких-то окон, с которыми пользователь долгое время не работает, включение хранителя экрана или закрытие связей с удаленным сервером при отсутствии действий пользователя, регулярный опрос каких-то источников информации, задание времени на ответ в обучающих программах — все это множество задач, в которых требуется задавать интервалы времени, решается с помощью таймера.
Таймер — невизуальный компонент, который может размещаться в любом месте формы. Он имеет два свойства, позволяющие им управлять: Interval — интервал времени в миллисекундах и Enabled — доступность. Свойство Interval задает период срабатывания таймера. Через заданный интервал времени после предыдущего срабатывания, или после программной установки свойства Interval, или после запуска приложения, если значение Interval установлено во время проектирования, таймер срабатывает, вызывая событие OnTimer. В обработчике этого события записываются необходимые операции.
Если задать Interval = 0 или Enabled = false, то таймер перестает работать. Чтобы запустить отсчет времени надо или задать Enabled = true, если установлено положительное значение Interval, или задать положительное значение Interval, если Enabled = true.
Например, если требуется, чтобы через 5 секунд после запуска приложения закрылась форма — заставка, отображающая логотип приложения, на ней надо разместить таймер, задать в нем интервал Interval = 5000, а в обработчик события OnTimer вставить оператор Close, закрывающий окно формы.
Если необходимо в некоторой процедуре запустить таймер, который отсчитал бы заданный интервал, например, 5 секунд, после чего надо выполнить некоторые операции и отключить таймер, это можно сделать следующим образом. При проектировании таймер делается доступным (Enabled = true), но свойство Interval задается равным 0. Таймер не будет работать, пока в момент, когда нужно запустить таймер, не выполнится оператор
|
Timer1.Interval:= 5000; |
Через 5 секунд после этого наступит событие OnTimer. В его обработчике надо задать оператор
Timer1.Interval:= 0; |
который отключит таймер, после чего можно выполнять требуемые операции.
Другой эквивалентный способ решения задачи — использование свойства Enabled. В время проектирования задается значение Interval = 5000 и значение Enabled = false. В момент, когда надо запустить таймер выполняется оператор
Timer1.Enabled:= true; |
В обработчик события OnTimer, которое наступит через 5 секунд после запуска таймера, можно вставить оператор
Timer1.Enabled:=false; |
который отключит таймер.
Таймер точно выдерживает заданные интервалы Interval, если они достаточно велики — сотни и тысячи миллисекунд. Если же задавать интервалы длительностью десятки или единицы миллисекунд, то реальные интервалы времени оказываются заметно больше вследствие различных накладных расходов, связанных с вызовами функций и иными вычислительными аспектами.
Компонент Delphi Timer не достаточно точный для малых промежутков времени (менее 100 миллисекунд).
Давайте разберем два примера:
1. Установим событие onTimer:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:= False;
ShowMessage('Программа уже загружена');
end;
Через время заданное в свойстве Interval появиться однократное сообщение о загрузке программы.
|
2. Расположим на форме в дополнение к компоненту Timer компонент Label. Обработчик события onTimer:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption:= TimeToStr(now);
end;
Мы создали электронные часы. Now - это функция возвращающая дату и время на данный момент. TimeToStr - забирает время и переводит его в строковую переменную.
Выполнение лабораторной работы
I. В соответствии с вариантом выбрать задание на программную разработку:
1. На форме располагаются компоненты: редактор MaskEdit, группа из четырех кнопок SpeedButton, метка Label, контекстное меню для формы и две кнопки BitBtn (для очистки редактора и закрытия формы) с подходящими по назначению рисунками. В MaskEdit вводится дробное число как аргумент тригонометрической функции. Сама функция: sin, cos, tg или ctg, - выбирается с помощью кнопок SpeedButton. Запуск на вычисление производится с помощью контекстного меню. Результат помещается на Label.
2. На форме располагаются компоненты: таблица StringGrid 4х6, в первую ячейку которого занесена фамилия студента; четыре кнопки cо стрелками , ¯, ®,; редактор MaskEdit для отображения координат текущей ячейки и кнопка Close. Нажатие кнопок со стрелками приводит к перемещению в указанном направлении фамилии. Редактор позволяет ввести новые координаты ячейки в указанном формате и диапазоне с клавиатуры, а нажатие клавиши Enter приводи к перемещению фамилии в новое место. Остальные ячейки таблицы при этом очищаются.
3. На форме располагаются: четыре кнопки BitBtn с рисунками и номерами сверху, контейнер Image, две линейки ScrollBar, кнопка Close и редактор Edit. Нажатие каждой кнопки приводит к дублированию на Image рисунка, а номер кнопки отображается в окне редактора. Линейки ScrollBar меняют размер Image в диапазоне 50х50.. 150х150. Кнопка Close заканчивает программу.
|
4. На форме располагаются: семь кнопок SpeedButton с подписями-днями недели; линейка ScrollBar, размеченная днями недели; кнопка Close; флажок CheckBox и редактор MaskEdit. Перемещение вдоль линейки приводит к нажатию соответствующей кнопки и отображению текущего дня недели в редакторе MaskEdit, а флажок задает режим отображения: заглавными или прописными буквами. Кнопка Close заканчивает программу.
5. На форме располагаются: кнопка SpeedButton, кнопка Close, редакторы MaskEdit и Memo, контейнер Image. В редакторе Memo содержится 10 Фамилий И.О. В редактор MaskEdit разрешено вводить текст только по такому же формату. Если введенная фамилия совпадает с одной из фамилий в Memo, в Image отображается изображение данного человека. В противном случае фон Image становится прозрачным, т.е. его не видно. Кнопка Close заканчивает программу.
6. На форме располагаются: таблица StringGrid 4x7, в каждой строке которой свой набор элементов: "Цветы", "Деревья", "Реки", "Города"; четыре набора главных меню, соответствующие строкам таблицы; две линейки ScrollBar для изменения текущей ячейки таблицы; кнопка Close. Изменение номера строки делает активным соответствующее ей меню, а изменение номера столбца дезактивирует соответствующую ему опцию меню. Кнопка Close заканчивает программу.
7. На форме располагаются: главное меню с шестью опциями-названиями животных, контейнер Image, кнопка Close и радионабор для выбора животного. Выбор осуществляется мышью или клавишами клавиатуры (®, или , ¯). Выбранное животное отображается на элементе Image, а соответствующая ему опция в меню становится невидимой. Кнопка Close заканчивает программу.
8. На форме располагаются: таблица StringGrid с календарем на текущий месяц, в котором названия столбцов соответствуют дням недели; редактор MaskEdit, используемый для ввода числа; группа из семи кнопок SpeedButton, размеченная днями недели. Ввод дня в редактор и запуск контекстным меню приводят к нажатию кнопки, соответствующей выбранному дню недели. Этот же день дублируется в заголовке формы. Кнопка Close заканчивает программу.
9. На форме располагаются: таблица StringGrid с исходным размером 5х5, два радионабора для выбора текущей ячейки, компонент Image, редактор Memo. Все ячейки таблицы заполнены названиями различных предметов (птиц, рыб, животных и т.п.). Компонент Image имеет размер ячейки и перемещается синхронно активной ячейке. При на нем отображается изображение текущего предмета, а название предмета дублируется в редакторе Memo. Кнопка Close заканчивает программу.
10. На форме располагаются: таблица StringGrid 7х1, в которую занесены дни недели, редактор Edit, флажок CheckBox, кнопка Close. Стрелками клавиатуры и ¯ по дням недели перемещается курсор. При этом в редакторе Edit отображается текущий день недели. Перемещение вверх устанавливает флажок, вниз – сбрасывает флажок. Кнопка Close заканчивает программу.
11. На форме располагаются: таблица StringGrid 2х12, в первую строку которой занесены названия месяцев; компонент Image и кнопка Close. В проект введены три контекстных меню: для формы, таблицы и Image. Контекстное меню формы меняет цвет фона (6 цветов), таблицы - приводит к отображению во второй строчке количества дней в выбранном месяце, Image - меняет рисунок на компоненте (5 рисунков). При этом в заголовке формы указывается, какого компонента меню активизировалось. Кнопка Close заканчивает программу.
12. На форме располагаются две таблица StringGrid 3х4 и главное меню для выбора из них активной. В левую таблицу можно вводить только текст, а в правую - отрицательные и положительные вещественные числа. При попытке неправильного ввода внизу соответствующей таблицы загорается красная лампочка (элемент Image). Активная таблица индицируется радиокнопкой. Кнопка SpeedButton заканчивает работу программы.
II. Результат разработки продемонстрировать преподавателю.
Домашнее задание!!!
В этом примере мы напишем программу, которая моделирует работу светофора на пешеходном переходе с кнопкой вызова (чтобы перейти дорогу, человек должен нажать кнопку).
Создайте новый проект. Cохраните все файлы проекта в папке Светофор. При сохранении имя файла-проекта Project1 замените на Light. Измените заголовок формы на Светофор. |
В этой программе нам понадобится 4 компонента: кнопка (типа TButton), прямоугольник и три круга (компоненты TShape — фигуры).
Для того, чтобы добавить компонент, можно просто перетащить его из палитры на форму в нужное место. Вместо этого можно просто сделать двойной щелчок по названию компонента.
Свойства компонента устанавливаются так же, как и для формы. Предварительно компонент нужно выделить одним из трех способов: щелчком мышки на форме, в окне Structure или выбрав из списка объектов в верхней части окна Object Inspector. После этого мышкой можно перемещать компоненты по форме и изменять их размеры за маркеры на рамке.
Любой компонент имеет имя — свойство Name, по которому мы будем в программе обращаться к свойствам и методам этого компонента.
Добавьте на форму кнопку TButton (группа Standard), дайте ей имя btnGo (свойство Name) и измените текст на «Перейти дорогу» (свойство Caption). Разместите кнопку в нужном месте и отрегулируйте ее размеры. |
Теперь будем добавлять фигуры. Чтобы изменить фон, используем сложное свойство Brush. Если раскрыть его щелчком по значку (или двойным щелчком), мы увидим, что оно состоит из двух подсвойств: Color (цвет) и Style (стиль). Для обращения к этим свойствам используют запись Brush.Color и Brush.Style.
Добавьте на форму фигуру TShape (группа Additional) в виде высокого прямоугольника, установите для него черный цвет фона (Brush.Color= clBlack). Посмотрите, какие бывают стили заливки. |
Остальные фигуры — круги. Для того, чтобы изменить тип фигуры, используют свойство Shape.
Добавьте на форму еще одну фигуру, сделайте ее кругом (Shape= stCircle) и присвойте имя shRed. Установите красный цвет заливки и попытайтесь разместить ее на месте красного сигнала. |
Наверное, вы уже заметили, что при перетаскивании фигура «прилипает» к узлам сетки. Это специальный режим, позволяющий быстро и просто выравнивать объекты. Однако сейчас он только мешает, поскольку не позволяет правильно разместить красный круг. Для точного расположения выделенной фигуры можно перемещать ее клавишами-стрелками при нажатой клавише Ctrl.
Чтобы отключить выравнивание по сетке совсем, нужно войти в меню Tools - Options (Инструменты - Настройки), выбрать в левой части группу настроек Environment Options - VCL Designer (Среда - Визуальное проектирование) и в правой части снять флажок Snap to grid (Привязать к сетке). | |
Добавьте на форму еще одну фигуру, установите для нее серый цвет заливки (clGray) и имя shYellow. Разместите этот круг на месте желтого сигнала. Проверьте, чтобы у двух кругов были одинаковые размеры (свойства Width — ширина, и Height — высота). |
Третий круг мы построим с помощью копирования.
Выделите второй круг и скопируйте его в буфер обмена, нажав клавиши Ctrl+C (или выбрав пункт верхнего меню Edit - Copy). Затем вставьте копию из буфера обмена (клавиши Ctrl+V или меню Edit - Paste). Дайте новой фигуре имя shGreen. |
Для того, чтобы ровно разместить фигуры относительно друг друга, нужно выделить их, последовательно щелкая на каждой при нажатой клавише Shift, нажать на одной из фигур правую кнопку мыши и выбрать пункт Position - Align из контекстного меню. Вы увидите такое окно:
Здесь в левой части устанавливается тип горизонтального выравнивания, а в правой части — выравнивание по вертикали. Для тех, кто слаб в английском, переведем:
No change — нет изменений
Left sides — по левой границе
Centers — по центру
Right sides — по правой границе
Tops — по верхней границе
Bottoms — по нижней границе
Space equally — распределить равномерно
Center in window — по центру окна
Выделите все круги и выровняйте их, установив такие режимы, как на рисунке выше. Если нужно, отрегулируйте размер прямоугольника. |
Измените размеры окна, чтобы слева и снизу не оставалось много пустого места. Чтобы запретить изменение размеров мышкой, установите для формы свойство BorderStyle= bsSingle. Запустите программу и убедитесь, что размеры окна не меняются (однако, можно развернуть его на весь экран). |
Теперь пришло время заняться алгоритмом переключения сигналов светофора. После щелчка по кнопке сначала должен загореться желтый свет (точнее, красный с желтым одновременно), затем — зеленый, потом опять красный.
Чтобы изменить цвет фигуры, нужно изменить цвет кисти, с помощью которой она закрашивается. Параметры кисти хранятся в свойстве Brush, так что для того, чтобы изменить цвет красного круга на серый, нужно ввести код
shRed.Brush.Color:= clGray;Это значит (запись с несколькими точками «читаем» с конца) «цвет кисти фигуры shRed будет серый».
Предположим, что желтый загорается на 1 секунду, а зеленый горит 4 секунды. Чтобы организовать задержку на заданное время, используют процедуру sleep, параметром которой является время в миллисекундах. Команда
sleep (1000);останавливает программу ровно на 1 секунду. В это время программа не реагирует на действия пользователя и не обрабатывает сообщения (то есть, «висит»).
Выделите кнопку и определите для нее обработчик события OnClick: shYellow.Brush.Color:= clYellow; sleep(1000); shRed.Brush.Color:= clGray; shYellow.Brush.Color:= clGray; shGreen.Brush.Color:= clLime; sleep(4000); shGreen.Brush.Color:= clGray; shRed.Brush.Color:= clRed; |
Каждый компонент имеет обработчик по умолчанию, который открывается при двойном щелчке на этом компоненте. Для кнопки это обработчик OnClick, поэтому для создания обработчика можно было просто дважды щелкнуть по кнопке на форме. |
Попробуйте сделать двойной щелчок по кнопке. |
Когда светофор работает, нужно заблокировать кнопку от повторного нажатия. Это можно сделать с помощью свойства Enabled. Если оно имеет значение True, кнопка работает, если False — кнопка неактивна.
Добавьте в начало и в конец обработчика соответственно команды btnGo.Enabled:= False;... btnGo.Enabled:= True; Запустите программу и посмотрите, как она работает. |
Кажется, что команды изменения цвета кругов не выполняются, хотя кнопка блокируется на 5 секунд (становится серой и неактивной). Кроме того, в течение этих 5 секунд программа вообще не реагирует на действия пользователя (например, ее окно не закрыть). Что же происходит?
Вспомним, что наша программа работает на принципах обработки сообщений. Когда мы даем команду изменить цвет фигуры, она сразу не выполняется. Вместо этого в очередь сообщений программы ставится соответствующее сообщение. Команда sleep вообще прекращает всякую работу программу, в том числе останавливает цикл обработки сообщений. Когда отработали обе команды sleep (через 5 секунд), сразу очень быстро выполняются все переданные ранее команды изменения цвета кругов, так что мы не успели заметить, как загорелся красный с желтым, зеленый и опять красный.
Таким образом, после команды на изменение цвета кругов (перед sleep!) нужно дать программе «вздохнуть», то есть обработать поступившие к этому моменту сообщения. Для этого у глобального объекта Application есть метод ProcessMessages.
Добавьте перед каждой командой sleep строчку Application.ProcessMessages; Запустите программу и оцените результат. |
Таймер
Хотя вроде бы светофор теперь работает как надо, вы могли заметить, что при выполнении команды sleep программа все равно не реагирует на действия пользователя. Как этого избежать? Хотелось бы, чтобы программа включалась в работу только тогда, когда надо менять состояние светофора, а все остальное время находилась в режиме ожидания (а не в «спящем» состоянии!).
Светофор — это автомат, который (в нашей задаче) может находиться в трех состояниях:
- горит только красный;
- горят красный и желтый;
- горит зеленый.
Переход из состояния 1 в состояние 2 происходит при нажатии кнопки; переход из состояния 2 в состояние 3 — автоматически через 1 секунду, и переход из состояния 3 обратно в состояния 1 также автоматически через 4 секунды. Эти переходы показаны на рисунке (время дано в миллисекундах):
С переходом 1—2 вроде бы все ясно, его нужно сделать в обработчике события OnClick для кнопки. Для того, чтобы выполнить переходы по времени, нам нужно, чтобы через заданное время кто-то прислал нашей программе соответствующее сообщение. Это может сделать только операционная система, которая 1 раз примерно в 55 мс посылает сообщение WM_TIMER всем программам.
К счастью, в Delphi уже есть компонент, который делает работу с таймером простой и удобной. Он называется TTimer (группа System). У него два основных свойства:
- Enabled — разрешить/запретить (True / False);
- Interval — время срабатывания с миллисекундах.
и единственное событие OnTimer, которое срабатывает тогда, когда заданный интервал истек. Во время выполнения программы компонент TTimer на форме не виден.
Добавьте на форму компонент TTimer и установите его свойство Enabled= True. |
Объявите целую переменную state, которая будет хранить состояние светофора в данный момент, и массив times, куда мы запишем время ожидания для второго и третьего состояния: state: integer; times: array[2..3] of integer = (1000, 4000); |
Оставьте в обработчике OnClick кнопки только код перехода 1-2 и запуск таймера с интервалом для перехода 2-3: btnGo.Enabled:= False; shYellow.Brush.Color:= clYellow; state:= 2; Timer1.Interval:= times[2]; Timer1.Enabled:= True; |
Сделав двойной щелчок на компоненте-таймере на форме, создайте обработчик события OnTimer и добавьте в него код переключения сигналов светофора: case state of 2: begin shRed.Brush.Color:= clGray; shYellow.Brush.Color:= clGray; shGreen.Brush.Color:= clLime; end; 3: begin shGreen.Brush.Color:= clGray; shRed.Brush.Color:= clRed; Timer1.Enabled:= False; btnGo.Enabled:= True; end; end; |
Обратите внимание, что после перехода из третьего состояния в первое таймер выключается и кнопка становится активной.
В конец того же обработчика добавьте код для перехода к следующему состоянию и установки нового интервала ожидания: if state < 3 then begin state:= state + 1; Timer1.Interval:= times[state]; end; Запустите программу и проверьте ее работу. Можно ли сейчас закрыть окно программы во время ожидания? | |
Посмотрите на объявление класса формы в самом начале кода программы. Куда система поместила список добавленных компонентов? |
Еще раз напомним, что эту часть кода (выше блока private) менять нельзя, она обрабатывается автоматически.
В качестве упражнения измените программу так, чтобы переход от зеленого к красному выполнялся через мигающий зеленый. |
Содержание отчета:
1) Задание на выполнение лабораторной работы;
2) Таблица идентификаторов;
3) Код программы и листинг результатов.
Контрольные вопросы
1) Может ли редактор MaskEdit работать как редактор Edit?
2) Почему синтез графики на компоненте Image предпочтительнее данного процесса непосредственно на пространстве формы?
3) Как заносятся значения в ячейки таблицы StringGrid?
4) Какое минимальное значение кнопок должно быть в группе на основе SpeedButton?
5) Как заносится графика на кнопки BitBtn?
На заметку!!!
Примеры программ без написания кода
Сначала создадим календарь, разработка которого займет не более минуты.
1. Создайте проект.
2. Разместите на нем компонент типа TmonthCalendar (Календарь), который находится в разделе Win32.
3. Разместите календарь в форме и установите подходящие размеры формы.
4. Запустите программу и испытайте работу компонента MonthCalendar.
5. Завершите работу программы, сохраните ее и можете ею пользоваться.
Теперь создайте простейший навигатор Windows (Просмотр каталогов), для чего используйте компоненты TFileListBox, TDirectoryListBox, TdriveComboBox и TFilterComboBox, которые находятся в разделе win31.
Сделайте все то же самое, как и при создании календаря, за одним исключением. В инспекторе объектов нужно установить необходимые связи. Например, для свойства FileList компонента DirectoryListBoxl необходимо установить значение FileListBox. Его просто нужно выбрать из раскрывающегося списка, который будет создан для свойства FileList. Это же нужно сделать и с другими компонентами.
Для свойства формы Caption введите значение Навигатор и можете наслаждаться навигатором по файлам Windows.
Теоретический материал
Флажки в среде программирования используются для выбора собственного решения (да/нет или да/нет/не уверен). В последнем случае флажок устанавливается, но выглядит блекло. Это решение отражается в свойстве State компонента, доступном как для чтения, так и для записи. State может быть 3 типов:
· Установлен (Checked)
· Не установлен (Unchecked)
· Не уверен (Alignment)
Переключатели предназначены для выбора одного из нескольких взаимоисключающих решений. На форме помещаются, по меньшей мере, два таких компонента. Они могут иметь только два состояния, определяемых свойством Checked.
Флажки. При активизации двойным щелчком мыши CheckBox1 появится процедура TForm1.CheckBox1Click(Sender: TObject);
Задача: При установке флажка текст в Метке1 должен становиться жирным.
Procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if checkbox1.Checked=true
then Label1.font.Style:=font.style+[fsbold]
else Label1.font.Style:=font.style-[fsbold]
end;
То есть, если (if) флажок установлен, (then) текст в Метке1 должен становиться жирным, (else) а при повторном нажатии на флажок – обычным.
Рассмотрим применение таблицы для первого случая, когда необходимо текст в многострочном редакторе сделать жирным при установке флажка и обычным при повторном нажатии.
<Условие> | <Оператор> |
CheckBox1.checked | Memo1.Font.Style:=Memo1.Font.Style+[fsBold] |
Memo1.Font.Style:=Memo1.Font.Style-[fsBold] |
Вставив условия и операторы в шаблон получим:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.checked then
Memo1.Font.Style:=Memo1.Font.Style+[fsBold]
else
Memo1.Font.Style:=Memo1.Font.Style-[fsBold]
end;
Переключатели. Задача: При установке переключателей текст в Метке1 должен становиться желтым либо красным.
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
if RadioButton1.Checked=true then Label1.Font.Color:=clyellow
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
if RadioButton2.Checked=true then Label1.font.Color:=clred
end;
Задания для самостоятельной работы:
Задача 1
Цель работы - создать компьютерную версию одной из головоломок Самуэля Ллойда: из заданного набора чисел надо выбрать те, сумма которых составит 50. Числа, которые избрал Ллойд для своей головоломки: 25, 27, 3, 12, 6, 15, 9, 30, 21, 19.
Выполнить следующие действия:
1. После запуска программы в окне изображается список чисел Ллойда.
2. Выбираем с помощью флажков числа и помещаем в правое окно.
3. Сумма выбранных чисел представлена в виде надписи.
4. Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в строке заголовка.
Описание плана разработки программы
1. Открыть новый проект.
2. Разместить на форме экземпляры компонентов: список флажков CheckListBox, надпись Label, список ListBox.
3. Выполнить следующие действия:
Выделенный объект | Вкладка окна Object Inspector | Имя свойства/ имя события | Действие |
Form1 | Properties | Caption | Установка имени формы «Головоломка» |
BorderStyle | Задайте значение bsSingle | ||
CheckListBox1 (Вкладка Additional) | Properties | Items | Задаем состав списка. Щелкнуть на кнопке построителя. Откроется окно String List editor (Редактор списка строк). Введите в список заданные числа через Enter. Нажмите кнопку OK. |
Height | Подобрать значение так, что все числа поместились в список (без полос прокруток). | ||
Events | OnClickCheck | Описать очистку списка. Проверить, установлен флажок или нет. После обновления списка необходимо подсчитать сумму выбранных чисел. Элементы списка выглядят как числа, но являются текстовыми строками (воспользоваться функцией StrToInt). | |
ListBox1 (Вкладка Standard) | Properties | Height | Подобрать значение так, что все числа поместились в список (без полос прокруток). Первоначально список пуст. Заполняться он будет при работе программы. |
Label1 (Вкладка Standard) | Properties | Caption | Введите текст: «Сумма: 0» |
Autosize | Задайте значение False | ||
Alignment | Задайте значение taCenter |
4. Сохраните проект, запустите и протестируйте его.
Листинг подпрограммы