C++ Builder - вопросы программирования

         

Простейшая обработка события onclick на



Листинг 2.1.

Простейшая обработка события onclick на кнопке Вычислить

void__fastcall TForml::ButtonlClick(TObject *Sender) { float u; // напряжение float r; // сопротивление float i; // ток // получить данные из полей ввода u = StrToFloat(Editl->
Text);
r = StrToFloat(Edit2->
Text);
// вычислить ток i = u/r; // вывести результат в поле метки Label4->
Caption = "Ток : " + FloatToStrF(i,ffGeneral,7,2) + "А"; }
Функция Button1Click выполняет расчет силы тока и выводит результат расчета в поле Label4. Исходные данные вводятся из полей редактирования Edit1 и Edit2 путем обращения к свойству Text. Свойство Text содержит строку символов, которую ввел пользователь. Чтобы программа работала правильно, пользователь должен ввести в каждое поле редактирования целое или дробное число в правильном формате (при вводе дробного числа для разделения целой и дробной частей надо использовать запятую). Так как поле редактирования содержит текст (свойство Text строкового типа), необходимо выполнить преобразование строки в число. Эту задачу решает функция strToFloat, которой в качестве параметра передается содержимое поля редактирования — значение свойства Text (Edit1->
Text — это содержимое поля Edit1). Функция strToFloat проверяет символы строки, переданной ей в качестве параметра, на допустимость и, если все символы верные, возвращает значение, соответствующее строке, полученной в качестве параметра.

После того как исходные данные будут помещены в переменные u и r, выполняется расчет.

Вычисленная величина силы тока выводится в поле Label4 путем присваивания значения свойству Caption. Для преобразования числа в строку символов (свойство Caption— строкового типа) используется функция FloatToStrF.

В листинге 2.2 приведена процедура обработки события onclick на командной кнопке Завершить. Создается она точно так же, как и процедура обработки события onclick для командной кнопки Вычислить. В результате щелчка на кнопке Завершить программа должна завершить работу. Чтобы это произошло, надо закрыть окно программы. Делает это метод close.



Листинг 2.2.

Процедура обработки события Onclick на кнопке Завершить
void __fastcall TForml::Button2Click(TObject*Sender) { Forml->
Close();
}

 




Листинг 2.3.

Обработка исключений
void __fastcall TForml::ButtonlClick(TObject *Sender) { float u; // напряжение float r; // сопротивление float i; // ток // получить данные из полей ввода // возможно исключение — ошибка преобразования строки в число try { u = StrToFloat(Editl->
Text);
г = StrToFloat(Edit2->
Text);
} catch (EConvertError &e) ( ShowMessage("При вводе дробных чисел используйте запятую.");
return; } // вычислить ток // возможно исключение — деление на ноль try { i = u/r; } catch (EZeroDivide &e) { ShowMessage("Величина сопротивления не должна быть равна нулю");
Edit2->
SetFocus();
// курсор а поле Сопротивление return; } // вывести результат в поле метки Label4->
Caption = "Ток : " + FloatToStrF(i,ffGeneral,7,3);
}
В приведенной функции для вывода сообщений в случае возникновения исключений использована функция ShowMessage, которая выводит на экран окно с текстом и командной кнопкой ОК. Инструкция вызова функции ShowMessage выглядит так: ShowMessage(Сообщение) ;

Где сообщение — строковая константа (текст, который надо вывести). На Рисунок 2.36 приведен вид окна сообщения, полученного в результате выполнения инструкции: ShowMessage("Величина сопротивления не должна быть равна нулю.");




Листинг 2.4.

