Помощь - Поиск - Пользователи - Календарь
Полная версия: Компонент-Калькулятор
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Zigfried
При создании калькулятора возникла проблема: в задаче есть 2 Edit'а в них вводятся значения a и b над которыми производятся определённые операции,поставив курсор в Edit1 и вводя значения при помощи кнопок калькулятора вводится нормально а когда поставить курсор на Edit2 и начав вводить значения при помощи кнопок курсор перескакивает на Edit1 и начинает вводить значения туда,помогите пожалуйста это исправить.
Проблему можно увидеть в процедурах Button2Click-Button11Click и в Button25Click. Там видно что коряво это написал но по другому не знаю как(



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit3: TEdit;
Edit1: TEdit;
Edit2: TEdit;
Image1: TImage;
Image2: TImage;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Button9: TButton;
Button10: TButton;
Button11: TButton;
Button12: TButton;
Button13: TButton;
Button14: TButton;
Button15: TButton;
Button17: TButton;
Button18: TButton;
Button19: TButton;
Button20: TButton;
Button21: TButton;
Button22: TButton;
Button23: TButton;
Button25: TButton;
CheckBox1: TCheckBox;
Button1: TButton;
CheckBox2: TCheckBox;

procedure Edit1Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Image1Click(Sender: TObject);
procedure Image2Click(Sender: TObject);
procedure Button16Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
procedure Button13Click(Sender: TObject);
procedure Button14Click(Sender: TObject);
procedure Button15Click(Sender: TObject);
procedure Button17Click(Sender: TObject);
procedure Button18Click(Sender: TObject);
procedure Button19Click(Sender: TObject);
procedure Button20Click(Sender: TObject);
procedure Button21Click(Sender: TObject);
procedure Button23Click(Sender: TObject);

procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure Button22Click(Sender: TObject);
procedure Button25Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

s1,s2: string;
a,b,c: real;
operacia, i, k: integer;
vibrano, injener: boolean;

implementation

{$R *.dfm}

procedure ravno;
begin
if ((form1.Edit1.Text='') or (form1.Edit2.Text='')) and
(injener=false) then begin
showmessage('не задан операнд');
exit;
end;

a:=strtofloat(form1.Edit1.Text);
if injener <> true then b:=strtofloat(form1.Edit2.Text);


if (b=0) and(form1.Edit2.Text<>'')then begin
showmessage('На ноль делить нельзя');
form1.Edit2.Text:='';
exit;
end;

case operacia of
1: c:=a+b;
2: c:=a-b;
3: c:=a*b;
4: c:=a/b;
5: begin
if form1.checkbox2.checked=true then c:=sin(a*Pi/180) else
c:=sin(a);
end;
6: begin
if form1.checkbox2.checked=true then c:=cos(a*Pi/180) else
c:=cos(a);
end;
7: begin
if form1.checkbox2.checked=true then c:=sin(a*Pi/180)/cos(a*Pi/180) else
c:=sin(a)/cos(a);
end;
8: begin
if form1.checkbox2.checked=true then c:=cos(a*Pi/180)/sin(a*Pi/180) else
c:=cos(a)/sin(a);
end;
9: c:=sqrt(a);
10: c:=a*a;
11:
begin
c:=1;
k:= strtoint(form1.edit2.text);
for i:=1 to k do c:=a*c;
end;

end; //case
form1.Edit3.text:=floattostrf(c,ffGeneral,18,4);

end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
Edit3.text:='';
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
Edit3.text:='';
vibrano:=true;
end;




procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9','+','-',#8]) then key :=#0;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
var i: integer;
begin
if not (key in ['0'..'9','+','-',#8]) then key :=#0;

end;

procedure TForm1.Image1Click(Sender: TObject);
begin
showmessage('Кротов Роман. ТПМ-301. 2009 год.');
end;

procedure TForm1.Image2Click(Sender: TObject);
begin
form1.Close;
end;

procedure TForm1.Button16Click(Sender: TObject);
begin
button17.Visible:=true;
button18.Visible:=true;
button19.Visible:=true;
button20.Visible:=true;
button21.Visible:=true;
button23.Visible:=true;
checkbox2.Visible:=false;
end;

procedure TForm1.Button12Click(Sender: TObject);
begin
operacia:=1; injener:=false;
ravno;
end;

procedure TForm1.Button13Click(Sender: TObject);
begin
operacia:=2; injener:=false;
ravno;
end;

procedure TForm1.Button14Click(Sender: TObject);
begin
operacia:=3; injener:=false;
ravno;
end;

procedure TForm1.Button15Click(Sender: TObject);
begin
operacia:=4; injener:=false;
ravno;
end;

procedure TForm1.Button17Click(Sender: TObject);
begin
operacia:=5;
injener:=true;
ravno;
end;

procedure TForm1.Button18Click(Sender: TObject);
begin
operacia:=6;

injener:=true;
ravno;
end;

procedure TForm1.Button19Click(Sender: TObject);
begin
operacia:=7;
injener:=true; ravno;
end;

procedure TForm1.Button20Click(Sender: TObject);
begin
operacia:=8; injener:=true; ravno;
end;

procedure TForm1.Button21Click(Sender: TObject);
begin
operacia:=9; injener:=true; ravno;
end;

procedure TForm1.Button23Click(Sender: TObject);
begin
operacia:=10; injener:=true;ravno;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
s1:=edit1.Text;
s1:=s1+'0';
edit1.Text:=s1;

end;

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


end;

procedure TForm1.Button4Click(Sender: TObject);
begin
s1:=edit1.Text;
s1:=s1+'2';
edit1.Text:=s1;


end;

procedure TForm1.Button5Click(Sender: TObject);
begin
s1:=edit1.Text;
s1:=s1+'3';
edit1.Text:=s1;


end;

procedure TForm1.Button6Click(Sender: TObject);
begin
s1:=edit1.Text;
s1:=s1+'4';
edit1.Text:=s1;


end;

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


end;

procedure TForm1.Button8Click(Sender: TObject);
begin
s1:=edit1.Text;
s1:=s1+'6';
edit1.Text:=s1;


end;

procedure TForm1.Button9Click(Sender: TObject);
begin
s1:=edit1.Text;
s1:=s1+'7';
edit1.Text:=s1;

end;

procedure TForm1.Button10Click(Sender: TObject);
begin
s1:=edit1.Text;
s1:=s1+'8';
edit1.Text:=s1;


end;

procedure TForm1.Button11Click(Sender: TObject);
begin
s1:=edit1.Text;
s1:=s1+'9';
edit1.Text:=s1;


end;

procedure TForm1.Button22Click(Sender: TObject);
begin
s1:=edit1.Text;
s1:='';
edit1.Text:=s1;
s2:=edit2.Text;
s2:='';
edit2.Text:=s2;

end;

procedure TForm1.Button25Click(Sender: TObject);
begin
s1:=edit1.Text;
s1:=s1+',';
edit1.Text:=s1;

end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked=true then
begin
button17.Visible:=true;
button18.Visible:=true;
button19.Visible:=true;
button20.Visible:=true;
button21.Visible:=true;
checkbox2.Visible:=true;
button1.Visible:=true;
button23.Visible:=true

end
else
begin
button17.Visible:=false;
button18.Visible:=false;
button19.Visible:=false;
button20.Visible:=false;
button21.Visible:=false;
checkbox2.Visible:=false;
button23.Visible:=false;
button1.Visible:=false;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
operacia:=11;
injener:=false;
ravno;
end;

end.

IUnknown
Цитата
начав вводить значения при помощи кнопок курсор перескакивает на Edit1 и начинает вводить значения туда
Разумеется, ты открытым текстом приказываешь ему это сделать:

Цитата
procedure TForm1.Button11Click(Sender: TObject);
begin
s1:=edit1.Text;
s1:=s1+'9';
edit1.Text:=s1;
end;
Исправить можно так: Объявить еще одну переменную (скажем currEdit) типа TEdit, написать вот такой обработчик:

procedure TForm1.MyEditClick(Sender: TObject);
begin
CurrEdit := Sender as TEdit;
end;

, и повесить его на событие OnClick ОБОИХ эдитов. А в обработчике нажатия кнопок работать не с Edit1, а с CurrEdit, тогда кнопка будет добавлять текст к тому полю, на котором до этого был установлен фокус.
Zigfried
А можно ещё раз пояснить с обработчиком,его нужно повесить на процедуры EditChange или EditKeypress, и как в процедуре работать с currEdit???
IUnknown
Его нужно повесить на OnClick, этот обработчик должен вызываться не тогда, когда содержимое меняется, и не тогда, когда ты нажимаешь кнопку, находясь в Эдите, а тогда, когда ты кликаешь по нему мышью.

В коде выглядит так:
// Описание класса формы
// ...
private
{ Private declarations }
public
{ Public declarations }
currEdit : TEdit;
procedure MyEditClick(Sender: TObject);
end;

// ... Потом в любом месте секции Implementation - реализация MyEditClick
{$R *.dfm}

procedure TForm1.MyEditClick(Sender: TObject);
begin
CurrEdit := Sender as TEdit;
end;

// А в событии OnCreate формы - вот так:
procedure TForm1.FormCreate(Sender: TObject);
begin
currEdit := Edit1;
Edit1.OnClick := MyEditClick;
Edit2.OnClick := MyEditClick;
end;
, а потом во всех своих обработчиках Button...Click меняешь код

// С вот такого
s1:=edit1.Text;
s1:=s1+'9';
edit1.Text:=s1;

// На такой:
CurrEdit.Text := CurrEdit.Text + '9';
, и так далее. Можно, кстати, и вообще все обработчики заменить одним-единственным. Ты ж проект не присоединил, если у тебя текст на кнопке совпадает с тем, что надо добавлять в эдит - то делается еще проще: пишется опять же один обработчик
procedure TForm1.MyButtonClick(Sender: TObject);
begin
CurrEdit.Text := CurrEdit.Text + (Sender as TButton).Caption;
end;

, и назначается всем кнопкам...
Zigfried
Спасибо большое за помощь,выручили smile.gif
А не подскажите как из этой сделать компонент? То есть мы выбираем вкладку компонент задаём New Component задаём параметры а как записать в виде кода дальше я не понимаю. Подскажите пожалуйста.
Zigfried
Помогите пожалуйста очень надо)
TarasBer
Цитата

procedure Button16Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
procedure Button13Click(Sender: TObject);
procedure Button14Click(Sender: TObject);
procedure Button15Click(Sender: TObject);
procedure Button17Click(Sender: TObject);
procedure Button18Click(Sender: TObject);
procedure Button19Click(Sender: TObject);
procedure Button20Click(Sender: TObject);
procedure Button21Click(Sender: TObject);
procedure Button23Click(Sender: TObject);

procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure Button22Click(Sender: TObject);
procedure Button25Click(Sender: TObject);


Охренительные названия методов.
Дай же всем кнопкам человеческие имена и методам тоже, сразу понятнее будет, что вообще происходит.
Zigfried
procedure Button12Click(Sender: TObject);-кнопка плюс
procedure Button13Click(Sender: TObject);-минус
procedure Button14Click(Sender: TObject);-умножение
procedure Button15Click(Sender: TObject);-деление
procedure Button17Click(Sender: TObject);-синус
procedure Button18Click(Sender: TObject);-косинус
procedure Button19Click(Sender: TObject);-тангенс
procedure Button20Click(Sender: TObject);-котангенс
procedure Button21Click(Sender: TObject);-квадратный корень
procedure Button23Click(Sender: TObject);-возвести а в квадрат

procedure Button2Click(Sender: TObject);-0
procedure Button3Click(Sender: TObject);-1
procedure Button4Click(Sender: TObject);-2
procedure Button5Click(Sender: TObject);-3
procedure Button6Click(Sender: TObject);-4
procedure Button7Click(Sender: TObject);-5
procedure Button8Click(Sender: TObject);-6
procedure Button9Click(Sender: TObject);-7
procedure Button10Click(Sender: TObject);-8
procedure Button11Click(Sender: TObject);-9
procedure Button22Click(Sender: TObject);-сброс
procedure Button25Click(Sender: TObject)-запятая
procedure Button1Click(Sender: TObject)-возвести а в степень b
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.