Пишем калькулятор на Delphi 7 (часть2)

Итак, интерфейс калькулятора у нас готов, переходим к более сложному процессу — программированию. Как вы уже догадались, калькулятор был сделан динамически (т.е. программным способом). Соответственно все события нам придется объявить в начале программы, и затем уже связать их с элементами управления калькулятора.

Для этого найдем в начале программы ключевое слово private. После него добавляем следующую процедуру:

procedure Button1Click(Sender: TObject);

Нажимаем горячие клавиши CTRL+SHIFT+C и программа Delphi нам автоматически прописывает следующие строки:

procedure TForm1.Button1Click(Sender: TObject);
begin

end;

Данная процедура будет выводить на экран калькулятора все нажатые цифры. Если вспомнить, из предыдущей статьи мы для упрощения программирования сделали массив кнопок от 0 до 9. Однако возникает вопрос: по какой именно кнопке мы нажали? Как ее отловить? Для этого пропишем следующие строки:

2
3
4
5
6
7
8
(Sender as TButton).Tag:=1;
for i:=0 to 9 do
if button[i].Tag=1 then
begin
button[i].Tag:=0;
break;
end;

Соответственно при нажатии на неизвестную клавишу, мы присваиваем в поле Tag единицу. Затем с помощью цикла мы проверяем, какой из объектов содержит в свойстве Tag единицу. И таким образом мы находим номер нашей кнопки. Чтобы далее не перебирать все возможные варианты (мы же итак нашли необходимый объект), мы ставим функцию Break и цикл прерывается.

Обязательно после объявления процедуры (procedure TForm1.Button1Click(Sender: TObject);) и перед началом самой процедуры (Begin), объявим новую переменную i и присвоим ей тип integer:

var i:integer;

Дальше смотрим, нажимали ли мы на какую-нибудь кнопку с операциями сложения, вычитания, умножения или деления, и соответственно очищаем экран, а затем с самого начала записываем цифры. Если же нажатий на эти кнопки не было — тогда просто дописываем к предыдущей цифре ту, которую мы только что нажали. Для этого нам понадобится какая-то переменная. Пусть это будет pamyatstiraniya. Опишем ее в начале программы перед implementation:

pamyatstiraniya:string;

Соответственно, нам понадобится еще одна переменная, которая хранила бы операции (+,-,*,/), и третья, которая хранила бы число, пока мы записываем новое:

pamyatoperacii:string;
pamyatchisla1:string;

Тогда в процедуре (procedure TForm1.Button1Click(Sender: TObject);) пропишем следующие условия:

1
2
3
4
5
6
7
8
9
if pamyatstiraniya='Надо очистить экран' then
Begin
Edit.Text:='';
pamyatstiraniya:='';
end;
if Edit.Text='0' then
Edit.Text:=inttostr(i)
else
Edit.Text:=Edit.Text+inttostr(i);

Другими словами, если мы нажали на какой-то знак +,-,*,/ — у нас в переменную pamyatstiraniya появилось сообщение, что надо очистить экран перед тем, как записать новую цифру. Дальше если у нас на экране отображался 0 — нужно эту цифру заменить на новую. И если на экране уже были цифры — их просто дописываем справа.

Процедура полностью готова к работе, но если запустить калькулятор — цифры не отображаются. Почему? Дело в том, что мы еще не связали наши кнопки 0-9 с данной процедурой. Поэтому при создании формы (procedure TForm1.FormCreate(Sender: TObject);) допишем следующие строчки:

2
3
for i:=0 to 9 do
button[i].OnClick:=Button1Click;

Запускаем калькулятор и наслаждаемся вводом цифр!

Всё было бы отлично, если бы не бесконечный ввод чисел. Поэтому давайте таким же образом сделаем операции сложения, вычитания, умножения и деления. В private пишем:

procedure Operaciya(Sender: TObject);

