Введение в FormsABC

FormsABC - учебный модуль PascalABC.NET для работы простейшим оконными приложениями без дизайнера форм. Основан на устаревшей технологии Windows Forms.

Обратите внимание на то, что:

  • Данный модуль является специфическим для PascalABC.NET и не поддерживается другими диалектами Pascal и остальными языками.
  • Программы с использованием FormsABC рекомендуется запускать без связи с оболочкой.



Основные классыПравить

FormsABC содержит следующие классы элементов управления формы:

  1. Button (кнопка) [аналог в Windows Forms]
  2. CheckBox (флажок) [аналог в Windows Forms]
  3. RadioButton (радио-кнопка) [аналог в Windows Forms]
  4. IntegerField (поле ввода целых значений) [аналог в Windows Forms]
  5. RealField (поле ввода вещественных значений) [аналог в Windows Forms]
  6. Field (поле ввода строк) [аналог в Windows Forms]
  7. TextBox (многострочное текстовое поле) [аналог в Windows Forms]
  8. TrackBar (ползунок) [аналог в Windows Forms]
  9. TextLabel (метка) [аналог в Windows Forms]
  10. ListBox (список) [аналог в Windows Forms]
  11. ComboBox (разворачивающийся список) [аналог в Windows Forms]
  12. MainMenu (главное меню) [аналог в Windows Forms]

ButtonПравить

Button (наследуется от Object) - класс кнопки. Для ее создания пишите:

new Button({text});

, где:

  • {text} - текст на кнопке
Свойство Значение
Text Текст на кнопке.
Width Ширина кнопки.
Событие Значение
Click Ссылка на процедуру, которая выполняется при нажатии на кнопку. Для установки его значения используйте +=.

CheckBoxПравить

CheckBox (наследуется от Object) - класс флажка. Для его создания пишите:

new CheckBox({text});

, где:

  • {text} - текст, относящийся к флажку
Свойство Значение
Checked Значение, указывающее установлен ли флажок.
  • true - установлен
  • false - не установлен

RadioButtonПравить

RadioButton (наследуется от Object) - класс радио-кнопки. Для её создания пишите:

new RadioButton({text});

, где:

  • {text} - текст, относящийся к радио-кнопке
Свойство Значение
Checked Значение, указывающее выбрана ли радио-кнопка.
  • true - выбрана
  • false - не выбрана

IntegerFieldПравить

IntegerField (наследуется от Field) - класс однострочного поля ввода для целых чисел. Для его создания пишите:

new IntegerField({text}, {width});

, где:

  • {text} - текст, относящийся к полю
  • {width} - ширина поля
Свойство Значение
FieldWidth Ширина поля.
Text Текст, отображаемый над полем.
Value Число, находящееся в поле.
Событие Описание
TextChanged Ссылка на процедуру, которая выполняется при смене значения поля. Для установки его значения используйте вместо +=.

RealFieldПравить

RealField (наследуется от Field) - класс однострочного поля ввода для вещественных чисел. Для его создания пишите:

new RealField({text}, {width});

, где:

  • {text} - текст, относящийся к полю
  • {width} - ширина поля
Свойство Значение
FieldWidth Ширина поля.
Text Текст, отображаемый над полем.
Value Число, находящееся в поле.
Событие Описание
TextChanged Ссылка на процедуру, которая выполняется при смене значения поля. Для установки его значения используйте +=.

FieldПравить

Field (наследуется от Object) - класс однострочного поля ввода для строк. Для его создания пишите:

new Field({text}, {width});

, где:

  • {text} - текст, относящийся к полю
  • {width} - ширина поля
Свойство Значение
FieldWidth Ширина поля.
Text Строка, который содержится в поле ввода.
Событие Описание
TextChanged Ссылка на процедуру, которая выполняется при смене значения поля. Для установки его значения используйте +=.

TextBoxПравить

TextBox (наследуется от BaseDockControl) - класс многострочного поля ввода для строк. Для его создания пишите:

new TextBox();
Свойство Значение
Width Ширина поля.
Height Высота поля.
Text Строка, которая содержится в поле ввода.
Метод Описание
Undo() Отменяет последнее изменение.
Redo() Отменяет отмену последнего изменения.
Cut() Вырезает выделенное.
Copy() Копирует выделенное.
Paste() Вставляет текст из буфера обмена в местоположение курсора.
AddLine({text}) Добавляет текст {text} новой строкой.

TrackBarПравить

TrackBar (наследуется от Object) - класс ползунка. Для его создания пишите:

new TrackBar();
Свойство Значение
Frequency Расстояние через которое расставляются деления на ползунке (в пикселях).
Minimum Минимальное значение ползунка.
Maximum Максимальное значение ползунка.
Value Значение ползунка.
Событие Описание
ValueChanged Хранит ссылку на процедуру, которая выполняется при смене значения ползунка. Для установки его значения используйте +=.

TextLabelПравить

TextLabel (наследуется от Object) - класс метки. Для её создания пишите:

new TextLabel({text});

, где:

  • {text} - текст метки

ListBoxПравить

ListBox (наследуется от Object) - класс списка. Для его создания пишите:

new ListBox();
Свойство Значение
Count Количество элементов в списке.
SelectedIndex Индекс выбранного элемента списка.
SelectedItem Выбранный элемент списка.
Items.Item[k] K-ый элемент списка.
Событие Описание
Click Хранит ссылку на процедуру, которая выполнится при щелчке по списку. Для установки его значения используйте +=.
SelectedIndexChanged Хранит ссылку на процедуру, которая выполнится при смене выбранного элемента списка. Для установки его значения используйте +=.
Метод Описание
Items.Add(t) Добавляет в список элемент с текстом t на нем.
Items.Clear() Удаляет все элементы списка.

ComboBoxПравить

ComboBox (наследуется от Object) - класс списка. Для его создания пишите:

new ComboBox();
Свойство Значение
Width Ширина списка.
Count Количество элементов в списке.
SelectedIndex Индекс выбранного элемента списка.
SelectedItem Выбранный элемент списка.
Items.Item[k] K-ый элемент списка.
Событие Описание
Click Хранит ссылку на процедуру, которая выполнится при щелчке по списку. Для установки его значения используйте +=.
SelectedIndexChanged Хранит ссылку на процедуру, которая выполнится при смене выбранного элемента списка. Для установки его значения используйте +=.
Метод Описание
Items.Add(t) Добавляет в список элемент с текстом t на нем.
Items.Clear() Удаляет все элементы списка.

MainMenuПравить

MainMenu (наследуется от Object) - класс главного меню. Для его создания пишите:

new MainMenu();
Свойство Значение
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.

Max-Min калькуляторПравить

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.