Калькулятор на паскале windows forms

Некоторые вещи я уже знаю. Я же и начинаю с простого. Не сразу весь функционал виндового калькулятор хочу реализовать, а потихоньку. Вот, та ссылка, что вы мне дали, я проверил код, в PascalABC.NET нет Caption, и как добавлять значение кнопки к текстовому полю я не имею ни малейшего понятия. И кстати, как его сделать Integer именно в ABC.NET я не знаю тоже. Кстати, именно к PascalABC.NET учебников почти нет, а те, которые я нашел, большинство примеров из них работают с ошибками, то есть не компилируется. Поэтому единственный источник знаний практический опыт реальных программистов, с форумов вроде этого. Учебники по простому ABC не подойдут, потому что там редактора Windows Forms нет вообще, да и примеров такого калькулятора я не нашел.

Я пробовал копировать Delphi калькуляторы, но не выходит. Многих простых команд просто нет в ABC.NET, а просто копирование кода никак не способствует его понимаю. Прописные истины я вроде знаю, но вот с графическими объектами работать не умею, этому и хочу научиться. Решил попробовать калькулятор, для начала.
Если поделитесь ссылкой на хорошее разъяснение или какую-то энциклопедию с разъяснением аналогов команд Delphi в ABC.NET, буду благодарен. Потому что именно из-за того, что я такого ничего не нашел, обратился сюда.

За основу можно взять программу из примера 3.16. Разместим в форме три поля TextBox и по одной надписи к каждому из них. Создадим 4 кнопки Button для математических операций над числами. Для каждой кнопки создадим обработчик Click. В каждом обработчике будем проверять, заполнены ли поля компонентов textBox1 и textBox2 (первое и второе число). Вот как выглядит такая проверка:

if (TextBox1.Text <> '') and (TextBox2.Text <> '') then
begin
// тут будет код выполнения математической операции
end
else
MessageBox.Show('Одно из полей не заполнено');

Для полей «первое число» и «второе число» будем использовать преобразования в тип real с помощью функции StrToFloat(), чтобы наш калькулятор мог работать не только с целыми числами, но и с дробными.

Напишем обработчик для кнопки вычисления суммы:

procedure Form1.button1_Click(sender: Object; e: EventArgs);
begin
  var a, b, c : real;
  if (TextBox1.Text <> '') and (TextBox2.Text <> '') then
  begin
    a := StrToFloat(TextBox1.Text);
    b := StrToFloat(TextBox2.Text);
    c := a + b;
    TextBox3.Text := FloatToStr(c);
  end
  else
    MessageBox.Show('Одно из полей не заполнено');
end;

Для кнопки вычисления разности:

procedure Form1.button3_Click(sender: Object; e: EventArgs);
begin
  var a, b, c : real;
  if (TextBox1.Text <> '') and (TextBox2.Text <> '') then
  begin
    a := StrToFloat(TextBox1.Text);
    b := StrToFloat(TextBox2.Text);
    c := a - b;
    TextBox3.Text := FloatToStr(c);
  end
  else
    MessageBox.Show('Одно из полей не заполнено');
end;

Для кнопки произведения:

procedure Form1.button2_Click(sender: Object; e: EventArgs);
begin
  var a, b, c : real;
  if (TextBox1.Text <> '') and (TextBox2.Text <> '') then
  begin
    a := StrToFloat(TextBox1.Text);
    b := StrToFloat(TextBox2.Text);
    c := a * b;
    TextBox3.Text := FloatToStr(c);
  end
  else
    MessageBox.Show('Одно из полей не заполнено');
end;

Для кнопки нахождения частного добавим проверку деления на ноль:

procedure Form1.button4_Click(sender: Object; e: EventArgs);
begin
  var a, b, c : real;
  if (TextBox1.Text <> '') and (TextBox2.Text <> '') then
  begin
    a := StrToFloat(TextBox1.Text);
    b := StrToFloat(TextBox2.Text);
    if b = 0 then
      MessageBox.Show('Делить на ноль нельзя')
    else
    begin
      c := a / b;
      TextBox3.Text := FloatToStr(c);
    end;
  end
  else
    MessageBox.Show('Одно из полей не заполнено');
end;

Скачать готовый проект Pascal: Upr2-3.rar.

Присоединяйтесь к Telegram-группе @superresheba_11,
делитесь своими решениями и пользуйтесь материалами, которые присылают другие участники группы!

5.6. Создание приложения «Калькулятор»

Создание калькулятора начнем с конструирования формы. На ней нужно разместить: поле Edit для ввода/вывода чисел, 10 кнопок с цифрами, 4 кнопки с арифметическими действиями, кнопку «=» и кнопку «С» — очистить (пример 5.24).

При нажатии на кнопку с цифрой программа должна дописать эту цифру к числу в поле Edit. При нажатии на кнопку с арифметическим действием нужно запомнить число, которое в данный момент находится в поле Edit, и очистить поле для ввода второго числа. Числа будем хранить в двух переменных n1, n2 типа integer. Знак операции будем хранить в переменной znak типа char. Переменные описываются как глобальные. При нажатии на кнопку «=» выполняется арифметическое действие и выводится результат.

