if then i konwersja typu

0

Witam, jestem początkującym programistą i mam problem. Napisałam aplikację- Kalkulator, wszystko działa, jedynie przycisk z przecinkiem ( używanym przy liczbach zmiennoprzecinkowych) nie. Nie mam pomysłu co robię źle, nie jestem też pewna czy zastosowany warunek if then w połączeniu z konwersją TryStrToFloat jest prawidłowo napisany, jeśli ktoś zerknie i podpowie będę wdzięczna.

unit najnowszy;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    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;
    Button16: TButton;
    Button17: TButton;
    Button18: TButton;
    Edit1: TEdit;
    procedure Button3Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button15Click(Sender: TObject);
    procedure Button14Click(Sender: TObject);
    procedure Button17Click(Sender: TObject);
    procedure Button16Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button13Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button18Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  a,b,c,d,znak: Double;
  oper:char;
  s:string;

implementation

{$R *.dfm}

procedure TForm1.Button3Click(Sender: TObject);
begin
  if s='0' then s:='1'
else s:=s+'1';
   Edit1.Text:=s;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
 if s='0' then s:='2'
else s:=s+'2';
   Edit1.Text:=s;
end;

procedure TForm1.Button11Click(Sender: TObject);
begin
 if s='0' then s:='3'
else s:=s+'3';
   Edit1.Text:=s;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    if s='0' then s:='4'
else s:=s+'4';
   Edit1.Text:=s;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 if s='0' then s:='5'
else s:=s+'5';
   Edit1.Text:=s;
end;

procedure TForm1.Button12Click(Sender: TObject);
begin
  if s='0' then s:='6'
else s:=s+'6';
   Edit1.Text:=s;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if s='0' then s:='7'
else s:=s+'7';
   Edit1.Text:=s;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
 if s='0' then s:='8'
else s:=s+'8';
   Edit1.Text:=s;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
 if s='0' then s:='9'
else s:=s+'9';
   Edit1.Text:=s;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
 if s='0' then s:='0'
else s:=s+'0';
   Edit1.Text:=s;
end;

procedure TForm1.Button15Click(Sender: TObject);
begin
 oper:='*';
if a=0  then a:=StrToFloat(s);
s:='';
end;

procedure TForm1.Button14Click(Sender: TObject);
begin
 oper:='/';
if a=0  then a:=StrToFloat(s);
s:='';
end;

procedure TForm1.Button17Click(Sender: TObject);
begin
 oper:='+';
if a=0  then a:=StrToFloat(s);
s:='';
end;

procedure TForm1.Button16Click(Sender: TObject);
begin
 oper:='-';
if a=0  then a:=StrToFloat(s);
s:='';
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
 s:=Edit1.Text;
b:=StrToFloat(s);
case oper of
'*': c:= a*b;
'/': begin
if b=0 then showmessage('Nie dzieli sie przez 0!')
else c:=a/b;
end;
'+':c:=a+b;
'-':c:=a-b;
end;
Edit1.Text:=FloatToStr(c);
a:=c;
s:='';
end;

procedure TForm1.Button13Click(Sender: TObject);
begin
s:='0';
 Edit1.Text:=s;
 a:=0;
 b:=0;
 c:=0;
end;

procedure TForm1.Button10Click(Sender: TObject);
begin

if TryStrToFloat(s+',',d) then
s:=s+',';
Edit1.Text:=s;
end;

procedure TForm1.Button18Click(Sender: TObject);
begin
close;
end;

end.
1
if TryStrToFloat(s+',',d) then
s:=s+',';

Załóżmy, że w s znajduje się 123 - czy Twoim zdaniem TryStrToFloat powiedzie się dla 123,? Skąd w ogóle pomysł na taki warunek?

1

Nie ma w ogóle warunku sprawdzającego, czy przecinek został już użyty. Dzięki temu użytkownik może wpisać liczbę z wieloma przecinkami. Do wykrycia istnienia przecinka można skorzystać z funkcji Pos.

Poza tym, przed podaniem wartości do funkcji StrToFloat, należy sprawdzić czy liczba zakończona jest przecinkiem i jeśli tak to dodać jedno zero z prawej strony.

0

O i właśnie przy użyciu wspomnianej wyżej funkcji spawa dla mnie jest już jasna.
Dziękuję !

0

Z tym przecinkiem jest więcej do zrobienia, bo nie może też być pierwszym znakiem w liczbie. Co innego -.

0

ale po co wyważać otwarte drzwi :) istnieją specjalizowane i darmowe komponenty dziedziczące z Tedit służące do wprowadzania wartości liczbowych jak np RX Library

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