BCB TEdit sprawdzanie poprawnosci.

0

Witam, nie moge sobie poradzic ze sprawdzeniem poprawnosci wpisywanego tekstu w komponencie TEdit. Chcialbym aby mozna tam bylo wpisac tylko liczbe rzeczywista. W komponencie TEdit1 w zdarzeniu OnKeyPress wstawilem kod:

if (Key!='0' && Key!='1' && Key!='2' && Key!='3' && Key!='4' && Key!='5' && Key!='6' && Key!='7' && Key!='8' && Key!='9' && Key!=',') Key=NULL;

i dziala, ale... przecinek mozna wpisac kilkakrotnie.
Chcialbym, aby przecinek mogl byc tylko jeden(to oczywiste chyba).
Najlepsze byłoby zachowanie takie jak w windowsowym kalkulatorze,
ale nie wiem jak to wykonac, dlatego prosze o jakas pomoc.

Pozdrawiam, Marcin

0

mozesz zadeklarowac gdzies zmienna bool przecinek = false.
i po nacisnieciu go bedzie:

if(!przecinek)
{
     przecinek = true;
     Edit1->Text = Edit1->Text + ',';
}

Ale po co sie meczysz i robisz to w ten sposob? Do tego celu jest MaskEdit, ustawiasz odpowiedznia maske i po problemie. Jesli nie znasz tego komponentu to polecam sie nim zainteresowac :)

0

80% amatorskich programów tak robi... testowanie klawisza w OnKeyPress - potem podchodzi do niego taki brutalny betatester jak ja (:D), pisze w notatniku "asd,3243#@$", kopiuje, i wkleja do takiedo Edita - nawet myszką... i co? okazuje się, że nasze zabezpieczenie jest psu na budę.

Polecam oprócz Twojego sposobu testowanie w zdarzeniu OnExit, czy dana wartość (cała) jest poprawną liczbą rzeczywistą (zamiana StrToFloat w try/catch).

0

emte:Komponentem TMaskEdit sie interesowalem i oto do czego doszedlem:
po ustawieniu maski na np. 9999,99 kursor ustawia sie przy pierwszym znaku z lewej, czyli aby wpisac liczbe 5,45 musze przesunac go o 3 miejsca i dopiero pisac.
A ja poszukuje rozwiazania, ktore na starcie ustawialoby np. sam przecinek, kursor jeden znak w lewo od przecinka,wpisanie kolejnych znakow powodowaloby przesuniecie sie juz wczesniej wpisanych w lewa strone, a dopiero wcisniecie przecinka przejscie za niego i pisanie czesci dziesietnych.

Rozwiazanie z przecinkiem w TEdit tez nie jest do konca dobre, bo... nie wiem jak przywrocic wartosc zmiennej przecinek na false w sytuacji kiedy przecinek zostanie zmazany... ale gdybym umial to obsluzyc to wraz z obsluga zdarzenia OnExit() byloby to juz w miare akceptowalne rozwiazanie :)

Dziekuje Wam obu za dotychczasowa pomoc i prosilbym o kolejne wskazowki.

Pozdrawiam, Marcin

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