Program Delphi zabronienie wyswietlania ujemnych wyników

Witam.

Mam do napisania na zaliczenie program w Delphi.

Wszystko jest juz prawie gotowe. Problem jest w tym, że jak podam wartości ujemne lub zero to i tak program dokonuje obliczeń i pokazuje wynik obliczeń

Chciałbym żeby w tym miejscu pokazywalo się, że podano bledne wartości.(lub nic nie wyswietlało).

W zalączniku znajduje się program. Proszę o propozycje poprawy. Z góry dziękuje za pomoc.

http://odsiebie.com/pokaz/1835928—2d4d.html

unit Unit1; 


interface 


uses 

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 

  Dialogs, StdCtrls,Math; 


type 

  TForm1 = class(TForm) 

    gbWybor: TGroupBox; 

    rbWalec: TRadioButton; 

    rbStozek: TRadioButton; 

    rbKula: TRadioButton; 

    btnCzysc: TButton; 

    btnOblicz: TButton; 

    btnZamknij: TButton; 

    gbDane: TGroupBox; 

    Label1: TLabel; 

    Label2: TLabel; 

    txtpromien: TEdit; 

    txtWysokosc: TEdit; 

    gbWynik: TGroupBox; 

    lblPole: TLabel; 

    lblObjetosc: TLabel; 

    rbOstroslop: TRadioButton; 

    txtBokpodstawy: TEdit; 

    Label3: TLabel; 

    procedure btnZamknijClick(Sender: TObject); 

    procedure FormCreate(Sender: TObject); 

    procedure btnCzyscClick(Sender: TObject); 

    procedure rbWalecClick(Sender: TObject); 

    procedure rbStozekClick(Sender: TObject); 

    procedure rbKulaClick(Sender: TObject); 

    procedure btnObliczClick(Sender: TObject); 

    procedure rbOstroslopClick(Sender: TObject); 

  private 

    { Private declarations } 

  public 

    { Public declarations } 

  end; 


var 

  Form1: TForm1; 


implementation 


{$R *.dfm} 


procedure TForm1.btnZamknijClick(Sender: TObject); 

begin 

  Close; 

end; 


procedure TForm1.FormCreate(Sender: TObject); 

begin 

  gbWynik.Visible:=FALSE; 

  gbDane.Visible:=FALSE; 

  rbWalec.Checked:=FALSE; 

  rbStozek.Checked:=FALSE; 

  rbKula.Checked:=FALSE; 

end; 


procedure TForm1.btnCzyscClick(Sender: TObject); 

begin 

  gbWynik.Visible:=FALSE; 

  gbDane.Visible:=FALSE; 

  rbWalec.Checked:=FALSE; 

  rbStozek.Checked:=FALSE; 

  rbKula.Checked:=FALSE; 

  txtpromien.Text:=''; 

  txtWysokosc.Text:=''; 

  btnOblicz.Tag:=0; 

end; 


procedure TForm1.rbWalecClick(Sender: TObject); 

begin 

  gbDane.Visible:=TRUE; 

  Label1.Visible:=TRUE; 

  Label2.Visible:=TRUE; 

  Label3.Visible:=FALSE; 

  txtpromien.Visible:=TRUE; 

  txtWysokosc.Visible:=TRUE; 

  txtBokpodstawy.Visible:=FALSE; 

  btnOblicz.Tag:=1; 

  txtpromien.Text:=''; 

  txtWysokosc.Text:=''; 

  gbWynik.Visible:=FALSE; 

end; 


procedure TForm1.rbStozekClick(Sender: TObject); 

begin 

  gbDane.Visible:=TRUE; 

  Label1.Visible:=TRUE; 

  Label2.Visible:=TRUE; 

  Label3.Visible:=FALSE; 

  txtpromien.Visible:=TRUE; 

  txtWysokosc.Visible:=TRUE; 

  txtBokpodstawy.Visible:=FALSE; 

  btnOblicz.Tag:=2; 

  txtpromien.Text:=''; 

  txtWysokosc.Text:=''; 

  gbWynik.Visible:=FALSE; 

end; 


procedure TForm1.rbKulaClick(Sender: TObject); 

begin 

  gbDane.Visible:=TRUE; 

  Label1.Visible:=TRUE; 

  Label2.Visible:=FALSE; 

  Label3.Visible:=FALSE; 

  txtpromien.Visible:=TRUE; 

  txtWysokosc.Visible:=FALSE; 

  txtBokpodstawy.Visible:=FALSE; 

  btnOblicz.Tag:=3; 

  txtpromien.Text:=''; 

  txtWysokosc.Text:=''; 

  gbWynik.Visible:=FALSE; 

end; 


procedure TForm1.btnObliczClick(Sender: TObject); 

var 

  a,r,h,l,P,V:real; 

