Problem z StrToFloat

0

Witam mam taki problem ... zadeklarowalem zmienne jako double

a, b, c, delta: double;

I nastepnie napisalem program ktory pobiera dane z Editow i oblicza pierwiastki rownania. Wszystko dzialalo super i w editach moglem nawet wpisywac liczby ujemne. Niestety nagle cos sie popsulo :/ i teraz ciagle wyskakuje mi EConvertError

Jak mam zrobic aby:

a:= StrToFloat(Edit1.Text);

mozna bylo przypisywac ujemne wartosci ?? - Myslalem ze blad mam w deklaracji

a: Integer; 

ale na innych rowniez jest blad:/ - podkreslam ze wczesniej tego bledu nie bylo ... powiem nawet wiecej. Jesli wpisze napierw 2 a potem przesune kursor do prawej strony i wpisze minus to wszystko jest OK ... Ma ktos pomysl jak to zrobic ??

0

Pokaż kod i cały błąd.

0

Mozliwosci jest tutaj duzo. Moze zamiast przecinka wstawiasz kropke? Z tego co podales, to trudno wywnioskowac w czym tak naprawde tkwi problem.

0

OK caly kod wyglada tak: (nie miejcie mi za zle ze nie jest on zbyt profesjonalny)

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label4: TLabel;
    Button1: TButton;
    Label5: TLabel;
    Label6: TLabel;
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  a, b, c, delta: double;
  x1, x2 : Double;

implementation

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);
begin
a:= StrToFloat(Edit1.Text);
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
b:= StrToFloat(Edit2.Text);
end;

procedure TForm1.Edit3Change(Sender: TObject);
begin
c:= StrToFloat(Edit3.Text);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label4.Caption := '';
  Label5.Caption := '';
  delta:= b*b - (4*a*c);
  Label6.Caption := FloatToStr(delta);
  If delta <0 then
  begin
   label4.Caption := 'Delta ujemna - brak pierwiastkow';
  end
  else
    begin
    if delta = 0 then
    begin
      x1:= (-b)/(2*a);
      Label4.Caption := FloatToStr(x1);
    end
    else
      begin
        x1:=((-b)-(sqrt(delta)))/(2*a);
        x2:=((-b)+(sqrt(delta)))/(2*a);
        Label4.Caption := FloatToStr(x1);
        Label5.Caption := FloatToStr(x2);
      end
  end
end;

end.

Program dziala bez zarzutu ale gdy proboje wpisac np do edit1 -2 lub inna cyfre z minusem z przodu to wywala mi blad:

Debugger Exception Notification
Project Project2.exe raised exception class EConverError with message "-" is not a valid floating point value'. Process stopped. Use Step or Run to continue.

Moze deklaracja zmiennych jest zla ?? Ale jesli tak to jaki typ odpowiada za liczby ujemne ??</delphi>

0

A więc twój błąd polega na tym że pod Edit->OnChenge -> podpiełeś zmiane textu na float. Działa to w ten sposób że z każdym naciśnięciem klawisza wywoływane jest OnChange. Co za tym idzie jak wpiszesz"-" to on to już próbuje przekonwertować na float a to nie jest liczba, dlatego dostajesz taki bład. Bład faktycznie nie pojawia się jak najpierw wpiszesz liczbę a potem minus, ponieważ to jest prawidłową liczbą.

Najprostszym rozwiązaniem jest zmiana miejsca gdzie przypisujesz wartości edita do zmiennej, np do buttona, pierwsze 3 linie zdarzenia gdzie wyliczasz delte itp powinny wyglądać następująco:

a:= StrToFloat(Edit1.Text);
b:= StrToFloat(Edit2.Text);
c:= StrToFloat(Edit3.Text);
0

No faktycznie nie pomyslalem o tym ... cobra wielkie dzieki niby taki szczegol a jaki istotny teraz wszystko dziala jak powinno

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