Рекомендуемый вид формы приведен на рис. 1.13.
К этой задаче даны два варианта решения. В первом варианте для каждой цифровой кнопки создана отдельная процедура обработки события onclick. Во втором варианте событие onclick всех цифровых кнопок обрабатывает одна процедура, что позволило значительно сократить текст программы.

Рис. 1.13. Форма программы Калькулятор

// ****************************************************
// Вариант 1. Событие Onclick на каждой цифровой кнопке
// обрабатывает отдельная процедура.
implementation
{$R *.dfm}
var
accum: real; // аккумулятор oper: integer;
// операция: 1 — '+'; 2 — '-'; // 0 — "выполнить" (кнопка "=")
f: integer;
(' f = 0 ждем первую цифру нового числа, например,
после выполнения операции, когда на
индикаторе результат. f = 1 ждем остальные цифры. }
// кнопка О
procedure TForml.ButtonOClick(Sender: TObject);
begin
if f = 0 // первая цифра числа then begin
Editl.Text := '0'; f := 1; // ждем остальные цифры end else
if Editl.Text о '0'
// чтобы на индикаторе не было
// нескольких нулей в начале числа then Editl.Text := Editl.Text + 'О1; end;
// кнопка 1
procedure TForml.ButtonlClick(Sender: TObject);
begin
if f = 0 // первая цифра числа then begin
Editl.Text := '1'; f := 1; //' ждем остальные цифры end
32
else Edit1.Text := Edit1.Text + '1'; end;
// кнопка 2
procedure TForml .Button2Click(Sender: TObject);
begin
if (f = 0) // первая цифра числа then begin
Edit1.Text := '2'; f := 1; // ждем остальные цифры end
else Editl.Text := Edit1.Text + '2'; end;
// кнопка 3
procedure TForml.Button3Click(Sender: TObject);
begin
if f = 0 then begin
Editl.Text := '3'; f := 1; end
else Editl.Text := Editl.Text + '31; end;
// кнопка 4
procedure TForml.Button4Click(Sender: TObject);
begin
if f = 0 then begin
Editl.Text := 4'j f := 1; end
else Editl.Text := Editl.Text + '4'; end;
// кнопка 5
procedure TForml.ButtonSClick(Sender: TObject);
begin
if (f = 0)
then begin
Editl.Text := '5'; f := 1; end
else Editl.Text := Editl.Text + '5'; end;
// кнопка 6
procedure TForml.Button6Click(Sender: TObject);
begin
if f = 0 then begin
Editl.Text := '61; f := 1; end
else Editl.Text := Editl.Text + '6'; end;
// кнопка 7
procedure TForml.Button7Click(Sender: TObject);
begin
if f = 0 then begin
// первая цифра числа Editl.Text := '7' ; f := 1; end
else Editl.Text := Editl.Text + '7'; end;
// кнопка 8
procedure TForml.Button8Click(Sender: TObject);
begin
if f = 0 then begin
Editl.Text := '8'; f := 1; end
else Editl.Text := Editl.Text + ;8'; end;
// кнопка 9
procedure TForml.Button9Click(Sender: TObject);
begin
begin
Editl.Text := 'О'; accura := О; oper := 0;
f := 0; // ждем первую цифру числа end;
// нажатие клавиши в поле Editl
procedure TForml.EditlChange(Sender: TObject; var Key:Char);
begin
Key := Chr(0); // не отображать символы end;
procedure TForml.FormCreate(Sender: TObject); begin
oper := 0; end;
end.
// Вариант 2. События Onclick на всех II цифровых кнопках обрабатывает одна II процедура
implementation
{$R *.dfm}

1. Во время создания формы свойству Tag каждой цифровой кнопки надо присвоить значение,
равное цифре, которая должна появиться на индикаторе калькулятора.
2. После того как обычным образом будет создана процедура обработки события
OnClick для одной из цифровых кнопок, например для кнопки "1", надо задать,
что событие OnClick для остальных кнопок обрабатывает эта же процедура.
Делается это выбором процедуры в списке, который появляется в результате
щелчка на значке раскрывающегося списка в соответствующей строке вкладки Events.
var
accum: real;
oper: integer;

// аккумулятор
// операция: 1 — '+'; 2 — '-';
//О — "выполнить" (кнопка "=")
f: integer;
{ f = 0 ждем первую цифру нового числа, например,
после выполнения операции, когда
на индикаторе результат. f = 1 ждем остальные цифры. }
// Щелчок на кнопках "О" — "9"
procedure TForml.DigitBtnClick(Sender: TObject);
var
Btn: TButton;
ch: Char; begin
Btn := Sender as TButton;
ch := Chr(48+Btn.Tag);
// chr(48) = '0'; chr(49) = 4' и т. д.
// можно и так: ch := Btn.Caption;
case Btn.Tag of
1..9: // кнопки "1" - "9"
if f = 0 // первая цифра числа then begin
Editl.Text := ch; f := 1;
// ждем остальные цифры end else Editl.Text := Editl.Text + ch;
0: // кнопка "О"
if Editl.Text <> '0' //на индикаторе О
// чтобы на индикаторе не было
// нескольких нулей в начале числа then Editl.Text := Editl.Text + 'О1; end; end;
// десятичная точка
procedure TForml.ButtonZClick(Sender: TObject);
begin
if Editl.Text = '0' then
begin
Edit1.Text := '0, ' ; f := 1; end; if Pos (', ',Editl.Text) = 0 then
Editl.Text := Editl.Text + ','; end;
// выполнение операции procedure DoOper; var
numb: real; // число на индикаторе begin
// accum содержит результат предыдущей
// операции, орег — код операции, которую
// надо выполнить. Операнд находится // на индикаторе.
numb := StrToFloat(Forml.Editl.Text); case oper of 0:
accum := numb; 1: accum := accum + numb; 2: accum := accum — numb; end;
Forml.Editl.Text := FloatToStr(accum); end;
// Обрабатывает щелчок на кнопках "+", "-" и "="
procedure TForml.OpBtnClick(Sender: TObject);
l Надо выполнить предыдущую операцию, вывести результат
на индикатор, запомнить текущую операцию и установить
режим ожидания первой цифры нового числа. } var
Btn: TButton; begin
Btn := Sender as TButton;
if f = 0 // ждем первую цифру, но пользователь
// щелкнул на кнопке операции then
// свойство Tag кнопки хранит код операции oper := Btn.Tag
// запомним операцию else begin
DoOper; // выполнить предыдущую операцию oper := Btn.Tag; // запомнить текущую операцию f1=0; // ждем первую цифру нового числа
end; end;
// кнопка "с" — очистка
procedure TForml.ButtonCClick(Sender: TObject);
begin
Edit1.Text := '0';
accum := 0;
oper := 0;
f := 0; // ждем первую цифру числа end;
// нажатие клавиши в поле Editl
procedure TForml.EditIChange(Sender: TObject; var Key:Char);
begin
Key := Chr(0); // не отображать символы end;
procedure TForml.FormCreate(Sender: TObject); begin
oper := 0; end;
end.