Програма Електроенергія показує, як одна функція може обробляти події різних, але однотипних компонентів.

Код написання програми
// конструктор форми
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
/* задати, що подія KeyPress
для компонентів Edit2 та Edit3 обробляє функція Edit1KeyPress */
Edit2->OnKeyPress = Edit1KeyPress;
Edit3->OnKeyPress = Edit1KeyPress;
/* щоб процедура обробки події KeyPress могла
визначити, в якому полі користувач натиснув клавішу, запишемо у властивість Tag кожного компонента Edit
цілу константу */
Edit1->Tag = 1;
Edit2->Tag = 2;
Edit3->Tag = 3;
}
// натисніть клавішу в полі редагування
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
TEdit *Edit; // компонент Edit
Edit = (TEdit*)Sender;
/* тепер ed — це компонент Edit, в полі якого Користувач натиснув клавішу */
/* реакція компонентів на натискання усіх клавіш, За винятком Enter однакова */
if (Key == VK_RETURN) // натискання клавіши Enter
{
switch (Edit->Tag)
{
case 1: /* клавіша натискається в полі Edit1
перемістити курсор в поле Edit2 */
Edit2->SetFocus(); break;
case 2: /* клавіша натискається в полі Edit2
перемістити курсор в поле Edit3 */
Edit3->SetFocus(); break;
case 3: /* клавіша натискається в полі Edit3
зробити активною кнопку Розрахувати */
Button1->SetFocus(); break;
}
return;
}
if ( (Key >= '0' && Key <= '9') || Key == VK_BACK)
{
// цифра або Backspace
return;
}
if (Key == ',' || Key == '.')
{
Key = DecimalSeparator;
if ( (Edit->Text).Pos(DecimalSeparator) !=0)
Key = 0;
return;
}
if (Key == VK_BACK)
return;
// інші клавіши заборонені
Key = 0;
}
// клацання на кнопку Розрахувати
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float prior, curr; // попереднє та поточне показання
// лічильника
float tariff; // тариф — ціна 1 кВт/година
float summ; // сума до сплати
prior = StrToFloat (Edit1->Text);
curr = StrToFloat (Edit2->Text);
tariff = StrToFloat (Edit3->Text);
// перевірити вихідні дані
if (curr < prior)
{
MessageDlg("Поточне значення показника лічильника не"
" може бути меньше попереднього.",
mtWarning, TMsgDlgButtons() << mbOK, 0);
return;
}
summ = (curr - prior) * tariff;
Label4->Caption = "Сума до сплати: " + FloatToStrF(summ,ffGeneral, 6, 2);
}
програмування