Нажимаем CTRL+SHIFT+C и в ней пишем следующее:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var i:integer;
begin
if sender.ClassType=TButton then
(Sender as TButton).Tag:=1;
for i:=13 to 19 do
if button[i].Tag=1 then
begin
button[i].Tag:=0;
break;
end;
case i of
13:pamyatoperacii:='+';
15:pamyatoperacii:='-';
17:pamyatoperacii:='*';
19:pamyatoperacii:='/';
end;
pamyatstiraniya:='Надо очистить экран';
end;

Здесь самое главное занести в переменную pamyatoperacii необходимый знак нашей операции (что мы будем дальше делать с выражением). Однако при выполнении операции несколько раз было бы хорошо показать пользователю результаты вычислений.

Добавим новую процедуру:

procedure Resultat(Sender: TObject);

И в ней как раз и будем производить вычисления, а затем результат — выводить на экран:

1
2
3
4
5
6
7
8
9
10
if pamyatoperacii='+' then
Edit.Text:=FloatToStr(StrToFloat(pamyatchisla1)+StrToFloat(Edit.Text));
if pamyatoperacii='-' then
Edit.Text:=FloatToStr(StrToFloat(pamyatchisla1)-StrToFloat(Edit.Text));
if pamyatoperacii='*' then
Edit.Text:=FloatToStr(StrToFloat(pamyatchisla1)*StrToFloat(Edit.Text));
if pamyatoperacii='/' then
Edit.Text:=FloatToStr(StrToFloat(pamyatchisla1)/StrToFloat(Edit.Text));
pamyatoperacii:='';
pamyatchisla1:=Edit.Text;

Поэтому в самом начале процедуры (procedure Operaciya(Sender: TObject);) будем выполнять все операции:

1
2
3
4
5
6
7
8
9
procedure TForm1.Operaciya(Sender: TObject);
var i:integer;
begin
Resultat(Sender);
if sender.ClassType=TButton then
(Sender as TButton).Tag:=1;
for i:=13 to 19 do
if button[i].Tag=1 then
...

И, соответственно, при создании формы, кнопки с индексами 13, 15, 17 и 19 должны быть связаны с процедурой operaciya (при нажатии на кнопку мы должны ее вызывать):

1
2
3
4
button[13].OnClick:=operaciya;
button[15].OnClick:=operaciya;
button[17].OnClick:=operaciya;
button[19].OnClick:=operaciya;

А за результаты вычисления у нас отвечает кнопка button[14]. Поэтому ее связываем с процедурой Resultat:

1
button[14].OnClick:=Resultat;

Попробуем еще раз запустить калькулятор и если все выполнено верно — с помощью нашего калькулятора можно ввести цифры, можно их сложить, вычесть, умножить, разделить и получить результаты вычислений.

Всё работает? Переходим к следующему шагу.

Хорошо, конечно, было бы сбрасывать полностью все значения калькулятора и вычислить что-нибудь другое. Для этого настроим работу двух кнопок: CE и C. Первая отвечает за сброс при неверном вводе значений. Вторая — полный сброс всех вычислений, значений, операций и т.п. (возврат в первоначальное положение калькулятора).

Итак, в private добавим две новые процедуры:

procedure ButtonCClick(Sender: TObject);
procedure ButtonCEClick(Sender: TObject);

Нажимаем CTRL+SHIFT+C и в первую пишем:

1
2
3
Edit.Text:='0';
pamyatoperacii:='';
pamyatchisla1:='';

А во вторую:

1
Edit.Text:='0';

Дальше кнопку button[11] связываем с процедурой ButtonCEClick, а button[12] связываем с ButtonCClick:

button[11].OnClick:=ButtonCEClick;
button[12].OnClick:=ButtonCClick;

Теперь можно запрограммировать и остальные кнопки.

Backspace:

1
2
3
4
5
6
7
procedure TForm1.Backspace(Sender: TObject);
begin
if Length(Edit.Text)>0 then
Edit.Text:=copy(Edit.Text,1,Length(Edit.Text)-1);
if Length(Edit.Text)=0 then
Edit.Text:='0';
end;

