Kalkulator w Delphi

0

Witam!

Chciałbym napisać prosty kalkulator w Delphi7, a że jestem ambitny, chciałbym, aby wyglądał on jak prawdziwy kalkulator, a więc nie chodzi mi o wpisanie pierwszej liczby do Edit1, drugiej do Edit2 i obliczenie tego w Edit3. Chciałbym zrobić to tak: umieszczam 12 przycisków (10 na cyfry od 0-9, jedenasty na przycisk +, a dwunasty na =). I tu moje pytanie, jak zrobić, aby kliknięta cyfra pojawiała się w moim Edicie1, przy czym po kliknięciu drugiej cyfry nie "zmazywałaby" ona tej pierwszej, po kliknięciu znaku plus program zapisywałby pierwszą podaną liczbę i prosił o drugą, a po kliknięciu "=" program pokazałby wynik.

Z góry dziękuję.

1

Skoro jesteś ambitny to byś zrobił full-wypas z obsługą nawiasów itd. :]

Jeżeli chcesz, żeby "dodała" się liczba do TextBox'a, to po prostu w zdarzeniu onClick odpowiedniego button'a wstaw linijkę:

textBox1.Caption := textBox1.Caption + IntToStr(numerek);

Jak dobrze pamiętam w Delphi, Caption odpowiadało za to, co wyświetla się na TextBox'ie. Z kolei z dodawaniem, jeżeli chcesz zrobić jak mówisz, to przy zdarzeniu onTextChange czy coś podobnego twojego TextBox'a wstaw przypisywanie do zmiennej globalnej liczby przed "+" <- nie pamiętam jak w Delphi można pobrać jakiegoś string'a bez ostatniego znaku :/ W każdym razie musisz pobrać to co jest w TextBox'ie - 1 znak (bajt). To samo z drugą liczbą, tyle, że przed wczytaniem pierwszej musisz zapamiętać pozycję. Drugą liczbę wczytujesz tak że, wczytujesz od zapamiętanej pozycji do końca i to zamieniasz na Int'a. Sumowanie to chyba wiesz wynik := liczba1 + liczba1;.

Ktoś kto zajmuje się Delphi albo pamięta jak się robiło operacje na stringach powie ci, jak wczytać tak jak mówię.

0

O ile dobrze zrozumiałem to chodzi po prostu o takie coś:

  WynikEdit.Text := WynikEdit.Text + 'coś';

I pytania o banalne podstawy zadajemy w dziale Newbie, tam też przenoszę ten wątek.

0

Witam ponownie! Mam pytanie. Zrobiłem 2 edity, do których wpisuję dwie liczby i chciałbym, żeby w przypadku kiedy nie wpiszemy nic do naszego pola a klikniemy przycisk oblicz wyświetlił nam się komunikat. Mógłby mi ktoś powiedzieć jak to ma wyglądać? Do tej pory robiłem to tak, ale to nie działa:

 if Edit1.Text = ''
  then
    Edit4.Text:= 'Podaj liczbę pierwszą!'
0

Czyżby nie dałeś średnika po instrukcji?

0

Nie, nie o to chodzi. W Delphi się go nie daje.

0

Tak, chodziło mi o to, że po instrukcji if'a się nie daje. Dla przykładu wrzucę kod źródłowy działającej procedury z if'em.

 procedure TForm1.Button4Click(Sender : TObject);

var
  Liczba1, Liczba2, wynik : real;

begin
  Liczba1 := StrToFloat(Edit1.Text);
  Liczba2 := StrToFloat(Edit2.Text);
  if Liczba2 = 0
    then
    Edit4.Text := 'Nie dzieli sie przez zero'
  else
  begin
    Wynik := Liczba1 / Liczba2;
    Edit4.Text := Edit1.Text + ' / ' + Edit2.Text + ' = ' + FloatToStr(Wynik);
  end;
end;
0

W Delphi się go nie daje.

Po każdej instrukcji się daje średnik w Delphi. Są coprawda wyjątki gdzie można pominąć ale po konstrukcji if ... then [... else] wymagany jest średnik.

0

W takim razie powiedz mi jak wrzucony wyżej kod ma wyglądać ze średnikami?

0
if warunek then instrukcja;{musi być średnik}
if warunek then instrukcja1{tutaj nie może być średnika} else instrukcja2;{musi być średnik}
0

Dziękuję pelsta, że wyjaśniłeś. Jak widać zrobione jest tak jak napisałeś, więc nie chodzi tu o średnik. Jestem pewien, że po prostu wpisuję coś źle tutaj:

 if Edit1.Text = ''

Jaki warunek powinienem wpisać?

0
if edit1.text='' then edit4.text:='Twoj tekst';
0

Jak mówilem chciałbym, żeby w przypadku kiedy nie wpiszemy nic do naszego pola, a klikniemy przycisk oblicz wyświetlił nam się komunikat. Tak wygląda moja procedura.

procedure TForm1.Button2Click(Sender : TObject);

var
  Liczba1, Liczba2, Wynik : real;

begin
  Liczba1 := StrToFloat(Edit1.Text);
  Liczba2 := StrToFloat(Edit2.Text);
  if Edit1.Text = ''
    then
    Edit4.Text := 'Podaj pierwszą liczbę!'
  else
  begin
    Wynik := Liczba1 - Liczba2;
    Edit4.Text := Edit1.Text + ' - ' + Edit2.Text + ' = ' + FloatToStr(Wynik);
  end;

end;
0

Pewnie gdy nie wpiszesz nic do Edit1 to wyskakuje błąd i nie wyświetla się komunikat w Edit4?

0

No jak najpierw konwertujesz nieliczbę na float, to wywala exception, musisz go złapać i wywalić komunikat że to nie liczba.
A jak to zrobić? Masy tutków od tego są.

