Використання компонентів введення-виведення

Раніше було розглянуто розв’язання прикладу, в якому компоненти Label і Editвикористовувалися для введення однієї змінної. Якщо в задачі виникає потреба введення багатьох зна­чень змінних і для кожної з них призначаються окремі компо­ненти, то вікно форми виявиться перевантаженим і менш зручним у застосуванні.

Цього можна уникнути, багаторазово використовуючи одне вікно введення з відповідною підказкою для різних змінних.

Приклад 12.2. Необхідно обчислити значення функції z при різних значеннях а і b, якщо х є [1; 4], h, = 0,5, у є [4; 12], hy = 2

Алгоритм процесу розгалуження та програмну реалізацію схожого за умовою завдання наведено у прикладі 5.2, а також у прикладі 1.2 (частина І).

Цю задачу можна розв’язати шляхом призначення окремо­го поля введення для а і для b,тобто розміщення на фор­мі двох компонентів Edit1 і Edit2. Відповідні підказки призна­чення цих компонентів здійснено за допомогою компонентів Label1 і Label2. КомпонентLabel3 використаний для виведен­ня повідомлення «РЕЗУЛЬТАТ», а компонент Label4реалізує виведення результату обчислень.

Вікно форми, програмний код та результат розв’язання мають вигляд:

[thumb]http://cpp.dp.ua/uploads/posts/2016-01/1453339473_12_1_6.png[/thumb]

Методика створення вікна форми, складання програми, за­пису додатка на диск і розв’язання задачі аналогічна до роз­глянутої у прикладі 12.1 цього розділу. З метою перегляду всіх одержаних значень параметра z у програмному коді використа­на функція виведення ShowMessage(), яка здійснює виведення повідомлення користувачу «далее»(due. розділ 13).

Після запуску додатка на виконання в активному вікні фор­ми, що з’явиться, треба спочатку помістити курсор у вікно введення Edit1 і набрати значення змінної а, потім змістити курсор у вікно Edit2 і ввести значення змінної b, після чого натиснути кнопку«Вычислить». У вікні висновку Label4 з’явиться резуль­тат розв’язання задачі. Для закінчення роботи з додатком треба натиснути кнопку «Конец работы».

У цій програмі для переведення дійсних значень змінних х, у і z у їхнє рядкове подання використовується безформатна функція FloatToStr(), тому виведений результат представлений «довгими» числами. Для його форматування можна було б за­писати функцію FloatToStrF() з зазначенням форматного коду, як це було зроблено в прикладі12.1.

Розв’язок був отриманий для значень змінних а = 5 і b = 9. Це видно у вікнах введення додатка. Під час повторного запус­ку можна було б ввести інші значення для а і b та одержати відповідні результати.

Приклад 12.3. Розв’язати задачу за умовою прикладу 12.2, використавши для введення параметрів а і b один компонент Edit.

Для введення змінних а і b можна використовувати один компонент Edit, в який слід почергово вводити спочатку значен­ня однієї змінної, а потім другої змінної. При цьому синхронно змінюється напис у властивості Caption компонента Label. Та­кий додаток має вигляд:

#include <vcl.h>

#include <math.h>

#pragma hdrstop

#include "ODN_okno.h"

//-----------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

float x, y, z;

int a, b;

//-----------------------------------------------------------------------------

_ fastcall TForm 1::TForm 1 (TComponent* Owner): TForm(Owner)

{

}

