Некоторые вещи я уже знаю. Я же и начинаю с простого. Не сразу весь функционал виндового калькулятор хочу реализовать, а потихоньку. Вот, та ссылка, что вы мне дали, я проверил код, в 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. Изменить свойство Size — 440; 360.
4. Для того что бы форма открывалась в центре экрана
свойство StartPosition установите CenterScreen.
5. Разместить на форме
три объекта – Label1, Label2, Label3;
три объека – TextBox1, TextBox2, TextBox3;
и кнопку (объект Button1):
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[править]
Button (наследуется от Object) — класс кнопки. Для ее создания пишите:
, где:
- {text} — текст на кнопке
Свойство | Значение |
---|---|
Text | Текст на кнопке. |
Width | Ширина кнопки. |
Событие | Значение |
---|---|
Click | Ссылка на процедуру, которая выполняется при нажатии на кнопку. Для установки его значения используйте +=. |
CheckBox[править]
CheckBox (наследуется от Object) — класс флажка. Для его создания пишите:
, где:
- {text} — текст, относящийся к флажку
Свойство | Значение |
---|---|
Checked | Значение, указывающее установлен ли флажок.
|
RadioButton[править]
RadioButton (наследуется от Object) — класс радио-кнопки. Для её создания пишите:
, где:
- {text} — текст, относящийся к радио-кнопке
Свойство | Значение |
---|---|
Checked | Значение, указывающее выбрана ли радио-кнопка.
|
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.