1

Najpierw próbujesz odczytać liczbę z Edit1...

  Liczba1 := StrToFloat(Edit1.Text);

...a dopiero potem sprawdzasz co jest w Edit1.

  if Edit1.Text='' then...

Dobrze to robisz? Pomyśl.

Ponadto zainteresuj się funkcją

TryStrToFloat
0

No ja jakiś tam dobry nie jestem ale właśnie trzeba patrzeć na kolejnośći, niby szczegół widzisz jak się trudziłeś, po prostu tłumacz sobie kod, np. "konwertuje liczbe ( a przecież nie ma liczy) :D

0

Jak już kombinujesz to zrób to porządnie bo może równie dobrze ktoś nie wpisać nic do pola edit2 i będzie taki sam klops z błędem.

procedure TForm1.Button2Click(Sender: TObject);
var
  Liczba1, Liczba2 : real;
begin
if  (edit1.text='') or (edit2.text='')then
    Edit4.Text := 'Podaj liczbe'
    else begin
    Liczba1 := StrToFloat(Edit1.Text);
    Liczba2 := StrToFloat(Edit2.Text);
    edit4.text:=FloatToStr(Liczba1-Liczba2);
    end;
end;
0

Jak mówiłem dziś chciałbym dodać sprawdzenie czy wartość jest liczbą. Oto co zrobiłem(na razie tylko dla Edit1):

procedure TForm1.Button1Click(Sender : TObject);

var
  Liczba1, Liczba2, Wynik : real;

begin
  if Edit1.Text = ''
    then
    Edit4.Text := 'Upewnij się, że podałes liczby!'
  else
    if Edit2.Text = ''
      then
      Edit4.Text := 'Upewnij się, że podałes liczby!'
    else
    begin
      try
        StrToFloat(Edit1.Text);
      except Edit4.Text := 'Upewnij się, że podana wartosc jest liczbą!';
      end;
      Liczba1 := StrToFloat(Edit1.Text);
      Liczba2 := StrToFloat(Edit2.Text);
      Wynik := Liczba1 + Liczba2;
      Edit4.Text := Edit1.Text + ' + ' + Edit2.Text + ' = ' + FloatToStr(Wynik);
    end;
end;

Niby pokazuje mi komunikat "Upewnij się, że podana wartosc jest liczbą!", ale zaraz po tym wyskakuje błąd. Nie wiem czym to jest spowodowane, bo myślę, że kolejność dobra.

0

Co do FloatToStr(Wynik); Zobacz tez FormatFloat
http://www.delphibasics.co.uk/RTL.asp?Name=FormatFloat Ważne jest zaokrąglanie. Szczególnie w księgowości, gdzie wystawia się faktury Vat a następnie okazuje się, że zaokrąglanie rożni się w dwóch różnych programach. Tak nie może być, gdyż fiskus na to nie pozwoliłby. Więc w zaokrąglaniu w finansach stosuje się odpowiednie zasady.

0

Skoro już zastosowałeś blok try...except...end, to zrób to tak jak się należy

procedure TForm1.Button1Click(Sender: TObject);
var
  Liczba1, Liczba2, Wynik: Real;
begin
  if (Edit1.Text = '') or (Edit2.Text = '')
  then Edit4.Text:= 'Upewnij się, że podałes liczby!'
  else
    try
      Liczba1:= StrToFloat(Edit1.Text);
      Liczba2:= StrToFloat(Edit2.Text);
      Wynik:= Liczba1 + Liczba2;
      Edit4.Text:= Edit1.Text + ' + ' + Edit2.Text + ' = ' + FloatToStr(Wynik);
    except
      Edit4.Text:= 'Upewnij się, że podana wartość jest liczbą!';
    end;
end;
0

Ja zrobiłbym tak

procedure TForm1.Button1Click(Sender: TObject);
var
  Liczba1, Liczba2, Wynik: Double;
begin
  if TryStrToFloat(Edit1.Text,Liczba1) and TryStrToFloat(Edit2.Text,Liczba2) then
  begin
    Wynik:= Liczba1 + Liczba2;
    Edit4.Text:= Edit1.Text + ' + ' + Edit2.Text + ' = ' + FloatToStr(Wynik);
  end
  else
    Edit4.Text:= 'Upewnij się, że podana wartość jest liczbą!';
end;
0

Jeszcze w OnKeyPress w inspektorze na zakładce Events w Editach wpisz sobie

const znaki: set of char = ['-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', #8];
begin
 if not (key in znaki) then key := #0;
end;

Będziesz miał przynajmniej pewność, że nikt nie będzie wpisywał liter w edicie, a następnie będzie chciał wyliczyć.

0
Grzegorz Hubka napisał(a)

Będziesz miał przynajmniej pewność, że nikt nie będzie wpisywał liter w edicie, a następnie będzie chciał wyliczyć.

Trzeba jeszcze zabezpieczyć program przed wprowadzaniem niewłaściwej liczby, między iinnymi trzeba zareagować jak uytkownik będzie chciał umieścić znak - w środku liczby, czy dwa razy wstawić przecinek;

pawciol12 napisał(a)

a że jestem ambitny, chciałbym, aby wyglądał on jak prawdziwy kalkulator

Więc nie korzystaj ze standardowej systemowej skórki, tylko stwórz własną, oraz pobierz z sieci jakąś darmową czcionkę, która przypomina tą z kalkulatorów; Będziesz miał wtedy pole do popisu; No i nie korzystaj ze standardowych przycisków, tylko tych z paczki PNGImage, tam masz klasę TPNGButton, więc będziesz mógł także ustawić skórkę dla buttonów;

Komponenty szeroko dostępne w sieci;

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