[ misk0 @ 24.06.2002. 20:36 ] @
U jednom TEditu kontrolisem Event OnKeyUp, odnosno gledam kad korisnik
pritisne <ENTER> i onda pokrenem akciju provjere unosa. U slucaju greske
pozovem ShowMessage na ekran koji ima OK buttom.
E sad ako na tom ShowMessage prozoru opet kliknem na ENTER on odradi OK
znaci kao da sam pritisnuo OK button, ali prenese ENTER taster u prethodni
TEdit i naravno opet ispise istu poruku. Mogu jedino da zatvorim taj prozor sa
porukom sa SPACE tasterom i sa mishem.
Kako zabraniti prenos tog Enter tastera? odnosno te akcije ?
[ Ilija Studen @ 24.06.2002. 22:50 ] @
Koristi onKeyPress. Kod ti je sledeci:

if Key = #13 then
begin
.
.
.
end;

#13 predstavlja taster Enter. Imas u Helpu vrednost svih karaktera, ako ti kojim slucajem zatreba neki drugi (Tab, Space ...).
[ Riste Pejov @ 25.06.2002. 04:00 ] @
OnKeyDown radi sve to lepo :)
[ misk0 @ 25.06.2002. 12:36 ] @
Radi sa KeyDown :)
[ elix @ 22.07.2002. 16:52 ] @
ovo je akcija 'OnKeyDown' na Teditu.Taj Tedit je stvoren za vreme rada programa
i ne znam mu Control Count'. Znaci, kad promenim nesto u njemu to treba da se odrazi na drugi Tedit, ciji je redni broj npr. za dva veci.
zasto ovo nece da radi?

procedure TForm1.AkoSePromeni(Sender:Tobject;var Key: Word;
Shift: TShiftState);
var k:integer;
begin
k:=Tedit(sender).ControlCount;
Tedit(controls[k+2]).text:='EEEE');
end;

tj....zasto je k stalno 0.....kako da dobijem redni broj Tedita koji je zatrazio obradu...





end;
[ elix @ 22.07.2002. 19:39 ] @
resio sam to sa

k:=Tedit(sender).taborder;

meni to izgleda nekako bezveze ali...radi.....
postoji li neki drugi nacin..........


isto tako... postoje li ugradjene funkcije za ispitivanje da li je uneti podatak float, integer.....
[ MoHicAn @ 23.07.2002. 03:54 ] @
Ako se ja dobro secam taborder je koja je po redu ta komponenta pri pritisku tab-a ne vidim kakve to veze ima sa ovim tvojim problemom.
[ Ilija Studen @ 23.07.2002. 17:34 ] @
- Prvo moras da kreiras objekat, sto si pretpostavljam vec uradio;
- moras da podesis svojstva komponente prilikom kreiranja;

Posto tebi treba svojstvo Name (mora biti unikatno) da bi se referisao na kreiranu komponentu onda ga generisi. Ja sam malo modifikovao Cantuov kod iz knjige Mastering Delphi da bih to postigao.

uses
StdCtrls;

procedure TForm1.FormMouseDown(
Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Btn: TButton;
begin
Btn := TButton.Create (Self);
Btn.Parent := Self;
Btn.Left := X;
Btn.Top := Y;
Btn.Width := Btn.Width + 50;
Btn.Name := ('Btn' + IntToStr (Form1.ComponentCount));
end;


Ja se nadam da ovde nema nekih preteranih nejasnoca. Kod mene kod savrseno dobro radi.

isto tako... postoje li ugradjene funkcije za ispitivanje da li je uneti podatak float, integer.....

To mozes vrlo jednostavno da uradis pomocu izuzetka. Imas formular, jedan Edit i jedno dugme. Evo nesto malo koda...

procedure TForm1.Button1Click(Sender: TObject);
var
Test: Integer;
begin
try
Test := StrToInt (Edit1.Text);
except
on Exception do
raise Exception.Create ('Niste uneli ceo broj. bla bla');
end;
end;


Unutar try bloka kazujes mu sta da radi. Ukoliko dodje do izuzetka on ispisuje on radi ono sto je navedeno u bloku except i prekida dalje izvrsenje koda. Rad sa izuzecima je prilicno slozena materija (posto su i izuzeci klase sa svojim metodama, svojstvima itd.)

Pored ove funkcije za konverziju (StrToInt) najcesce ces koristiti StrToFloat, StrToDate, StrToTime i obrnute funkcije.
[ elix @ 24.07.2002. 01:46 ] @
nismo se bas razumeli za prvi deo pitanja.ono navedeno sam vec odradio bio
ali...... no nije ni vazno....sredio sam na drugi nacin...

drugi deo ce vrlo koristiti........

vraticu se opet kad mi zatreba nesto :)
[ elix @ 24.07.2002. 10:34 ] @
ehhh.......

nesto nije u redu........

ne uspeva mi ono sto si kucao....
stalno se isto desava...kao da ne postoji....znaci program blokira ako se unesu pogresni podaci
napise da je nasao Exception iz klase Econverterror , da ne moze da prebaci u integer... i to je to

kucao sam i ovo