begin 

  case btnOblicz.Tag of 

  1: 

  begin 

    r:=StrToFloat(txtpromien.Text); 

    h:=StrToFloat(txtWysokosc.Text); 


    if r <=0 then 

    MessageBox(Handle,'Podałeś zły promień ! ','Błąd',MB_OK+MB_ICONINFORMATION); 


    if h<=0 then 

     MessageBox(Handle,'Podałeś złą wysokość ! ','Błąd',MB_OK+MB_ICONINFORMATION); 



    V:=pi*r*r*h; 

     P:=2*(pi*r*r)+(2*pi*r*h); 

    gbWynik.Visible:=TRUE; 

    lblPole.Caption:='Pole walca: '+FloatToStr(RoundTo(P,-2)); 

    lblObjetosc.Caption:='Objetosc walca: '+FloatToStr(RoundTo(V,-2)); 

  end; 

  2: 

  begin 

    r:=StrToFloat(txtpromien.Text); 

            if r <=0 then 

    MessageBox(Handle,'Podałeś zły promień ! ','Błąd',MB_OK+MB_ICONINFORMATION); 

    h:=StrToFloat(txtWysokosc.Text); 


        if h<=0 then 

     MessageBox(Handle,'Podałeś złą wysokość ! ','Błąd',MB_OK+MB_ICONINFORMATION); 

    l:=sqrt(r*r+h*h); 

    P:=pi*r*(r+l); 

    V:=(pi*r*r*h)/3; 

    gbWynik.Visible:=TRUE; 

    lblPole.Caption:='Pole stożka: '+FloatToStr(RoundTo(P,-2)); 


    lblObjetosc.Caption:='Objetosc stożka: '+FloatToStr(RoundTo(V,-2)); 

  end; 

  3: 

  begin 

    r:=StrToFloat(txtpromien.Text); 

     if r <=0 then 

    MessageBox(Handle,'Podałeś zły promień ! ','Błąd',MB_OK+MB_ICONINFORMATION); 

    P:=4*pi*r*r; 

    V:=(4*pi*r*r*r)/3; 

    gbWynik.Visible:=TRUE; 

    lblPole.Caption:='Pole kuli: '+FloatToStr(RoundTo(P,-2)); 

    lblObjetosc.Caption:='Objetość kuli: '+FloatToStr(RoundTo(V,-2)); 

  end; 

  4: 

  begin 

    h:=StrToFloat(txtWysokosc.Text); 

           if h<=0 then 

     MessageBox(Handle,'Podałeś złą wysokość ! ','Błąd',MB_OK+MB_ICONINFORMATION); 

    a:=StrToFloat(txtBokpodstawy.Text); 

              if a<=0 then 

     MessageBox(Handle,'Podałeś zły bok podstawy ! ','Błąd',MB_OK+MB_ICONINFORMATION); 

    P:=a*a*sqrt(3); 

    V:=((1/3)*(a*sqrt(3))/4)*h; 

    gbWynik.Visible:=TRUE; 

    lblPole.Caption:='Pole ostrosłupa: '+FloatToStr(RoundTo(P,-2)); 

    lblObjetosc.Caption:='Objetość ostrosłupa: '+FloatToStr(RoundTo(V,-2)); 

    end; 


  else 

    MessageBox(Handle,'Nie wybrałeś bryły ! ','Błąd',MB_OK+MB_ICONINFORMATION); 

  end; 

end; 


procedure TForm1.rbOstroslopClick(Sender: TObject); 

begin 

  gbDane.Visible:=TRUE; 

  Label1.Visible:=FALSE; 

  Label2.Visible:=TRUE; 

  Label3.Visible:=TRUE; 

  txtpromien.Visible:=FALSE; 

  txtWysokosc.Visible:=TRUE; 

  txtBokpodstawy.Visible:=TRUE; 

  btnOblicz.Tag:=4; 

  txtpromien.Text:=''; 

  txtWysokosc.Text:=''; 

  gbWynik.Visible:=FALSE; 

end; 


end.

[/code]
try r:=StrToFloat(txtpromien.Text); except r:=0; end; // to na wypadek gdyby użyszkodnik wpisał w tym polu: - "duży"

if r <=0 then

begin

    MessageBox(Handle,'Podałeś zły promień ! ','Błąd',MB_OK+MB_ICONINFORMATION); 

    Exit;

end;[/code]




Poza tym można pomyśleć nad następującym rozwiązaniem:

[code]procedure TForm1.txtpromienChange(Sender:TObject); // zdarzenie OnChange var Ok:Boolean; var H:String; begin try Ok:=StrToFloat(txtpromien.Text)>=0; except Ok:=false; end; SetLength(H,0); if Ok then begin Label1.Font.Color:=clWindowText; end else begin Label1.Font.Color:=clRed; if Length(txtpromien.Text)>0 then H:=‘promień powinien być liczbą większą od zera’ else H:=‘wpisz promień’; end; Label1.Hint:=H; txtpromien.Hint:=H; btnOblicz.Enabled:=(Label1.Font.Color=clWindowText)and(Label2.Font.Color=clWindowText); end;
Pisałem “na sucho”, mogą być drobne problemy. Nie zapomnij w FormCreate albo w inspektorze dać

ShowHint:=true;

a w rbWalecClick():

btnOblicz.Enabled:=false;

Label1.Font.Color:=clRed;

Label2.Font.Color:=clRed;

Oczywiście analogicznie w przypadku pozostałych pól. Przy takim podejściu dopóki użyszkodnik nie wpisze poprawnych danych nie da rady nacisnąć W przypadku takiego rozwiązania można zlikwidować przycisk jak tylko wszystkie TLabel są czarne lub niewidoczne:

if

  ((Label1.Font.Color=clWindowText)or(not Label1.Visible))

  and

  ((Label2.Font.Color=clWindowText)or(not Label2.Visible))

  and

  ((Label3.Font.Color=clWindowText)or(not Label3.Visible))

then btnObliczClick(Sender) else txtwynik.Clear;

to natychmiast wyliczać wynik w trakcie pisania. Właściwie aby nie powtarzać tego warunku przy każdym polu można ten warunek przenieść do procedury btnObliczClick