Witam,
Staram się napisać podobny kalkulator jak w windows'ie ale nie wiem jak zrobć z tylko 1 editem, z 2 editami i 1 labelem latwo, a mnei interesuje jak zrobic z 1 editem i zeby obliczalo tak jak w windows'owym, mianowicie chodzi o to ze jak wpisze np 321 i wcisne button + to ta liczba zniknie po czym wpisuje np 2 i po wcisnieciu = wyskakuje wynik 323. Da się coś takiego zrobić?
Da się zrobić wszystko...
Musisz, zapisać gdzie edit. i następnie wyzerować go.
Masz tu przykład.
procedure TForm1.btnDodaj(Sender: TObject);
begin
if i = 0
then
begin
i := strtoint(edit1.text);
edit1.text := '';
end
else
s := strtoint(edit1.text);
edit1.text := '';
end;
procedure TForm1.btnWynik(Sender: TObject);
var
x : integer;
begin
x := i + s;
edit1.text := inttostr(x);
end;
Co prawda przykład działa tylko na 2 liczbach, ale jak pomyslisz to ogarniesz to :P
Ok dzieki, jeszcze jedno pytanie, jakie jest polecenie na usuniecie tej liczby z pamięci ?
Utwórz strukturę dynamiczną, np. lista, stos, kolejka. Jak to zrobisz, to będziesz wiedział jak dodawać do niej liczby lub usuwać. Nie polecam korzystania ze zwykłych tablic statycznych do takiego zadania. Ogólnie to szybciej i lepiej jest napisać parser wyrażeń matematycznych zamiast naśladować prymitywny kalkulator. Szybciej wpisać z klawiatury liczby, nazwy funkcji, działania itp. niż szukać na przyciskach kalkulatora. Oczywiście możesz zrobić przyciski wstawiające nazwy funkcji, liczbę PI itp., bo ludzie różnie nazywają funkcje w kalkulatorach (np. masz atan i arctan itp.), ale całe wyrażenie zawrzesz w jednym edicie, bez potrzeby odkładania działań i liczb na stos.
Dzieki za rade Spine, zrobie tak jak pisałeś tylko z przyciskami, takie wymogi zadania ;/
Wyzerowanie zmiennej? s := nil albo s := 0
chyba nie jestem pewien.
Racja ;p jak moglem zapomniec ^^
cos mi nie pasuje
bo mam ten kod pod przyciskiem =
procedure TForm1.Button15Click(Sender: TObject);
begin
b := strtofloat(edit1.Text);
x :=a + b;
edit1.text := floattostr(x);
end;
to jest git tylko ze wtedy po wcisnieciu = bedzie mi tylko dodawac probowalem dodac ten kod od +
procedure TForm1.Button11Click(Sender: TObject);
begin
if a = 0 then
begin
a := strtofloat(edit1.text);
edit1.text := '';
end
else
b := strtofloat(edit1.text);
edit1.text := '';
x := a + b;
edit1.text := floattostr(x);
to mi nie resetuje edita tylko dodaje do 1 cyfre 2 po czym wychodzi 12
Mógłbys pokazać zmienne, czy są globalne czy w przycisku oraz jakos jasniej opisać problem?
Włącz windowsowego kalkulatora i zobacz jak działa wciskasz 1 klikasz + wpisujesz 1 i dajesz + to ci wychodzi 2
wlasnie cos takiego chce zrobic bo jak mam przy plusie
procedure TForm1.btnDodaj(Sender: TObject);
begin
if i = 0
then
begin
i := strtoint(edit1.text);
edit1.text := '';
end
else
s := strtoint(edit1.text);
edit1.text := '';
to mi nie doda dopiero gdy wcisne = ale za kazdym razem bedzie mi dodawalo gdy wcisne = dlatego chce zrobic tak jak napisalem wyzej
Jakbyś formatował kod, to byś wiedział, co masz źle.
Else Begin
(* ... *)
End;
Zwykly pominiety blad przy cofaniu kodu, nie o to mi chodziło... przeczytaj to co napisalem o windowsowym kalkulatorze
procedure TForm1.Button11Click(Sender: TObject);
begin
if a <> 0
then
begin
a := strtofloat(edit1.text);
edit1.text := '';
end
else
begin
b := strtofloat(edit1.text);
edit1.text := '';
end;
begin
x := a + b;
edit1.text := floattostr(x);
end;
gdy dodaje do kodu
begin
x := a + b;
edit1.text := floattostr(x);
end
to po wcisnieciu buttona + nie usuwa wartosci z edit'a
var
x : integer
procedure TForm1.btnDodaj(Sender: TObject);
begin
if i = 0
then
begin
i := strtoint(edit1.text);
edit1.text := '';
end
else
s := strtoint(edit1.text);
x := s + i;
edit1.text := inttostr(x);
Niby dobrze ale gdy wpisze np 2 i wcisne + to mi nie znika 2 i wpisuje sie dalej, ale za to jak wpisze 2 i wcisne dwa razy + to mi doda 2+2
Możesz jakos jasniej pisać?
Jeżeli to ma działać jak Windowsowy Kalkulator to ja bym zrobił coś w tym stylu, chyba to działa jak należy. Tylko, że dla 10 buttonów zrobił bym jedną procedurę i przypisał ją wraz z Tagami w pętli w OnCreate formatki. Jeżeli nie o takie działanie Tobie chodzi lub coś pomieszałem to sam nie wiem - może ktoś inny coś lepszego tutaj Tobie doradzi. I bardzo ważne jest abyś formatował kod po ludzku, bo tak się pogubisz. Jak sam nie potrafisz to skorzystaj z narzędzia na http://olesio.eu/delfor . A i przykład jest dla liczb całkowitych, ale można i później pokombinowąc z tymi zmiennoiprzecinkowymi również.
//...
public
DigitOne, DigitTwo, AResult : Int64;
NewOperation, PlusClicked, Got2NdDigit : boolean;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
AResult := 0;
DigitOne := 0;
DigitTwo := 0;
Btn2.Tag := 2;
Btn3.Tag := 3;
NewOperation := True;
PlusClicked := False;
Got2NdDigit := False;
ResultEdit.Text := '0';
Application.Title := Caption;
end;
procedure TForm1.Btn2Click(Sender: TObject);
var
Btn : Tbutton;
begin
Btn := Tbutton(Sender);
if NewOperation = True then
begin
NewOperation := False;
ResultEdit.Text := IntToStr(Btn.Tag);
end
else
begin
ResultEdit.Text := ResultEdit.Text + IntToStr(Btn.Tag);
end;
end;
procedure TForm1.Btn3Click(Sender: TObject);
var
Btn : Tbutton;
begin
Btn := Tbutton(Sender);
if NewOperation = True then
begin
NewOperation := False;
ResultEdit.Text := IntToStr(Btn.Tag);
end
else
begin
ResultEdit.Text := ResultEdit.Text + IntToStr(Btn.Tag);
end;
end;
procedure TForm1.ClearBtnClick(Sender: TObject);
begin
AResult := 0;
DigitOne := 0;
DigitTwo := 0;
NewOperation := True;
PlusClicked := False;
Got2NdDigit := False;
ResultEdit.Text := '0';
end;
procedure TForm1.PlusBtnClick(Sender: TObject);
begin
NewOperation := True;
if PlusClicked = False then
begin
PlusClicked := True;
Got2NdDigit := False;
DigitOne := StrToInt64(ResultEdit.Text);
end
else
begin
if Got2NdDigit = False then
begin
Got2NdDigit := True;
DigitTwo := StrToInt64(ResultEdit.Text);
AResult := DigitOne + DigitTwo;
end
else
begin
AResult := AResult + DigitTwo;
end;
ResultEdit.Text := IntToStr(AResult);
end;
end;
mozesz mi powiedzieć co to jest to w formie ?
AResult := 0;
DigitOne := 0;
DigitTwo := 0;
Btn2.Tag := 2;
Btn3.Tag := 3;
NewOperation := True;
PlusClicked := False;
Got2NdDigit := False;
3 ostatnie to buttony a 4 pierwsze ?? o,0
Ja wolę zawszę ustawić w OnCreate nadać zmiennym wartości początkowe. Nawet jeżeli zmienne globalne liczbowe - zawsze wynoszą zero, a booleanowskie False, to lepiej to ustawić. Tam gdzie ustawiam Tagi to dla Buttonów żeby liczbę przy działaniach pobierało z Tagu, wtedy można napisać jedną wspólną porcedurę OnClick dla przycisków od 0 do 9. Pozostałe linijki to ustawienie wartości zmiennych, które są w sekcji public. Jeżeli zmienne są elementami klasy i odwołujemy się do nich w tej samej klasie - piszemy po prostu Zmienna := Cośtam; ale możemy też NazwaFormatki.ZmiennaSekcjiPublic := Cośtam; Czym się różni sekcja public od private oraz inne tego typu podstawy są omówione w kompendium na stronie 4p, najlepiej przeczytać je wcześniej całe, jeżeli się chcesz brać za programowanie w Delphi, znacznie więcej zrozumiesz i będzie Tobie łatwiej później samodzielnie kodzić.
Mógł by ktoś wyjaśnić ten kod
if((b = '') AND (Edit1.Tag = 1)) then
Delete(tmp, 1, Length(tmp)-1);
if((pos('0', tmp) = 1) AND (pos(',', tmp) = 0) AND (Length(tmp) <> 1)) then
Delete(tmp , 1, 1);
if(pos(',' ,(Copy(tmp, pos(',', tmp)+1, (Length(tmp)-pos(',', tmp))))) <> 0) then
Delete(tmp, Length(tmp), 1);
if(Edit1.Tag = 0) then a := tmp
else b := tmp;
end;
Edit1.Text := tmp;
end;
pos to na pewno pozycja, a tmp to cos z czyms tymczasowym ;p
Google Tobie wyłaczyli? Czego konkretnie nie rozumiesz? Wszystko masz opisane na
And
Pos
Delete
Length
Oraz dodatkowych artykułach, do których prowadzą linki na wymienionych stronach. A i chyba lepiej, że ktoś nazwał sobie zmienną Tmp niż X czy S, także i może traktują ją jako tymczasową, ale to trzeba by mieć cały kod i przede wszystkim jakoś po ludzku sformatowany, a nie "psu z gadła wyjęty". Powtarzam po raz kolejny. Nie umiesz sam porobić wcięć to użyj: http://olesio.eu/delfor .