procedure TForm1.Button1Click(Sender: TObject);
var Test:integer;
begin
try
Test:=StrToInt(Edit1.Text);
except
on Exception do Edit2.text:='FFF';
on EconvertError do bla bla........ /ne vredi nista sto sam probao...
on EZeroDivide do edit2.Text:='FF';
on EOverflow do edit2.Text:='gggt';
on EMathError do edit2.Text:='rtzu';
else
edit2.text:='rtz';
end;

end;


edit2.text je tu samo provizorno naravno.... kucao sam i ono tvoje ali nista...

jednostavno samo mi treba nesto sto proveri za podatak da li je moguce prebaciti ga u broj...i napisati to nekako na ekranu (prozorcic, ili slicno) ne prekidati
program!.......

pa?
[ elix @ 24.07.2002. 11:30 ] @
u stvari...kao i da radi... u sledecem startovanju(kad ga odblokiram na "start" ispise sta treba u Edit2.text).... ali ja ne zelim da se program blokira.....samo da ispit da li je moguce i ako nije da napise poruku....a ako ne da nastavi dalje
[ Ilija Studen @ 24.07.2002. 13:34 ] @
Ne moze da ne radi. Ti ne vidis odmah izuzetak ako starujes program sa F9 (u stvari, on te vrati u Delphe pa ti kaze da koristis StepOver). Nije greska. probaj da koristis kompajliranu verziju programa i videces da sve radi savrseno.

Postoje cake, s obzirom na to sto zelis da uradis.

Funkcije za konverziju rade s tim da pri nemogucnosti konverzije dovode do izuzetka i blokiraju dalje izvrsenje koda (sve dok ne uneses validnu vrednost). Posto ti zelis (cini mi se) da ispitas da li je unesen ceo ili realan broj, a zatim zelis da nastavis izvrsavanje bez obzira na rezultat onda ces morati da dupliras kod (napravices spagete) tako da u Except bloku radi nesto ako nije unesen ceo ili realan broj, a nakon izlaska iz Try-Except radi nesto sto koristi vrednost realnog ili celog broja. Pazi, Try-Except se u sustini ponasa slicno if-else if. Ako udje u Except bloka iz njega nema izlaska (tj. prekida izvrsenje kada dodje do end; koji zatvara Except blok).

Try-Except se ponasaju kao stabilne i odvojene programske jedinice (begin-end) tako da unutar njih mozes da otkucas xxx linija koda. Taj pristup ti nikako ne preporucujem (komplikovan je i tezak za odrzavanje), ali je on ponekad jedino resenje.

[Ovu poruku je menjao MarQs dana 24.07.2002 u 01:50 PM GMT]

[Ovu poruku je menjao MarQs dana 24.07.2002 u 01:55 PM GMT]
[ elix @ 24.07.2002. 13:47 ] @
da naravno.... bas sam upravo provalio posle dva sata to...
i dosao da se izvinim na sopstvenoj gluposti....

[ Rapaic Rajko @ 25.07.2002. 10:16 ] @
A da li je neko ovde cuo za funkciju Val()?
To se vuce jos od TurboPascala...i naravno da je ima i u Delphi-ju.

Rajko
[ Ilija Studen @ 25.07.2002. 13:27 ] @
Val se koristi pri konverziji iz stringa u int. Sta ces uraditi ako recimo treba da sprecis deljenje nulom, I/O greske... ? Tu ti Val ne moze pomoci.

Napisao sam kreci tekst o izuzecima. Kompletan source za dva primera i Tutorial u doc formatu se nalaze na temi FAQ - Pascal / Delphi / Kylix
[ Rapaic Rajko @ 26.07.2002. 09:05 ] @
Ljudi, svaka cast na ulozenom trudu, ali ja svaki thread citam od pocetka - znaci, od prvog posta na dole. Covek je prvo pitao kako da spreci prenos Enter-a, zatim kako da konvertuje string u number; Exceptions bas i nije trazio. Mislim da svakome treba pomoci na najkraci (i najbolji) nacin

Rajko

P.S. A sto se tice Exceptions-a, mogao bih i ja da se raspisem da sve zveci, ali - sta cemo sa spamom...
[ Ilija Studen @ 29.07.2002. 17:47 ] @
Ja se izvinjavam ako sam te na bilo koji nacin uvredio.

Ipak smatram da je Val davno prevazidjen i da se kvalitetnije resenje moze naci u funkcija StrToInt i izuzecima (za obradu eventualne greske).

PS. Raspisi se slobodno. Kamo srece da ima vise onih koji bi to radili...
[ sesa @ 07.08.2002. 13:58 ] @
mozda sam malo zakasnio al' ipak:

ispratih celu pricu i mislim da je odgovor OK samo zbog cega
kontrolu unetog vrsiti na OnKeyDown kad postoji
OnExit event.

OnKeyDown ne odgovara i zbog cinjenice da zavrsetak unosa moze biti i
klikom misa na neki od dugmica na formi.

Znaci OnExit i Raise ako nesto nije u redu. Raise ce vratiti fokus na trenutnu TEdit
komponentu.

[ sesa @ 10.08.2002. 23:17 ] @
Ako stavis jedan ShowMessage u OnChange videces zbog cega nije dobro
koristiti taj event.
Moj izbor je OnExit.