Функции обработки событий на компонентах формы программы "Сила тока"
// щелчок на кнопке Вычислить void__fastcall TForml::ButtonlClick(TObject *Sender) { float u; // напряжение float r; // сопротивление float i; // ток // проверим, введены ли данные в поля Напряжение и Сопротивление if ( ((Editl-XText).Length() == 0) || ((Edit2->
Text).Length() ==0)) { MessageDlg("Haдo ввести напряжение и сопротивление", mtlnformation, TMsgDlgButtons() if ((Editl->
Text).Length() == 0) Edit1->
SetFocus();
// курсор в поле Напряжение else Edit2->
SetFocus();
// курсор в поле Сопротивление return; }; // получить данные из полей ввода u = StrToFloat(Editl->
Text) ; r = StrToFloat(Edit2->
Text);
// вычислить силу тока try { i = u/r; } catch (EZeroDivide &e) { ShowMessage("Величина сопротивления не должна быть равна нулю");
Edit2->
SetFocus();
// курсор в поле Сопротивление return; } // вывести результат в поле Label4 Label4->
Caption = "Ток : " + FloatToStrF(i,ffGeneral,7,2) + " А"; } // нажатие клавиши в поле Напряжение void __fastcall TForml::EditlKeyPress(TObject *Sender, char SKey) { // коды запрещенных клавиш заменим нулем, в результате // символы этих клавиш в поле редактирования не появятся // Key — код нажатой клавиши // проверим, является ли символ допустимым if ( ( Key >
= '0') && ( Key <= '9'}) // цифра return; // Глобальная переменная DecimalSeparator // содержит символ, используемый в качестве разделителя // при записи дробных чисел if ( Key == DecimalSeparator) { if ( (Editl-XText).Pos(DecimalSeparator) != 0) Key =0; // разделитель уже введен return; } if (Key == VK_BACK) // клавиша <Backspace>
return; if ( Key == VK_RETURN) // клавиша <Enter>
{ Edit2->
SetFocus() ; return; }; // остальные клавиши запрещены Key =0; // не отображать символ } // нажатие клавиши в поле Сопротивление void__fastcall TForml::Edit2KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if ( ( Key >
= '0') && ( Key <= '9')) // цифра return; if ( Key == DecimalSeparator) { if ( (Edit2->
Text).Pos(DecimalSeparator) != 0) Key =0; // разделитель уже введен return; } if (Key == VK_BACK) // клавиша <Backspace>
return; < if ( Key == VK_RETORN) // клавиша <Enter>
( Buttonl->
SetFocus();
// переход к кнопке Вычислить // повторное нажатие клавиши <Enter>
// активизирует процесс вычисления тока return; }; // остальные клавиши запрещены Key = 0; //не отображать символ } // щелчок на кнопке Завершить void __fastcall TForml::Button2Click(TObject *Sender) { Forml->
Close();
// закрыть форму приложения }
 




Листинг 2.5.

Главный модуль (Amper.cpp)
#include <vcl.h>
#pragma hdrstop USEFORM("Amper_l.cpp", Forml);
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->
Initialize();
Application->
Title = "Сила тока"; Application->
CreateForm(__classid(TForml), SForml);
Application->
Run();
} catch (Exception Sexception) { Application->
ShowException(Sexception);
} catch (...) { try { throw Exception("");
} catch (Exception Sexception) { Application->
ShowException(Sexception);
} } return 0; }
Начинается главный модуль директивами компилятору (точнее, препроцессору). Директива #include <vci,h>
информирует компилятор, что перед тем как приступить непосредственно к компиляции, в текст главного модуля нужно включить заголовочный файл библиотеки визуальных компонентов — vcl.h. Строка USEFORM("Amper_i.cpp", Form1) указывает, что в проект нужно включить файл модуля формы Amper_l.cpp, который содержит функции обработки событий для формы Form1. Далее следует описание главной функции программы — winMain. Функция winMain инициализирует внутренние структуры программы, создает форму Formi и запускает программу, что приводит к появлению на экране стартовой формы. Так как в проекте "Сила тока" только одна форма, то на экране именно она и появляется. Инструкция обработки исключений catch выполняется, если в программе возникает ошибка. Таким образом, главный модуль обеспечивает вывод стартовой формы программы, дальнейшее поведение которой определяют функции обработки событий стартовой формы.

Помимо главного модуля в состав проекта входят модули формы. Для каждой формы C++ Builder создает отдельный модуль, который состоит из двух файлов: заголовочного файла и файла кода (содержимое этих файлов отражается в окне редактора кода). Заголовочный файл содержит описание формы (листинг 2.6), файл кода (модуль формы) — описание (текст) функций, в том числе и обработки событий (листинг 2.7).



Листинг 2.6.

Заголовочный файл модуля формы (Amper_1.h)
#ifndef Amper_1H #define Amper_1H #include <Classes.hpp>
#include «Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
class TForml : public TForm { __published: // IDE-managed Components TLabel *Label1; TLabel *Label2; TLabel *Label3; TEdit *Editl; TEdit *Edit2; TButton *Buttonl; TButton *Button2; TLabel *Label4; void__fastcall ButtonlClick(TObject *Sender);
void__fastcall Button2Click(TObject *Sender);
private: // User declarations public: // User declarations __fastcall TForml(TComponent* Owner);
}; extern PACKAGE TForml *Form1; #endif



Листинг 2.7.

Модуль формы (Amper_1.cpp)
#include <vcl.h>
#pragma hdrstop #include "Amper_l.h" #ragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; __fastcall TForml::TForml(TComponent* Owner) : TForm(Owner) { } // щелчок на кнопке Вычислить void__fastcall TForml::ButtonlClick(TObject *Sender) { float u; // напряжение float r; // сопротивление float i; // сила тока // получить данные из полей ввода // возможно исключение try { u = StrToFloat(Editl->
Text);
r = StrToFloat(Edit2->
Text);
} catch (EConvertError &e) { ShowMessage("При вводе дробных чисел используйте запятую.");
return; } // вычислить силу тока // возможно исключение try { i = u/r; } catch (EZeroDivide &e) { ShowMessage("Сопротивление не должно быть равно нулю");
Edit1->
SetFocus();
// курсор в поле Сопротивление return; } // вывести результат в поле метки Label4->
Caption = "Ток : " + FloatToStrF(i,ffGeneral,7,3);
} // щелчок на кнопке Завершить void__fastcall TForml::Button2Click(TObject *Sender) { Forml->
Close();
// закрыть окно программы }
Следует отметить, что значительное количество работы по генерации программного кода выполнил C++ Builder. Он полностью сформировал главный модуль (Amper.cpp), заголовочный файл модуля формы (Amper_l.h), значительную часть модуля формы (Amper_l.cpp). Кроме того, C++ Builder, анализируя действия программиста, сформировал описание формы, файл проекта и файл ресурсов проекта.
 


Содержание раздела