SQRT:

1
2
3
4
procedure TForm1.Koren(Sender: TObject);
begin
Edit.Text:=FloatToStr(SQRT(StrToFloat(Edit.Text)));
end;

1/x:

1
2
3
4
procedure TForm1.Drob1nax(Sender: TObject);
begin
Edit.Text:=FloatToStr(1/(StrToFloat(Edit.Text)));
end;

, (запятая или десятичная дробь):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm1.Drob(Sender: TObject);
var i:integer;
b:boolean;
begin
b:=false;
if pamyatstiraniya='Надо очистить экран' then
Begin
Edit.Text:='';
pamyatstiraniya:='';
end;
For i:=1 to Length(Edit.Text) do
Begin
if Edit.Text[i]=',' then
b:=true
end;
if Edit.Text[Length(Edit.Text)]=',' then
Edit.Text:=copy(Edit.Text,1,Length(Edit.Text)-1)
else
Begin
if b=false then
Edit.Text:=Edit.Text+',';
end;
end;

+/-:

1
2
3
4
procedure TForm1.Otricanie(Sender: TObject);
begin
Edit.Text:=FloatToStr(StrToFloat(Edit.Text)*(-1));
end;

Для вычисления процента нам понадобится вторая переменная pamyatchisla2 (string), которую описываем тоже вначале программы. Соответственно в процедуре ButtonCClick сбрасываем ее значение:

1
pamyatchisla2:='';

%:

1
2
3
4
5
6
7
procedure TForm1.Procent(Sender: TObject);
begin
if pamyatchisla2='' then
pamyatchisla2:=Edit.Text;
if pamyatstiraniya='Надо очистить экран' then
Edit.Text:=FloatToStr(StrToFloat(Edit.Text)/100*StrToFloat(pamyatchisla2));
end;

Проверяем, все ли у нас кнопки работают и дорабатываем программу.

Если попробовать ввести цифры с клавиатуры, то можно заметить, что у нас либо 0 постоянно мешает, либо вообще ничего не вводится. Во многом это зависит от того, где фокус находится (на кнопке или на поле ввода). Если мы нажмем мышкой на поле ввода — цифры с клавиатуры можно продолжать вводить, но вот только где они будут вводиться? Немного не в том порядке, в каком хотелось бы. Да и еще, что интереснее — можно вводить не только цифры, но и буквы — что недопустимо в калькуляторе!

Поэтому сделаем обработчик событий при вводе в поле ввода данных.

Для формы (Form1) создадим событие OnKeyPress и пропишем следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9':
begin
Button[strtoint(key)].Click;
Key :=Chr(0);
Edit.SelStart:=Edit.Perform(EM_LINEINDEX,0,0)+length(Edit.Text);
Application.ProcessMessages;
Edit.SetFocus;
end;
'+':
begin
button[13].Click;
Key :=Chr(0);
end;
'-':
begin
button[15].Click;
Key :=Chr(0);
end;
'*':
begin
button[17].Click;
Key :=Chr(0);
end;
'/':
begin
button[19].Click;
Key :=Chr(0);
end;
#8 :
begin
Backspace(Sender);
Key :=Chr(0);
Edit.SelStart:=Edit.Perform(EM_LINEINDEX,0,0)+length(Edit.Text);
Application.ProcessMessages;
Edit.SetFocus;
end;
#13 :
begin
Resultat(Sender);
Key :=Chr(0);
end;
else
Key :=Chr(0);
end;
end;

Теперь свяжем наш Edit (который создается во время создания формы) с данным событием:

1
Edit.OnKeyPress:=FormKeyPress;

А в цикле for i:=0 to 22 do, где создаются все кнопки, свяжем их тоже с событием:

1
2
3
4
5
for i:=0 to 22 do
begin
...
button[i].OnKeyPress:=FormKeyPress;
end;

А при нажатии мышкой на объект — курсор перемещаем в конец строки:

