- Минимальная программа на PascalABC.NET, создающая форму
{$reference 'System.Windows.Forms.dll'} {$reference 'System.Drawing.dll'}
uses System, System.Windows.Forms; var f : Form; begin f := new Form; Application.Run(f); end.
- Как добавить кнопку на форму и вывести по ее нажатии сообщение?
{$reference 'System.Windows.Forms.dll'} {$reference 'System.Drawing.dll'} uses System, System.Windows.Forms; var f : Form; btn : Button; procedure ButtonClick(sender: object; e: EventArgs); begin MessageBox.Show('Hello world!'); end; begin f := new Form; btn := new Button; btn.Text := 'Click me'; btn.Click += ButtonClick; f.Controls.Add(btn); Application.Run(f); end.
Материал из Викиучебника — открытых книг для открытого мира
FormsABC — учебный модуль PascalABC.NET для работы с простейшими оконными приложениями без дизайнера форм. Основан на устаревшей технологии Windows Forms.
- Данный модуль является устаревшим (может быть в будущем исключен из среды) и специфическим для PascalABC.NET и не поддерживается другими диалектами Pascal и остальными языками. Современный аналог — Controls.
- Программы с использованием FormsABC рекомендуется запускать без связи с оболочкой.
FormsABC содержит следующие классы элементов управления формы:
- Button (кнопка) [аналог в Windows Forms]
- CheckBox (флажок) [аналог в Windows Forms]
- RadioButton (радио-кнопка) [аналог в Windows Forms]
- IntegerField (поле ввода целых значений) [аналог в Windows Forms]
- RealField (поле ввода вещественных значений) [аналог в Windows Forms]
- Field (поле ввода строк) [аналог в Windows Forms]
- TextBox (многострочное текстовое поле) [аналог в Windows Forms]
- TrackBar (ползунок) [аналог в Windows Forms]
- TextLabel (метка) [аналог в Windows Forms]
- ListBox (список) [аналог в Windows Forms]
- ComboBox (разворачивающийся список) [аналог в Windows Forms]
- MainMenu (главное меню) [аналог в Windows Forms]
Button (наследуется от Object) — класс кнопки. Для ее создания пишите:
, где:
- {text} — текст на кнопке
Свойство | Значение |
---|---|
Text | Текст на кнопке. |
Width | Ширина кнопки. |
Событие | Значение |
---|---|
Click | Ссылка на процедуру, которая выполняется при нажатии на кнопку. Для установки его значения используйте +=. |
CheckBox (наследуется от Object) — класс флажка. Для его создания пишите:
, где:
- {text} — текст, относящийся к флажку
Свойство | Значение |
---|---|
Checked | Значение, указывающее установлен ли флажок.
|
RadioButton (наследуется от Object) — класс радио-кнопки. Для её создания пишите:
, где:
- {text} — текст, относящийся к радио-кнопке
Свойство | Значение |
---|---|
Checked | Значение, указывающее выбрана ли радио-кнопка.
|
IntegerField (наследуется от Field) — класс однострочного поля ввода для целых чисел. Для его создания пишите:
new IntegerField({text}, {width});
, где:
- {text} — текст, относящийся к полю
- {width} — ширина поля
Свойство | Значение |
---|---|
FieldWidth | Ширина поля. |
Text | Текст, отображаемый над полем. |
Value | Число, находящееся в поле. |
Событие | Описание |
---|---|
TextChanged | Ссылка на процедуру, которая выполняется при смене значения поля. Для установки его значения используйте вместо +=. |
RealField (наследуется от Field) — класс однострочного поля ввода для вещественных чисел. Для его создания пишите:
new RealField({text}, {width});
, где:
- {text} — текст, относящийся к полю
- {width} — ширина поля
Свойство | Значение |
---|---|
FieldWidth | Ширина поля. |
Text | Текст, отображаемый над полем. |
Value | Число, находящееся в поле. |
Событие | Описание |
---|---|
TextChanged | Ссылка на процедуру, которая выполняется при смене значения поля. Для установки его значения используйте +=. |
Field (наследуется от Object) — класс однострочного поля ввода для строк. Для его создания пишите:
new Field({text}, {width});
, где:
- {text} — текст, относящийся к полю
- {width} — ширина поля
Свойство | Значение |
---|---|
FieldWidth | Ширина поля. |
Text | Строка, который содержится в поле ввода. |
Событие | Описание |
---|---|
TextChanged | Ссылка на процедуру, которая выполняется при смене значения поля. Для установки его значения используйте +=. |
TextBox (наследуется от BaseDockControl) — класс многострочного поля ввода для строк. Для его создания пишите:
Свойство | Значение |
---|---|
Width | Ширина поля. |
Height | Высота поля. |
Text | Строка, которая содержится в поле ввода. |
Метод | Описание |
---|---|
Undo() | Отменяет последнее изменение. |
Redo() | Отменяет отмену последнего изменения. |
Cut() | Вырезает выделенное. |
Copy() | Копирует выделенное. |
Paste() | Вставляет текст из буфера обмена в местоположение курсора. |
AddLine({text}) | Добавляет текст {text} новой строкой. |
TrackBar (наследуется от Object) — класс ползунка. Для его создания пишите:
Свойство | Значение |
---|---|
Frequency | Расстояние через которое расставляются деления на ползунке (в пикселях). |
Minimum | Минимальное значение ползунка. |
Maximum | Максимальное значение ползунка. |
Value | Значение ползунка. |
Событие | Описание |
---|---|
ValueChanged | Хранит ссылку на процедуру, которая выполняется при смене значения ползунка. Для установки его значения используйте +=. |
TextLabel (наследуется от Object) — класс метки. Для её создания пишите:
, где:
- {text} — текст метки
ListBox (наследуется от Object) — класс списка. Для его создания пишите:
Свойство | Значение |
---|---|
Count | Количество элементов в списке. |
SelectedIndex | Индекс выбранного элемента списка. |
SelectedItem | Выбранный элемент списка. |
Items.Item[k] | K-ый элемент списка. |
Событие | Описание |
---|---|
Click | Хранит ссылку на процедуру, которая выполнится при щелчке по списку. Для установки его значения используйте +=. |
SelectedIndexChanged | Хранит ссылку на процедуру, которая выполнится при смене выбранного элемента списка. Для установки его значения используйте +=. |
Метод | Описание |
---|---|
Items.Add(t) | Добавляет в список элемент с текстом t на нем. |
Items.Clear() | Удаляет все элементы списка. |
ComboBox (наследуется от Object) — класс списка. Для его создания пишите:
Свойство | Значение |
---|---|
Width | Ширина списка. |
Count | Количество элементов в списке. |
SelectedIndex | Индекс выбранного элемента списка. |
SelectedItem | Выбранный элемент списка. |
Items.Item[k] | K-ый элемент списка. |
Событие | Описание |
---|---|
Click | Хранит ссылку на процедуру, которая выполнится при щелчке по списку. Для установки его значения используйте +=. |
SelectedIndexChanged | Хранит ссылку на процедуру, которая выполнится при смене выбранного элемента списка. Для установки его значения используйте +=. |
Метод | Описание |
---|---|
Items.Add(t) | Добавляет в список элемент с текстом t на нем. |
Items.Clear() | Удаляет все элементы списка. |
MainMenu (наследуется от Object) — класс главного меню. Для его создания пишите:
Свойство | Значение |
---|---|
Item | Пункт меню. |
Метод | Описание |
---|---|
Add({items}) | Добавляет перечисленные через запятую пункты меню. |
Размещение элементов управления формы
[править]
Изначально элементы управления формы размещаются по порядку — каждый следующий позиционируется справа от предыдущего.
Функция | Значение |
---|---|
LineBreak | Переходит на новую строку. |
EmptyLine | Пропускает n пикселей по вертикали. Следующий элемент управления будет располагаться через n пикселей по вертикали от предыдущего. |
EmptySpace | Пропускает n пикселей по горизонтали. Следующий элемент управления будет располагаться через n пикселей по горизонтали от предыдущего. |
Настраивать главную форму можно через глобальную переменную mainForm.
Свойство | Значение |
---|---|
Title | Заголовок окна. |
Width | Ширина окна. |
Height | Высота окна. |
Left | Отступ окна от верхнего края экрана в пикселях. |
Top | Отступ окна от левого края экрана в пикселях. |
IsFixedSize | Значение, указывающее имеет ли окно фиксированный размер. |
Метод | Описание |
---|---|
mainForm.SetSize(x, y) | Устанавливает размер формы, равный xxy пикселей. |
mainForm.CenterOnScreen() | Центрирует окно относительно центра экрана. |
uses System; uses FormsABC; const Sum = '+'; Difference = '-'; Multiplication = '*'; Division = '/'; begin mainForm.Width := 350; mainForm.Height := 120; mainForm.Title := 'Calculator'; mainForm.IsFixedSize := true; var first := new IntegerField('First:', 100); var second := new IntegerField('Second:', 100); var result := new IntegerField('Result:', 100); LineBreak(); var actions := new ComboBox(); actions.Items.Add(Sum); actions.Items.Add(Difference); actions.Items.Add(Multiplication); actions.Items.Add(Division); actions.SelectedIndex := 0; var calculate := new Button('Calculate'); calculate.Click += () -> try case actions.SelectedValue.ToString()[1] of Sum: result.Value := first.Value + second.Value; Difference: result.Value := first.Value - second.Value; Multiplication: result.Value := first.Value * second.Value; Division: if second.Value <> 0 then result.Value := first.Value div second.Value; end; except on Exception do end; end.
uses System; uses FormsABC; const Max = 'Max'; Min = 'Min'; Average = 'Average'; begin mainForm.Width := 350; mainForm.Height := 120; mainForm.Title := 'Calculator'; mainForm.IsFixedSize := true; var first := new IntegerField('First:', 100); var second := new IntegerField('Second:', 100); var result := new IntegerField('Result:', 100); LineBreak(); var actions := new ComboBox(); actions.Items.Add(Max); actions.Items.Add(Min); actions.Items.Add(Average); actions.SelectedIndex := 0; var calculate := new Button('Calculate'); calculate.Click += () -> try case actions.SelectedValue.ToString() of Max: result.Value := Math.Max(first.Value, second.Value); Min: result.Value := Math.Min(first.Value, second.Value); Average: result.Value := (first.Value + second.Value) div 2; end; except on Exception do end; end.
uses FormsABC; const Push = 'Push'; Pop = 'Pop'; Peek = 'Peek'; begin mainForm.Width := 350; mainForm.Height := 120; mainForm.Title := 'Stack demostration'; mainForm.IsFixedSize := true; var source := new Stack<integer>(); var item := new IntegerField('Item:', 100); var result := new Field('Result:', 220); LineBreak(); var actions := new ComboBox(); actions.Items.Add(Push); actions.Items.Add(Pop); actions.Items.Add(Peek); actions.SelectedIndex := 0; var show := new Button('Show'); show.Click += () -> begin var stackToString: Func<Stack<integer>, string> := from -> begin result := string.Empty; foreach var item in from do result += $'{item} '; end; case actions.SelectedValue.ToString() of Push: source.Push(item.Value); Pop: if source.Count > 0 then source.Pop(); Peek: if source.Count > 0 then source.Peek(); end; result.Text := stackToString(source); end; end.
uses System; uses System.IO; uses FormsABC; begin mainForm.Width := 640; mainForm.Height := 400; mainForm.Title := 'Text Editor'; var menu := new MainMenu(); parentControl := mainForm; var editor := new TextBox(); editor.Dock := DockStyle.Fill; menu.Add('File', 'Edit'); menu[0].Add('Save', procedure (item) -> begin var dialog := new SaveFileDialog(); if dialog.ShowDialog() = DialogResult.OK then &File.WriteAllLines(dialog.FileName, editor.Text.Split(|'\n'|, StringSplitOptions.RemoveEmptyEntries)); end); menu[0].Add('Open', procedure (item) -> begin var dialog := new OpenFileDialog(); if dialog.ShowDialog() = DialogResult.OK then begin editor.Text := string.Empty; foreach var line in &File.ReadAllLines(dialog.FileName) do editor.Text += $'{line}{Environment.NewLine}'; end; end); menu[0].Add('Exit', procedure (item) -> mainForm.Close()); menu[1].Add('Undo', procedure (item) -> editor.Undo()); menu[1].Add('Redo', procedure (item) -> editor.Redo()); menu[1].Add('Copy', procedure (item) -> editor.Copy()); menu[1].Add('Cut', procedure (item) -> editor.Cut()); menu[1].Add('Clear', procedure (item) -> editor.Text := string.Empty); end.
1. Какие элементы среды PascalABC отображаются на экране после создания проекта?
2. Какие файлы входят в состав приложения, создаваемого в PascalABC?
3. Для чего предназначена форма?
4. Для чего используют инспектор объектов?
5. Какие свойства форм вы можете назвать?
6. Как создать обработчик события?
Упражнения
1. Внесите изменения в проект из примера 2.11 так, чтобы цвет формы менялся случайно. Изменять цвет можно с помощью функции FromArgb. У этой функции четыре параметра: прозрачность (альфа-канал, интенсивность красного цвета, интенсивность зеленого цвета, интенсивность синего цвета). Генерация случайных чисел происходит следующим образом. Сначала создается переменная, являющаяся объектом класса Random (команда var rnd: Random := new Random();). Каждое новое случай ное число можно получить, обращаясь к методу next(x), где x задает полуинтервал [0, x). Команда смены цвета будет выглядеть следующим образом:
BackColor := Color.FromArgb (255, rnd.next(256), rnd.next(256), rnd.next(256));
2. Создайте проект, в котором при двойном клике мыши по форме ее размеры будут увеличиваться на 5.
- Создайте и сохраните в новой папке проект.
- Измените свойство Text формы на Упражнение 2.
- Создайте обработчик события мыши DblClick.
- Для изменения ширины и высоты формы можно воспользоваться командами:
Width := Width + 5;
Height := Height + 5;
- Сохраните изменения в проекте.
- Запустите проект и проверьте его работу.
3. Создайте проект, в котором цвет формы будет меняться при наведении на нее мыши, например с желтого на зеленый.
- Измените свойство Text у формы на Упражнение 3.
- Установите желтый цвет формы.
- Создайте обработчики для двух событий мыши: MouseEnter и MouseLeave.
- В коде события MouseEnter установите зеленый (Green) цвет формы, а коде события MouseLeave — желтый (Yellow).
- Сохраните изменения в проекте.
- Запустите проект и проверьте его работу.
Проверь себя
1. Разработка приложения Windows Forms на PascalABC для расчета стоимости товара и использование структуры алгоритма расчета на
странице сайта
организации
Выполнил ученик 10А класса
ГБОУ СОШ №72
Герасимов Андрей
Санкт-Петербург, 2018 г.
2. Цель проекта:
Изучить принципы разработки приложения Windows Forms и создать
приложение, имеющее конкретную практическую направленность.
Приложение должно выполнять функцию калькулятора для расчета
стоимости товара. В частности стоимость заказа кухонного фартука из
стекла с дополнительными видами работ.
Данное приложение имеет реальную практическую ценность, так как
часто используется организациями, магазинами для того, чтобы
сориентировать покупателя о его затратах.
3. Задачи проекта:
Создать приложение, выполняющее роль калькулятора для расчета
стоимости товара. Для этого:
Изучить создание приложений Wimdows Forms на PascalABC.Net
Ознакомиться с основными элементами управления Form (Форма),
Button (Кнопка), RadioButton (РадиоКнопка), CheckBox (Флажок), TextBox
(Текстовое поле), Label (Метка), PictureBox (Картинка)
Провести анализ задачи, составить математическую модель,
реализовать модель в среде программирования
4. Входные данные:
Стекло бывает бесцветное и осветленное. От этого зависит стоимость. 1м.кв.
бесцветного стекла стоит, например, 4000 руб. 1 м.кв. осветленного стекла стоит
5000 руб.
Пользователь вводит длину (a) и ширину (b) необходимого ему стекла в см. Задача
приложения перевести эти значения в метры и вычислить итоговую площадь S.
Если необходим замер, то к общей стоимости price прибавляется 1000 руб.
Если необходима доставка, то к общей стоимости price прибавляется 1500 руб.
Если необходима установка стекла, то к общей стоимости price прибавляется 1000 х
S руб., т.к. установка зависит от общей площади стекла.
Если необходим дизайн изображения, то к общей стоимости price прибавляется 500
руб.
Затем полученное значение price надо вывести в текстовое поле, в котором должна
отражаться итоговая сумма.
5. Макет формы приложения
6. Фрагмент кода программы
7. Разработанное приложение
Программа скомпилирована и
работает как отдельное независимое
приложение
8. Web-приложение на сайте
http://fartukvdom.ru/index.php/raschet
9. Итоги проекта
Изучено создание приложений Wimdows Forms на
PascalABC.Net
Ознакомились с основными элементами управления Form
(Форма), Button (Кнопка), RadioButton (РадиоКнопка),
CheckBox (Флажок), TextBox (Текстовое поле), Label (Метка),
PictureBox (Картинка)
Проведен анализ задачи, составлена математическая
модель и реализована в среде программирования
Создано приложение, выполняющее роль калькулятора для
расчета стоимости товара