case key of
'0'..'9',',':; {Запрещаем в поле Edit ввод любых символов, кроме цифр и запятых}
else key:=#0;end;

Дабы обезопаситься от ввода типа:"0,1,2,33" на событие OnChange пишем следующий код
 
var
i,n:integer;
begin
n:=pos(',',edit1.text); {ищем первую запятую в поле}
for i:=n+1 to length(edit1.text) do
if edit1.text[i]=',' then edit1.clear; {Если находится ещё одна запятая после первой - очищаем поле}

Дабы полностью обезопаситься от некорректного ввода, ставим
DragMode: dmAutomatic ; {запрещаем клики мышкой}
После того как у нас получилось неуязвимое поле, пришло время для создания кнопок калькулятора, сначала
создадим 16 кнопок (Button): Числа от 0 до 9-ти, кнопку для запятой, знака равно, знаков плюс, минус,
умножить и поделить.
Сперва стоит обеспечить ввод чисел, для этого на событие OnClick чисел от 0..9 и запятой пишем следующее:

 
procedure TForm1.Button7Click(Sender: TObject);
begin
edit1.Text:=edit1.Text+'1';
end;

Повторим процедуру для всех остальных чисел и знака запятой..На событие OnClick числа "0" стоит дописать ещё одну строку:
if edit1.Text='00' then edit1.Text:='0';
{позволяет ввод лишь одного нуля вначале}
Дальше нам нужно запоминать числа которые подаются на ввод и выводить их, создадим три глобальные переменные и одну переменную типа char для запоминания математических действий:
 
var
Form1: TForm1;
a,b,d:extended;
c:char;

Сначала нам нужно считать первое число, на знаки "+","-","*","/" пишем следующий код:
 
if edit1.Text<>'' then a:=strtofloat(edit1.Text); {Проверяем введено ли число в поле}
c:='+'; {Сохраняем математическое действие}
edit1.Clear;

Стоить повторить и для остальных действий..
Далее нам нужно считать вторую переменную, по этому на событие OnClick знака равно, пишем:
procedure TForm1.Button12Click(Sender: TObject); 
begin
if edit1.Text<>'' then b:=strtofloat(edit1.Text);
case c of
'+':d:=a+b;
'-':d:=a*b;
'*':d:=a*b;
'/':d:=a/b;end;
edit1.Text:=floattostr(d);
end;

Вуаля, у нас получился простейший калькулятор, но я ведь обещал вам совсем другой, по-этому создадим дополнительно 24 кнопки (Button) для разных функций;
Одну из этих кнопок называем:"Pi", на событие OnClick этой кнопки пишем:
 
procedure TForm1.Button17Click(Sender: TObject);
begin
edit1.Text:=floattostr(pi); {Вписываем в поле число Пи}
end;

Далее переименовываем Button`ы на "cos","sin","arctg", на событие OnClick пишем:
 
procedure TForm1.Button18Click(Sender: TObject);
begin
edit1.Text:=floattostr(cos(strtofloat(Edit1.Text))); {В поле выводим косинус введенного числа}
end;

Проделать тоже самое с остальными функциями..
Дальше переименовываем две кнопки для вычисления sqr и sqrt..пишем:
procedure TForm1.Button21Click(Sender: TObject); 
begin
edit1.Text:=floattostr(sqrt(strtofloat(Edit1.Text)));
end;

Повторить и для "sqr"
Вы наверное спросите, а как-же насчёт ввода отрицательных чисел?
Для этого переименовываем ещё одну кнопку в "+/-"
На событие OnClick пишем:
 
procedure TForm1.Button23Click(Sender: TObject);
begin
edit1.Text:=floattostr(-(strtofloat(Edit1.Text)));
end;

Далее вернемся немного назад и напишем ещё пару функций для действий с двумя числами...в событии OnClick знака равно, введем две локальные переменные, например: q и w;
Теперь переименуем 6 кнопок в "mod","div","or","xor","and","x^y";
Что писать на событие OnClick этих кнопок можно прочесть выше
Теперь пришло считать второе число и вывести результат..О том как это сделать, написано выше.
В итоге текст на событии OnClick знака равно будет иметь такой вид:
 
if edit1.Text<>'' then b:=strtofloat(edit1.Text);
case c of
'+':d:=a+b;
'-':d:=a*b;
'*':d:=a*b;
'/':begin
if edit1.Text<>'' then b:=strtofloat(edit1.Text);
if b=0 then showmessage('На ноль делить нельзя') else
d:=a/b;end;
'm':d:=round(a) mod round(b);
'd':d:=round(a) div round(b);
'o':d:=round(a) or round(b);
'x':d:=round(a) xor round(b);
'a':d:=round(a) and round(b);
'^':d:=exp(b*ln(a));
end;
edit1.Text:=floattostr(d);
end;

Далее переименуем кнопку в "х!", на событие OnClick пишем:
 
procedure TForm1.Button32Click(Sender: TObject);
var
x:extended;
i:integer;
begin
if edit1.Text<>'' then begin x:=strtofloat(edit1.Text);
for i:=1 to round(x)-1 do
x:=x*i;
edit1.Text:=floattostr(x);end;
end;

Переименуем ещё две кнопки в "x^2" и "x^3" на событие OnClick кнопки "x^2" пишем:
 
procedure TForm1.Button35Click(Sender: TObject);
begin
if edit1.Text<>'' then
edit1.Text:=
floattostr(strtofloat(edit1.Text)*strtofloat(edit1.Text));
end;

Для кнопки "x^3" - аналогично.
Переименуем ещё одну кнопку в exp (Експонента), на OnClick Этой кнопки пишем:
 
procedure TForm1.Button40Click(Sender: TObject);
begin
if edit1.Text<>'' then
edit1.Text:=floattostr(exp(strtofloat(edit1.Text)));
end;

Переименуем следующую кнопку в "Int" (Возвращение целой части), пишем:
 
procedure TForm1.Button30Click(Sender: TObject);
begin
if edit1.Text<>'' then
edit1.Text:=floattostr(trunc(strtofloat(edit1.Text)));
end;

Следующая кнопка "not" (Возвращение противоположного числа + (-1) ).Пишем:
 
procedure TForm1.Button29Click(Sender: TObject);
begin
if edit1.Text<>'' then
edit1.Text:=floattostr(-(trunc(strtofloat(edit1.Text))+1));
end;

Следующей будет кнопка "ln". Пишем:
 
procedure TForm1.Button31Click(Sender: TObject);
begin
if edit1.Text<>'' then
if strtofloat(edit1.Text)>0 then
edit1.Text:=floattostr(ln(strtofloat(edit1.Text)));
end;

Следующая кнопка "1/х". Пишем аналогично предыдущему.
Следующая - кнопка Backspace. Пишем:
 procedure TForm1.Button36Click(Sender: TObject); 
var
s:string;
begin
s:=edit1.Text;
delete(s,length(s),1);
edit1.Text:=s;
end;

Осталось две кнопки, переименуем в "С" и "Close"
В первой пишем:
 
procedure TForm1.Button38Click(Sender: TObject);
begin
edit1.Clear;
end;

А во второй:
 
procedure TForm1.Button37Click(Sender: TObject);
begin
close();
end;


Удачи!


2011-10-24 • Просмотров [ 48475 ]