Kalkulator jak w windowsie

0

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ć?

0

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

0

Ok dzieki, jeszcze jedno pytanie, jakie jest polecenie na usuniecie tej liczby z pamięci ?

0

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.

0

Dzieki za rade Spine, zrobie tak jak pisałeś tylko z przyciskami, takie wymogi zadania ;/

0

Wyzerowanie zmiennej? s := nil albo s := 0
chyba nie jestem pewien.

0

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

0

Mógłbys pokazać zmienne, czy są globalne czy w przycisku oraz jakos jasniej opisać problem?

0

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

0

Jakbyś formatował kod, to byś wiedział, co masz źle.
Else Begin
(* ... *)
End;

0

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

0

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);

0

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

0

Możesz jakos jasniej pisać?

0

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;
0

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

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ć.

0

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

0

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 .

1 użytkowników online, w tym zalogowanych: 0, gości: 1