Для отображения кнопок можно использовать компонент BitBtn, тогда кнопки могут содержать рисунок на поверхности (например, изображения с цифрами). Свойство для размещения рисунка — Glyph.

Установить значение bsDialog для свойства BorderStyle формы. В этом случае граница формы не позволит менять ее размеры.

Коды процедур обработчиков приведены в примере 5.25.

Для каждой кнопки на форме нужно создать обработчик события OnClick.

Обработчики событий для всех цифровых кнопок будут идентичны.

Обработчики для кнопок арифметических действий будут отличаться только значением запоминаемой операции.

Основные вычисления происходят в обработчике кнопки «=». Преобразуем в число n2 значение поля Edit и выполняем арифметическую операцию в зависимости от значения переменной znak. После этого обнуляем переменные.

В обработчике кнопки «С» (от англ. clear — очистить) происходит обнуление переменных и очистка поля Edit.

Окно работающего приложения показано в примере 5.26.

Созданный калькулятор имеет большое количество ограничений в своей работе, поскольку рассчитан на вычисления только с натуральными числами.

Пример 5.24. Форма на этапе конструирования:

Пример 5.25. Обработчики событий:

//описание глобальных переменных

var n1, n2: integer;

    znak: char;

procedure TForm1.BitBtn10Click(Sender: TObject);

begin

  //приписывание цифры к числу

  Edit1.Text := Edit1.Text + ‘0’;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

  //приписывание цифры к числу

  Edit1.Text := Edit1.Text + ‘1’;

end;

Для остальных цифровых кнопок нужно изменить только ‘1’ на соответствующую цифру.

procedure TForm1.BitBtn11Click(Sender: TObject);

begin

  n1 := StrToInt(Edit1.Text);

  //запоминание знака операции

  znak := ‘+’;

  Edit1.Clear;

end;

Для остальных кнопок со знаками арифметических действий нужно изменить только ‘+’ на соответствующий знак.

procedure TForm1.BitBtn15Click(Sender: TObject);

begin

  n2 := StrToInt(Edit1.Text);

  case znak of

    ‘+’: Edit1.Text := IntToStr(n1 + n2);

    ‘-‘: Edit1.Text := IntToStr(n1 — n2);

    ‘*’: Edit1.Text := IntToStr(n1 * n2);

    ‘/’: Edit1.Text := IntToStr(n1 div n2);

  end;

  n1 := 0;

  n2 := 0;

  znak := ‘ ‘;

end;

procedure TForm1.BitBtn16Click(Sender: TObject);

begin

  Edit1.Clear;

  n1 := 0;

  n2 := 0;

   znak :=‘ ‘;

end;

Пример 5.26. Работающее приложение:

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ № 17

ТЕМА: Проектирование интерфейса с использованием

элементов управления: кнопок, надписей, текстового поля

и др.

ЦЕЛЬ: Сформировать умения создавать приложения в

Pascal Windows Forms.

1. Последовательность выполнения практического занятия.

1.1. Работа на учебном занятии

а. Выполнить практические задания.

б. Показать результаты работы преподавателю и при необходимости

сохранить их в свою рабочую папку на ПК.

в. Убрать рабочее место.

г. Оформить отчёт.

2. Методические указания

Упражнение 1.

Создать проект, в котором пользователь сможет ввести число,

получить его значение в квадрате и квадратный корень из этого числа.

Этапы выполнения задания

1. Создадим в новой папке (Primer171) новый проект (Project171).

2. Изменить свойство Text у формы на «Квадрат и корень».

3. Изменить свойство Size440; 360.

4. Для того что бы форма открывалась в центре экрана

свойство StartPosition установите CenterScreen.

5. Разместить на форме

три объекта – Label1, Label2, Label3;

три объека TextBox1, TextBox2, TextBox3;

и кнопку (объект Button1):

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

  • Данный модуль является устаревшим (может быть в будущем исключен из среды) и специфическим для PascalABC.NET и не поддерживается другими диалектами Pascal и остальными языками. Современный аналог — Controls.
  • Программы с использованием 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) — класс кнопки. Для ее создания пишите:

, где:

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

CheckBox[править]

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

, где:

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

  • true — установлен
  • false — не установлен

RadioButton[править]

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

, где:

  • {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) — класс многострочного поля ввода для строк. Для его создания пишите:

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

TrackBar[править]

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

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

TextLabel[править]

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

, где:

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

ListBox[править]

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

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

ComboBox[править]

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

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

MainMenu[править]

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.

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.

  • Камера для windows 10 корпоративная
  • Калькулятор на си шарп windows form
  • Калькулятор в операционной системе windows
  • Калькулятор на ноутбуке как включить windows 10
  • Камера на ноуте не работает windows 10