1
2
3
4
5
6
7
procedure TForm1.EditMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Edit.SelStart:=Edit.Perform(EM_LINEINDEX,0,0)+length(Edit.Text);
Application.ProcessMessages;
Edit.SetFocus;
end;

И, конечно же, запретим что-либо менять в нашем окошке:

1
Edit.ReadOnly:=true;

Клавиши вроде все работают, с окном проблем не обнаружено. Теперь обработаем пункт меню Файл>Выход:

1
Application.Terminate;

И Справка>О программе:

1
Application.MessageBox('Над программой работал: Горячкин Иван. 2013 г.','Калькулятор');

По-желанию можно добавить объект XPManifest1 с вкладки Win32. Тогда все клавиши калькулятора станут полукруглыми.

Калькулятор завершен! Теперь полностью наслаждаемся его работой (при необходимости, можно что-то изменить, добавить, доработать и т.п.).

Калькулятор

 

Вот полный код калькулятора:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
unit Unit1;
 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls, Menus, ComCtrls, XPMan;
 
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
StatusBar1: TStatusBar;
XPManifest1: TXPManifest;
procedure FormCreate(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure N4Click(Sender: TObject);
procedure N3Click(Sender: TObject);
private
procedure Button1Click(Sender: TObject);
procedure Operaciya(Sender: TObject);
procedure Backspace(Sender: TObject);
procedure Otricanie(Sender: TObject);
procedure ButtonCClick(Sender: TObject);
procedure ButtonCEClick(Sender: TObject);
procedure Koren(Sender: TObject);
procedure Drob(Sender: TObject);
procedure Drob1nax(Sender: TObject);
procedure Procent(Sender: TObject);
procedure Resultat(Sender: TObject);
procedure EditMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
{ Private declarations }
public
{ Public declarations }
end;
 
var
Form1: TForm1;
Edit: TMemo;
Button: array[0..22] of TButton;
pamyatstiraniya:string;
pamyatoperacii:string;
pamyatchisla1:string;
pamyatchisla2:string;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
(Sender as TButton).Tag:=1;
for i:=0 to 9 do
if button[i].Tag=1 then
begin
button[i].Tag:=0;
break;
end;
if pamyatstiraniya='Надо очистить экран' then
Begin
Edit.Text:='';
pamyatstiraniya:='';
end;
if Edit.Text='0' then
Edit.Text:=inttostr(i)
else
Edit.Text:=Edit.Text+inttostr(i);
end;
 
procedure TForm1.Operaciya(Sender: TObject);
var i:integer;
begin
Resultat(Sender);
if sender.ClassType=TButton then
(Sender as TButton).Tag:=1;
for i:=13 to 19 do
if button[i].Tag=1 then
begin
button[i].Tag:=0;
break;
end;
case i of
13:pamyatoperacii:='+';
15:pamyatoperacii:='-';
17:pamyatoperacii:='*';
19:pamyatoperacii:='/';
end;
pamyatstiraniya:='Надо очистить экран';
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var i,left,width,top:integer;
begin
left:=10;
width:=40;
Edit:=TMemo.Create(form1);
Edit.Parent:=form1;
Edit.Text:='0';
Edit.Width:=244;
Edit.Height:=21;
Edit.Left:=left;
Edit.Top:=20;
Edit.Alignment:=taRightJustify;
Edit.OnKeyPress:=FormKeyPress;
Edit.OnMouseDown:=EditMouseDown;
Edit.ReadOnly:=true;
Edit.SelStart:=Edit.Perform(EM_LINEINDEX,0,0)+length(Edit.Text);
for i:=0 to 22 do
begin
Button[i]:=TButton.Create(form1);
Button[i].Parent:=form1;
case i of
10..12:
begin
if i=10 then
left:=10;
Button[i].Left:=left;
Button[i].Top:=51;
Button[i].Width:=75;
left:=left+83;
end;
1..9:
begin
if i=1 then
begin
left:=10;
top:=176;
end;
left:=left+width+10;
if i mod 3 =1 then
begin
left:=10;
top:=top-30;
end;
Button[i].Width:=width;
Button[i].Left:=left;
Button[i].Top:=top;
Button[i].Caption:=inttostr(i);
end;
13..20:
begin
if i=13 then
begin
left:=button[9].Left+button[9].Width+10;
top:=206;
width:=40;
end;
left:=left+width+10;
if i mod 2 =1 then
begin
left:=button[9].Left+button[9].Width+10;
top:=top-30;
end;
Button[i].Width:=width;
Button[i].Left:=left;
Button[i].Top:=top;
end;
0:
begin
Button[0].Width:=width;
Button[0].Left:=10;
Button[0].Top:=176;
Button[i].Caption:=inttostr(i);
end;
21,22:
begin
left:=left+width+10;
if i mod 2 =1 then
left:=button[0].Left+button[9].Width+10;
Button[i].Width:=width;
Button[i].Left:=left;
Button[i].Top:=button[13].Top;
end;
end;
button[i].OnKeyPress:=FormKeyPress;
end;
button[10].Caption:='Backspace';
button[11].Caption:='CE';
button[12].Caption:='C';
button[13].Caption:='+';
button[14].Caption:='=';
button[15].Caption:='-';
button[16].Caption:='1/x';
button[17].Caption:='*';
button[18].Caption:='%';
button[19].Caption:='/';
button[20].Caption:='sqrt';
button[21].Caption:='+/-';
button[22].Caption:=',';
for i:=0 to 9 do
button[i].OnClick:=Button1Click;
button[13].OnClick:=operaciya;
button[15].OnClick:=operaciya;
button[17].OnClick:=operaciya;
button[19].OnClick:=operaciya;
button[10].OnClick:=Backspace;
button[11].OnClick:=ButtonCEClick;
button[12].OnClick:=ButtonCClick;
button[16].OnClick:=Drob1nax;
button[18].OnClick:=Procent;
button[20].OnClick:=Koren;
button[21].OnClick:=Otricanie;
button[22].OnClick:=Drob;
button[14].OnClick:=Resultat;
end;
 
procedure TForm1.Backspace(Sender: TObject);
begin
if Length(Edit.Text)>0 then
Edit.Text:=copy(Edit.Text,1,Length(Edit.Text)-1);
if Length(Edit.Text)=0 then
Edit.Text:='0';
end;
 
procedure TForm1.Otricanie(Sender: TObject);
begin
Edit.Text:=FloatToStr(StrToFloat(Edit.Text)*(-1));
end;
 
procedure TForm1.ButtonCEClick(Sender: TObject);
begin
Edit.Text:='0';
end;
 
procedure TForm1.ButtonCClick(Sender: TObject);
begin
Edit.Text:='0';
pamyatoperacii:='';
pamyatchisla1:='';
pamyatchisla2:='';
end;
 
procedure TForm1.Koren(Sender: TObject);
begin
Edit.Text:=FloatToStr(SQRT(StrToFloat(Edit.Text)));
end;
 
procedure TForm1.Drob(Sender: TObject);
var i:integer;
b:boolean;
begin
b:=false;
if pamyatstiraniya='Надо очистить экран' then
Begin
Edit.Text:='';
pamyatstiraniya:='';
end;
For i:=1 to Length(Edit.Text) do
Begin
if Edit.Text[i]=',' then
b:=true
end;
if Edit.Text[Length(Edit.Text)]=',' then
Edit.Text:=copy(Edit.Text,1,Length(Edit.Text)-1)
else
Begin
if b=false then
Edit.Text:=Edit.Text+',';
end;
end;
 
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9':
begin
Button[strtoint(key)].Click;
Key :=Chr(0);
Edit.SelStart:=Edit.Perform(EM_LINEINDEX,0,0)+length(Edit.Text);
Application.ProcessMessages;
Edit.SetFocus;
end;
'+':
begin
button[13].Click;
Key :=Chr(0);
end;
'-':
begin
button[15].Click;
Key :=Chr(0);
end;
'*':
begin
button[17].Click;
Key :=Chr(0);
end;
'/':
begin
button[19].Click;
Key :=Chr(0);
end;
#8 :
begin
Backspace(Sender);
Key :=Chr(0);
Edit.SelStart:=Edit.Perform(EM_LINEINDEX,0,0)+length(Edit.Text);
Application.ProcessMessages;
Edit.SetFocus;
end;
#13 :
begin
Resultat(Sender);
Key :=Chr(0);
end;
else
Key :=Chr(0);
end;
end;
 
procedure TForm1.Drob1nax(Sender: TObject);
begin
Edit.Text:=FloatToStr(1/(StrToFloat(Edit.Text)));
end;
 
procedure TForm1.Procent(Sender: TObject);
begin
if pamyatchisla2='' then
pamyatchisla2:=Edit.Text;
if pamyatstiraniya='Надо очистить экран' then
Edit.Text:=FloatToStr(StrToFloat(Edit.Text)/100*StrToFloat(pamyatchisla2));
end;
 
procedure TForm1.Resultat(Sender: TObject);
begin
if pamyatoperacii='+' then
Edit.Text:=FloatToStr(StrToFloat(pamyatchisla1)+StrToFloat(Edit.Text));
if pamyatoperacii='-' then
Edit.Text:=FloatToStr(StrToFloat(pamyatchisla1)-StrToFloat(Edit.Text));
if pamyatoperacii='*' then
Edit.Text:=FloatToStr(StrToFloat(pamyatchisla1)*StrToFloat(Edit.Text));
if pamyatoperacii='/' then
Edit.Text:=FloatToStr(StrToFloat(pamyatchisla1)/StrToFloat(Edit.Text));
pamyatoperacii:='';
pamyatchisla1:=Edit.Text;
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.Terminate; // чтобы освободить все процессы из памяти программы при ее завершении
end;
 
procedure TForm1.N4Click(Sender: TObject);
begin
Close;
end;
 
procedure TForm1.N3Click(Sender: TObject);
begin
Application.MessageBox('Над программой работал: Горячкин Иван. 2013 г.','Калькулятор');
end;
 
procedure TForm1.EditMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Edit.SelStart:=Edit.Perform(EM_LINEINDEX,0,0)+length(Edit.Text);
Application.ProcessMessages;
Edit.SetFocus;
end;
 
end.

 

У кого получилось разработать калькулятор — пишите в комментариях!

 

Скачать исходник калькулятора

 


<<Предыдущая статья                                     Следующая статья >>

Автор

admin

Программист - техник, разработчик сайтов и программного обеспечения, владелец сервера, администратор сайта "Немного о компьютере..."

Пишем калькулятор на Delphi 7 (часть2): 29 комментариев

  1. [Error] Unit1.pas(33): Undeclared identifier: ‘Button1Click’
    из-за чего может появится такая ошибка? когда доделала первую часть все было без ошибок
    помогите пожалуйста! заранее благодарю

  2. Undeclared identifier — неописанная переменная. Скорее всего, Вы не создали или не прописали описание для этой процедуры (не объявили процедуру в начале программы). В течение недели запишу видео и уже наглядно покажу, как вручную создавать процедуры. Спасибо за комментарий!

  3. Ошибка в procedure TForm1.Backspace(Sender: TObject); исправлена!!! Полный код калькулятора теперь абсолютно рабочий!

    1. Пожалуй, без кода программы помочь ничем не сможем… может перед объявлением этих переменных нет ключевого слова var?
      Посмотрите внимательно видео и полный код программы. По-идее должно полностью всё работать…
      Если никак не получится — пришлите Ваш проект по почте support@fortran-new.ru.
      Также, если проблему решите самостоятельно — обязательно напишите для других ход решения проблемы в комментариях!

  4. спасибо за уроки!
    все получилось
    было несколько других ошибок, но я их исправил

  5. Все, я разобрался…
    Кому надо, вот:
    procedure TForm1.Procent(Sender: TObject);
    begin
    Edit.Text:=FloatToStr(StrToFloat(pamyatchisla1)*strtofloat(edit.text)/100);
    end;

  6. Добрый день! хочу создать калькулятор перерасчета. подскажите плиз, как можно установить зависимость события от текущей даты?

    1. Для отображения текущей даты, отвечает функция date, за время — time. Вот программа для перевода из текста в дату и обратно:
      var d:TDateTime;
      s:string;
      begin
      s:=FormatDateTime( ‘dd.mm.yyyy’,date); // из даты в строку
      s:=s+FormatDateTime( ‘ hh:nn:ss’,time); // из времени в строку
      showmessage(s);
      d:=VarToDateTime(s); // из строки в дату
      showmessage(FormatDateTime( ‘dd.mm.yyyy’,d));
      showmessage(FormatDateTime( ‘hh:mm’,d));
      Соответственно, сравнивать можно как даты, так и строки в заданном формате.
      Конечно, это в общих чертах. Чтобы конкретнее объяснить, нужен Ваш код.

    1. А в процедурах до этого в TForm1.Backspace, TForm1.Otricanie, TForm1.ButtonCEClick, TForm1.ButtonCClick выдает ошибку? Если нет — значит сделайте TForm1.Koren заново в точности так же. Если же выдает ошибку — может процедуры не описаны в самом начале?
      Еще, как вариант, возможно, (лично у меня) в 80% случаях есть синтаксические ошибки. Проверьте, правильно ли все прописали.

      1. У меня есть ошибки во всех функциях. Если можно скинь проект калькулятора. Готовый.

          1. x — переменная, которую вводит пользователь. Если пользователь ввел 10 и нажал на кнопку «1/x», то в результате 1 разделится на 10 и получится 0,1. Если еще раз разделить 1 на 0,1 то получится 10.
            Кстати, на ноль делить нельзя. Можно дописать это правило при вычислении функции…

  7. Всем привет! Все сделал, запустилось! Но запустилось не просто после копирования написанной программы в Delphi, а после того, когда начал делать все по порядку по видео уроку. Зато вот после, скачал исходный файл самого готового калькулятора и появилась одна, даже не знаю можно назвать это проблемой, скорее один нюанс. при запуске калькулятора все работает четко, калькулятор отменный, а вот вверху нет панель MainMenu(фаил, справка и тп.) просто не отображаются. подскажите почему?? заранее спасибо!

  8. Здравствуйте! Извините, это я забыл добавить вверху панель MainMenu (первоначальный исходник удален, а позже делал уже на скорую руку). Большое спасибо за замечание:)

  9. Всем привет!
    В чем разница С и СЕ? Зачем два сброса?
    А по логике, Backspace и СE должны выполнять одну и ту же функцию.
    В общем,нужно удалить CE,чтоб калькулятор был правильнее

    1. Backspace стирает последовательно все цифры с конца (как на клавиатуре).
      C — полный сброс. Это значит, что обнуляет экран, сбрасывает все настройки по дальнейшим действиям (продолжать, например, складывать числа после сложения не получится. Придется набирать все заново).
      CE — сброс текущего экрана. Это значит, что обнуляет экран, но сохраняет все предыдущие действия пользователя (например, при сложении 2+3+CE+4 получится 6), или отменяет последний ввод числа (можно вместо нее использовать backspace).
      Удалить кнопки, конечно, можно. Не спорю. Но этот калькулятор мы старились сделать внешне похожим на тот же стандартный, который есть в windows xp.

  10. При делении на ноль программа вылетает
    Пробовал через showMassage, но что-то не получается
    Но а так калькулятор полностью работоспособен

      1. Если можно напишите в комментарий часть правильного кода
        С выходом сообщения с ошибкой при делении на нуль с комментариями //Что бы разобраться с данной проблемой раз и навсегда 🙂

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *