DELPHI - Zabezpečení editu proti neintegerovým hodnotám

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Radimfakt 11. 7. 2009 13:57

Dobrý den. Chodím na brigádu, kde každé dvě hodiny musím počítat kasu. Tzn. že musím spočítat kolik je v kase jakých bankovek/mincí, spočítat kolik to dělá dohromady, spočítat kolik jsem za ty dvě hodiny vydělal a pak ještě zprůměrovat počtem zákazníků za poslední dvě hodiny. To všechno jsem si nehorázně moc ulehčil tím, že jsem si napsal program, který to všechno udělá za mě (samozřejmě až na počítání počtu mincí a bankovek v kase). Hodlám si dojít pro odměnu za šéfem i s tím, že bych mu ten program dal na CD pro ostatní pobočky. Funguje opravdu krásně a bez problémů. :-[
Jedna věc mi ale v předvedení programu hodně brání a to sice nezabezpečení editů proti vložení neintegerové hodnoty. Tzn, že pokud dám třeba do editu1 místo počtu pětitisícových bankovek nějaké písmeno, začne program vyhazovat nekonečné množství chybových hlášek.
Poraďte mi prosím jak to celé nějak globálně zabezpečit :( Nechce se mi to přidávat ke každému editu, to bych si docela máknul.. Ale budu vděčný za cokoli
Radimfakt
Junior
Uživatelský avatar

Odeslat příspěvekod hekrhy 11. 7. 2009 14:34

máš několik možností...
kontroluj si u Editů v události OnChange, jestli tam někdo omylem nevložil něco jiného než číslo
nebo pro převod textu na číslo používej StrToIntDef(), které nevyhazuje výjimky
nebo si ten převod hoď do try bloku a ty výjimky si ošetři
hekrhy
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 11. 7. 2009 15:08

Do udalosti OnKeyPress vloz nasledujici kod:
if not (Key in [0..31, '0'..'9'] then Key := #0;
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod Radimfakt 11. 7. 2009 16:48

Tohle mi nějak nefunguje... Nemusí se tam ještě někde deklarovat pole?

Vkládám to správně?
procedure TForm1.Button1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in [0..31, '0'..'9'] then Key := #0;
end;


PS: Nevíte prosím někdo ještě jak bych to mohl udělat, aby se na tlačítlo nemuselo klikat, ale stačilo zmáčknout Enter na klávesnici?
Radimfakt
Junior
Uživatelský avatar

Odeslat příspěvekod aberez11 11. 7. 2009 17:18

nechyba len v tej podmienke prava zatvorka?
na to tlacitko mozno dat nieco ako button.setfocus alebo tak niak to funguje
dedukcia: "Tí čo s tým nemajú problémy, s tým nemajú až také problémy. Ale tí čo s tým problémy majú, s tým majú problémy.." (prednasajuci vysvetluje studentom ako sa veci maju)
aberez11
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 11. 7. 2009 17:45

Na tlacitku nastav property Default na True

Jinak ta prava kulata zavorka tam chybi, ale to snad zvladne ;-)
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod Radimfakt 11. 7. 2009 19:44

Jupí, tlačítko na enter funguje :D

Ale tohle pořád nějak nejde rozjet :-|

http://img24.eu/i.php?id=frxq5tkl.jpg
Radimfakt
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 11. 7. 2009 20:09

Kód: Vybrat vše
if not (Key in [#0..#31, '0'..'9']) then Key := #0;
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod Radimfakt 11. 7. 2009 20:26

Tak už to konečně spustit. Ale žádnou změnu nepozoruju :( Pořád to padá při zadání... Já bych vám sem ten program hodil i se zdrojákem...Kdybyste měli čas se na to podívat co? :(
Radimfakt
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 11. 7. 2009 20:38

Jak to pada pri zadani? Pri zadani do Editu ti nic padat nemuze. Pokud jsi to udelal dobre, pak tam nezadas nic jineho, nez cisla.
Pada ti to, protoze nepouzivas osetreni vyjimek a dalsi podobne veci.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod Radimfakt 11. 7. 2009 20:42

no já to mám udělaný totiž tak, že se mi hodnota těch bankovek počítá v reálným čase (pomocí timerů). Až celková hodnota se počítá tlačítkem... Takže to bude asi tím.. Kdybych to měl na tlačítko všechno, tak by to nejspíš fungovalo. Zkoušel jsem ten příkaz vložit pod timer a nejde to :-/ Tak nevim...
Radimfakt
Junior
Uživatelský avatar

Odeslat příspěvekod peter.ntx 11. 7. 2009 21:40

pridal si podminku kdyby se nahodou v editu nenachazelo nic ?
Kód: Vybrat vše
if not (Trim(Edit.text)='') then
Ja vim pisu kravini ale co nadelam
peter.ntx
Junior

Odeslat příspěvekod Radimfakt 11. 7. 2009 21:45

jojo akorát jsem to udělal jinak...
if edit××.text=' ' then
begin
showmessage('neudal jsi hodnotu');
edit××.text:='1';
end
else
....
Radimfakt
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 11. 7. 2009 22:45

Kód: Vybrat vše
Cislo := StrToIntDef(Edit1.Text, 0);

nebo
Kód: Vybrat vše
try
  Cislo := StrToInt(Edit1.Text);
except
  Cislo := 0;
end;
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod Radimfakt 11. 7. 2009 22:52

Hééééj ty seš nemalej borec! Díky moc!!! Funguje to!

strtointDef(Edit1.Text, 0);

Jak to funguje? =-O
Radimfakt
Junior
Uživatelský avatar

Další stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků