builder, edit i liczba float

0

Witam!
Potrzebuje pobrac od uzytkownika liczbe typu float ( zmiennoprzecinkowa) w pole Edit. Jak zrobic, zeby uzytkownik nie mogl podac na przyklad czegos takiego :
999,45CDf lub 4,,35 chodzi mi o wszelkiego rodzaju blednie wprowadzone liczby.
Moze wyswietlac tabliczke z bledem jesli bedzie to nieprawidlowa liczba. Z gory dzieki za odpowiedz.

0

Najlepiej do tego nadaje sie funkcja StrToFloat(const AnsiString S) ktora jesli string S nie pasuje do formatu float wyrzuca wyjatek EConvertError. Kod wygladal by zatem mniej wiecej tak:

try{
                 liczba = StrToFloat(Edit1->Text);       
          }catch ( EConvertError &e ){
                 MessageBox(0, "Wprowadziłeś niepoprwną liczbę", "Błąd", MB_OK|MB_ICONERROR|MB_DEFBUTTON1|MB_TASKMODAL);      
          }
0

Można prościej ;). Pole

Edit1->Text

jest typu AnsiString

, czyli posiada metodę <code class="cpp">ToDouble()

konwertującą ciąg znaków do liczby zmiennoprzecinkowej. Ta metoda także rzuca wyjątkiem EConvertError

 w przypadku błędnego formatu.

Druga sprawa to to, że wywalanie MessageBox'a przy każdym błędnym naciśnięciu klawisza może nieźle wkurzyć i raczej utrudnia poprawienie błędu. Dlatego moim zdaniem lepiej jest przechowywać gdzieś starą wersję textu w Edicie i przy zmianie próbować odczytać nową wartość. Jeśli to sie nie uda, przywrócić starą zawartość Edita bez niepokojenia użytkownika ;).

try {
liczba = Edit1->Text.ToDouble();
} catch(EConvertError& e) {
Edit1->Text = stara; liczba = stara;
}
//W tym miejscu "liczba" zawiera wczytaną z Edita liczbę zmiennoprzecinkową.
//Jeśli użytkownik się pomylił, zawiera starą wartość. Jeśli nie, nową.
//Trzeba też pamiętać, by zaktualizować zmienną "stara".
stara = liczba;


.
0

Można prościej ;). ...

No czy ja wiem jak dla mnei ronica pomiedzy obiema metodami jest raczej kosmetyczna.

Druga sprawa to to, że wywalanie MessageBox'a przy każdym błędnym naciśnięciu klawisza może nieźle wkurzyć ...

Heh trodno sie nie zgodzic :), to byl jedynie przyklad.

0

Hm kurcze post na gorze byl ode mnie - tylko po raz kolejny mimo ze bylem zalogowany dalo mi go jako Anonim :)

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