kalkulator w delphi z jednym editem i buttonami

0

Cześć, szukałem na forumale znalazłem nie do końca to o co mi chodziło.
Mianowicie stworzyłem na razie tyle:

 unit kalk;

interface

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

type
  TForm1 = class(TForm)
    jeden: TButton;
    dwa: TButton;
    trzy: TButton;
    cztery: TButton;
    piec: TButton;
    szesc: TButton;
    siedem: TButton;
    osiem: TButton;
    dziewiec: TButton;
    zero: TButton;
    czysc: TButton;
    wynik: TButton;
    plus: TButton;
    minus: TButton;
    razy: TButton;
    dziel: TButton;
    Edit1: TEdit;
    procedure czyscClick(Sender: TObject);
    procedure jedenClick(Sender: TObject);
    procedure dwaClick(Sender: TObject);
    procedure trzyClick(Sender: TObject);
    procedure czteryClick(Sender: TObject);
    procedure piecClick(Sender: TObject);
    procedure szescClick(Sender: TObject);
    procedure siedemClick(Sender: TObject);
    procedure osiemClick(Sender: TObject);
    procedure dziewiecClick(Sender: TObject);
    procedure zeroClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.czyscClick(Sender: TObject);
begin
Edit1.Text := '';
end;

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

procedure TForm1.dwaClick(Sender: TObject);
begin
Edit1.Text := Edit1.Text + '2';
end;

procedure TForm1.trzyClick(Sender: TObject);
begin
Edit1.Text := Edit1.Text + '3';
end;

procedure TForm1.czteryClick(Sender: TObject);
begin
Edit1.Text := Edit1.Text + '4';
end;

procedure TForm1.piecClick(Sender: TObject);
begin
Edit1.Text := Edit1.Text + '5';
end;

procedure TForm1.szescClick(Sender: TObject);
begin
Edit1.Text := Edit1.Text + '6';
end;

procedure TForm1.siedemClick(Sender: TObject);
begin
Edit1.Text := Edit1.Text + '7';
end;

procedure TForm1.osiemClick(Sender: TObject);
begin
Edit1.Text := Edit1.Text + '8';
end;

procedure TForm1.dziewiecClick(Sender: TObject);
begin
Edit1.Text := Edit1.Text + '9';
end;

procedure TForm1.zeroClick(Sender: TObject);
begin
Edit1.Text := Edit1.Text + '0';
end;

end.


...i nie wiem jak wykonac na tym operacje:+,-,/,* i pokaz wynik
Proszę o jasne odpowiedzi bo jestem z tego zielony.
By uniknąć niedomówień najlepiej jakby ktoś podesłał to całe gotowe a ja to se przeanalizuje.
program wygląda tak jak w załączniku.

Z góry dzięki

0

By uniknąć niedomówień najlepiej jakby ktoś podesłał to całe gotowe a ja to se przeanalizuje.

Tak łatwo nie ma.

Operacje dodawania/odejmowania/wtf możesz zrobić na takiej zasadzie:
1.Użytkownik wprowadza liczbę
2.Naciska +
3.Liczba zostaje dodana do zmiennej typu int (nazwijmy ją Int1) (bądź innej, zależy czy będziemy chcieli także obsługę liczb zmiennoprzecinkowych)
4.TEdit zostaje wyzerowany (aby użytkownik mógł wprowadzić drugą liczbę)
5.Po naciśnięciu = aktualna liczba znajdująca się w edit'cie zostaje dodana do osobnej zmiennej int (nazwijmy ją Int2)
6.Dodajemy obie liczby, a wynik zapisujemy do Int1
7.Czekamy na działanie do wykonania
8.Czekamy na liczbę (i od razu zapisujemy ją w Int2 (!))
9.I tak dalej.

0

Proszę o jasne odpowiedzi bo jestem z tego zielony.
By uniknąć niedomówień najlepiej jakby ktoś podesłał to całe gotowe a ja to se przeanalizuje.

Nie dajemy gotowców (poza olesiem .). Każdy głupi umie zrobić dodawanie znaków do edita i zrobić GUI, trudniej jest zrobić właściwą część.
Moja porada: Naucz się programować na prawdę, potem przeanalizuj to co Patryk27 powiedział i napisz to.

0

Ja też już nie daje gotowców, chyba że sam już napisałem wcześniej coś co może pomóc pytającemu i oczywiście chcę to udostępnić publicznie. Ja tylko uzupełnie poprzednie odpowiedzi o to, że obsługę przycisków z cyframi można dać pod jedną procedurę (dla zera tylko osobny kod ze sprawdzaniem po to aby nie wpisywać w Edit na przykład samo "000000"). Cyfry do dodawania ustawiasz jako wlasność Tag tych buttonów, a później robisz WynikEdit.Text := WynikEdit.Text + IntToStr(TButton(Sender).Tag);.