void_ fastcall TForm1 ::Edit1KeyPress(TObject "Sender, char &Key)

{

if(Key==VK_RETURN)

if(AnsiString(Label1->Caption) == "Введите a")

{ a = StrToInt(Edit1->Text);

Label3->Caption = "a="+IntToStr(a);

Label1->Caption = "Введите b";

Edit1->Text = " ";

}

else

{ b = StrToInt(Edit1->Text);

Label3->Caption = "b=" + IntToStr(b);

Label1->Caption = "Введите a";

}

}

void_ fastcall TForm1::Button2Click(TObject *Sender)

{

Close();

}

//----------------------------------------------------------------------------------------------------

void_ fastcall TForm1::Button1Click(TObject *Sender)

{

x=l;

while (x<=4)

Label3->Caption = "При x=" + FloatToStr(x) + '\n';

for (y = 4; у <=12; у+=2) {

if ((x < 3) && (у > 5))

z = pow(a,x) + sqrt(x + y);

else if ((x > 3) && ((x + y) < 10))

z = a*exp(x) + log(b+y);

else z = sin(x*x) + pow(cos(y),3);

Label3->Caption = LabeI3->Caption+"y ="+FloatToStr(y)+" z ="+FloatToStr(z)+'\n'; }

ShowMessage ("далее"); x += 0.5;

}

}

Оскільки створення вікна форми принципово не відрізня­ється від раніше розглянутої методики, крім того, що в поле Caption мітки Label1 спочатку записується підказка«Введите а», а потім «Введите b», розглянемо детальніше код програми.

Як і раніше, спочатку запишемо заголовний файл math.h, а дані а, b, х, у і z опишемо як глобальні змінні після рядка за­готовки TForm *Form1, оскільки вони повинні бути доступни­ми в двох оброблювачах подій: Edit1KeyPress() і Button1Click(), тобто у двох функціях.

Оброблювач Edit1KeyPress() служить для обробки події на­тискання клавіші Enterпісля введення чергового числа в по­ле Edit1. Для його створення треба на формі зробити актив­ним компонент Edit1, клацнувши мишкою, а потім у редакторі Object Inspectorперейти на вкладку Events і активізувати в ній рядок onkeypress, двічі клацнувши мишкою. Перед цим треба в активному вікні форми властивості KeyPreview присвоїти зна­чення «true».

Робота цього оброблювача полягає в тому, що спочатку на формі полеEdit1 очищається від інформації, а у властивість Caption компонента Label1 записується підказка «Введите а». Після запуску додатка на виконання у поле Edit1 вводиться значення змінної а і натискається клавіша Enter, яка має вір­туальний код VK_RETURN(числовий код дорівнює 13). Цей код системою присвоюється спеціальному параметруKey.

За допомогою оператора if(Key==VK_RETURN)… перевіря­ється подія натискання клавіші Enter і, якщо вона відбулася, У наступному операторі if()… перевіряється, який напис містить поле Caption компонента Label1. Якщо це напис b то змінній а присвоюється значення поля Edit1, тобто викону­ється оператор а = StrToInt(Edit1->Text),після чого значення Цієї змінної виводиться у відповідне поле Label3->Caption для контролю. Потім оператор Label1->Caption = “Введите b“; замі­няє цим повідомленням раніше введений текст, а наступний опе­ратор очищає поле Edit1->Text. Далі в це поле можна ввести значення змінної b і також натиснути клавішу Enter. При об­робці події умова if(AnsiString(Label 1 ->Caption == “Введите a”) тепер виявиться помилковою, і буде виконуватися гілка else, тобто значення поля Edit1->Text буде присвоєне змінній b і ви­ведене в Label3->Caption для контролю. На цьому обробка дано­го повідомлення закінчується.

Якщо виникає потреба введення у вікно Edit1 значень не двох, а більшої кількості змінних, то в код оброблювача події слід вставити необхідну кількість операторів else,тобто привес­ти їх до вигляду:

else

if(AnsiString(Labell->Caption)==”Bвeдитe b”) {

b = StrToInt(Editl->Text);

Label3->Caption=”b=” +IntToStr(b);

Editl->Text=” “;

}

else

Тут AnsiString служить для приведення тексту поля Caption до рядкового типу [1, 2,13,14,19]. Щоб продовжити роботу додатка, треба ініціювати подію Button1Click()натисканням кнопки «Вычислить». Тоді почнуть виконуватися оператори, записані в цьому оброблювачі події, й у полі компоненти Label3->Caption відобразиться результат розв’язання задачі. В цьому випадку використовуються такі ж оператори, як і у прикладі12.2.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *