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 |
Текст на кнопке.
|
Width |
Ширина кнопки.
|
Событие |
Значение
|
Click |
Ссылка на процедуру, которая выполняется при нажатии на кнопку. Для установки его значения используйте +=.
|
CheckBox (наследуется от Object) - класс флажка. Для его создания пишите:
, где:
- {text} - текст, относящийся к флажку
Свойство |
Значение
|
Checked |
Значение, указывающее установлен ли флажок.
- true - установлен
- false - не установлен
|
RadioButton (наследуется от Object) - класс радио-кнопки. Для её создания пишите:
, где:
- {text} - текст, относящийся к радио-кнопке
Свойство |
Значение
|
Checked |
Значение, указывающее выбрана ли радио-кнопка.
- true - выбрана
- false - не выбрана
|
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) - класс метки. Для её создания пишите:
, где:
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.