0

Z operatorami też można sobie poradzić za pomocą Tag i podpiąć pod 1 przycisk wszystkie zdarzenia onClick tylko dla przejrzystości kodu lepiej sobie zadeklarować:

type
  TOperand = (opAdd, opSub, opMul, opDiv);

a poźniej w OnClick przycisków dodawania, odejmowania, mnożenia, dzielenia:

procedure TForm1.btnOperandClick(Sender: TObject);
var
  operand: TOperand;
begin
  operand:= TOperand(TButton(Sender).Tag);
  case operand of
    opAdd: ShowMessage('+');
    opSub: ShowMessage('-');
    opMul: ShowMessage('*');
    opDiv: ShowMessage('/');
  end;
end;

Oczywiście ShowMessage to przykład tam musisz dać kod wykonujący dane działanie.

0

okej, robie po kolei jak mówił Patryk27 no ale coś mi nie wychodzi bo robie coś takiego:

  
procedure TForm1.plusClick(Sender: TObject);
begin
int1:= StrToInt(Edit1.text);
Edit1.Text := '';
int1:= int1+int2;
end;

procedure TForm1.wynikClick(Sender: TObject);
begin
int2:= StrToInt(Edit1.text);

Edit1.text:= IntToStr(int1);

end;

end.

...wtedy wyświetla tylko tą pierwszą liczbe, a jak to int1:= int1+int2; włoże do procedury TForm1.wynikClick to wtedy działa tylko że dla innych działań też mi to sumuje. Wiem ze to jakiś debilny błąd, ale co robie nie tak?

0
Patryk27 napisał(a)

By uniknąć niedomówień najlepiej jakby ktoś podesłał to całe gotowe a ja to se przeanalizuje.

Tak łatwo nie ma.

Operacje dodawania/odejmowania/wtf możesz zrobić na takiej zasadzie:
1.Użytkownik wprowadza liczbę
2.Naciska +
3.Liczba zostaje dodana do zmiennej typu int (nazwijmy ją Int1) (bądź innej, zależy czy będziemy chcieli także obsługę liczb zmiennoprzecinkowych)
4.TEdit zostaje wyzerowany (aby użytkownik mógł wprowadzić drugą liczbę)
5.Po naciśnięciu = aktualna liczba znajdująca się w edit'cie zostaje dodana do osobnej zmiennej int (nazwijmy ją Int2)
6.Dodajemy obie liczby, a wynik zapisujemy do Int1
7.Czekamy na działanie do wykonania
8.Czekamy na liczbę (i od razu zapisujemy ją w Int2 (!))
9.I tak dalej.

Bez sensu, a jeśli będę chciał dodać więcej liczb ?

var
  Form1: TForm1;
  zmienna:integer=0;
implementation

{$R *.dfm}

procedure TForm1.dodajClick(Sender: TObject);
begin
  zmienna:=zmienna+strtoint(edit1.text);
  edit1.Clear;
end;

procedure TForm1.wynikClick(Sender: TObject);
begin
  edit1.text:=inttostr(zmienna);
  zmienna:=0;
end;

A jeśli chciałbyś np ostatnią sumę jeszcze pomnożyć, podzielić itd, dodaj sobie kolejna zmienna, np ostatnia_zmienna
i ostatnia_zmienna:=zmienna;
i strzelasz sobie rownanie zmienna:=ostatnia_zmienna*zmienna
a jesli chcesz wykonać jakieś działanie od nowa to dodaj button 'wyczysc'
a w nim zadeklaruj ostatnia_zmienna:=0;

0

Robie dokładnie tak jak pokazał Grzegorz, a program wciąż jakby nie umie mi tego dodać.Klikam "=" a on wyświetla mi tą pierwszą liczbę...

0

Nie chce mi się klepać kodu, widząc brak samodzielności pytającego, ale uważam, że można pokombinować ze zmienną typu boolean i sprawdzać czy już pierwsza liczba zostałą ustalona. Jeżeli tak to pobieramy drugą i ustalamy działanie między nimi. Po wciśnięciu znaku równości ustalamy pierwszą jako wynik i go podajemy. Nad identycznym działaniem jak Windowsowy Kalkulator należało by pomyślec, chociaż jeżeli nie jest to program na zaliczenie to nie widzę wielkiego sensu marnowac na jego napisanie czasu. Chyba, że autor sam dla swojego poszerzenia wiedzy by to robił. Ale tutaj z co chwile zadawanych przez niego pytań nie widzę zaangażowania. I tak nic lepszego niż kalkulator dostepny w Windowsach się nie napisze, chyba że podejdzie się do tematu ambitnie i zrobi się kalkulator z róznumi działaniami, nawiasami i innymi "bajerami", ale i takie kalkulatory ktoś już kiedyś stworzył.

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