| | |
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
Autor | Správa |
---|
Registrovaný: 12.05.09 Prihlásený: 21.05.10 Príspevky: 33 Témy: 8 Bydlisko: Bánovce nad... |
Zdravím,
prosím Vás rieším takú úlohu pri ktorej potrebujem nastaviť alebo neviem čo spraviť s editom, že nech berie len veľké alebo malé písmená a len tie ktoré sú na klávesnici počítača a že ke)d stalčím napríklad najeké číslo alebo "š" čiže interpunkciu tak aby sa do editu nič nevypísalo.
napadlo ma riešenie cez event on keypressed: tam som si určil ktoré znaky z toho editu potrebujem ale napr po stlačení čísla som ho síce nenačítal ale bolo tam v tom edite vypísane...stačil by nejaký návodík, že ako by som spravil v tej procedúre on keypressed...lebo keď som v tele tej procedúry tak ten znak sa ešte nezapíše do okna on sa tam zapíše až nakoniec keď ma z tej procedúry vyjnsť....čiže ak by sa dalo nejako zamedziť v tej procedúre aby sa tam nevypísalo do toho editu....
alebo proste nech je to riešené hociako len nech to funguje....
Veľmi pekne ďakujem za každú radu....
|
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 12.05.2009 20:25 | |
|
Asi to je trocha komplikované, ale funguje to, ako je potrebné a teda nezapisuje veľké písmená, čísla a interpunkciu (má to ale jedinú chybu - ak uživateľ stlačí mäkčeň a potom písmenko alebo použitie schránky).
Kód: var s: string; nezmen, caps_lock: boolean;
...
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin
S:= Edit1.Text; // tu sa uchová hodnota Editu pred stlačením klávesu
nezmen:= false; caps_lock:= false; if ( (GetKeyState(20) and $01) = 1 ) then caps_lock:= true; // zistí sa, či bol stlačený Caps Lock
if ( (Key in [96..105]) or (Key in [48, 50..57, 219]) ) then (* ak je stlačené číslo alebo písmeno s dĺžnom, príp mäkčeňom, tak nechaj pôvodný text *) begin nezmen:= true; Exit; end;
if ( not(Key in [65..90]) ) then Exit; (* ak je stlačený iný kláves, ako "a" - "z", tak pokračuj (ak sa stlačí Delete alebo pohybový kláves, nech pokračuje normálne *) if ( (ssShift in Shift) or caps_lock ) then nezmen:= true; // ak je stlačený Shift alebo Caps Lock, nechaj pôvodný text
end;
procedure TForm1.Edit1Change(Sender: TObject); begin if (nezmen) then begin Edit1.Text:= s; // vráť starú hodnotu Editu SendMessage(Edit1.Handle, EM_SETSEL, Length(Edit1.Text), Length(Edit1.Text)); // umiestni kurzor na koniec end; end;
|
|
Registrovaný: 12.05.09 Prihlásený: 21.05.10 Príspevky: 33 Témy: 8 Bydlisko: Bánovce nad... |
Ahoj diki moc veľmi pekná práca a dosť komplikovaná...
no mne tam mohli ísť aj veľké písmená len nie interpunkcia a ani čísla nie...
a ešte mám na teba zopár otázok:
že ja so bol zviknutý z pascalu na tabulku ascii a tie hodnoty čo si ty napísal sa mi akosi podľa nej nezhodujú...používa delphi nú kódovaciu tabuľku??
a ešte ďalšia otázka, že to akosi to ty napísal by muselo platiť, že tá procedúra OnKeyDown sa pustí skôr ako proedúra OnChange....lebo inak by to potom nemohlo fungovať...a moja otázka, že odkiaľ si to vedel, že to OnKeyDown sa pustí skôr?? alebo teda podľa čoho si to vedel??
Neni som v Delphi ešte akosi doma..a potrebujem to pochopiť keď to chcem vedeť robiť
a chcem sa spýtať, že či by to nemohlo vyzerať takto??
Kód: procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin S:= Edit1.Text; // tu sa uchová hodnota Editu pred stlačením klávesu nezmen:= false;
if not (Key in [malé písmená, veľké písmená, delete, backspace, šípka vľavo, šipka vpravo]) then nezmen:= true;
end;
inými slovami, že ak stlačím inú klávesu ako treba(male pis, velke pis, del, back, šípky) tak vtedy vrátim pôvodnú hodnotu...
sedliackym rozumom sa mi to páči len neviem či to bude aj dobré...
a tá procedúra OnChange by ostala nezmenená...
Za odpovedde vopred ďakujem
_________________ SE C905 8GB
Gaming Notebook MSI GX720X-027SK P8400 4GB 320GB VGA |
|
Registrovaný: 10.09.08 Prihlásený: 19.04.22 Príspevky: 126 Témy: 22 Bydlisko: Bratislava |
Kód: procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in ['a'..'z','A'..'Z',#8]) then key := #0; end;
|
|
Registrovaný: 12.05.09 Prihlásený: 21.05.10 Príspevky: 33 Témy: 8 Bydlisko: Bánovce nad... |
mariachi píše: Kód: procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in ['a'..'z','A'..'Z',#8]) then key := #0; end; prekrásne funguje presne ako som si predstavoval... ďakujem pekne ešte som to trochu upravil a dorobil som to na ten backspace ale neviem to dorobiť na klávesu delete... takto ako som to ja sa snažil dorrobiť by to mohlo fungovať len keby som vedel ordinárnu hodnotu deletu...som myslel, že je to 83 ale asi nie... Kód: meno:string; jetak:boolean; .... procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin jetak:=false;
if key=#83 then begin jetak:=true; exit; end; if not (key in ['a'..'z','A'..'Z',#8,#32]) then begin key := #0; end; if key=#8 then begin meno:=copy(edit1.Text,1,length(edit1.text)-1);
end else if key<>#8 then meno:=edit1.Text+key;
edit2.Text:=sprav(meno); end;
procedure TForm1.Edit1Change(Sender: TObject); begin if jetak then begin meno:=edit1.Text; showmessage(meno); //mám to tam aby som vedel či to funguje ale nie nič mi nevypísalo.. edit2.Text:=sprav(meno); end; end;
a malo by to fungovať tak, že akonáhle stlačím klávesu delete a nejaké písmenko vymažem tak hneď chcem načítať čo je v edit1.text a cez moju fciu sprav to vložiť do edit2.text
proste aby som nemusel stláčať nejakú inú klávesu aby mi to vypísalo v edite2 korektne...
_________________ SE C905 8GB
Gaming Notebook MSI GX720X-027SK P8400 4GB 320GB VGA |
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 13.05.2009 17:25 | |
|
Citácia: OnKeyDown - udalosť ošetrujúca stlačenie klávesu (akéhokoľvek) OnKeyPress - udalosť ošetrujúca stlačenie alfanumerického klávesu
To znamená, že stlačenie Delete sa pri použití OnKeyPress nezaznamená. Takže buď bude treba použiť event OnKeyDown (ale to nebude fungovať Mariachi-ho kód), alebo použiť iný kláves, ako Delete (alfanumerický).
// a sorry za ten môj príspevok, ja som pochopil problém tak, že nesmú sa zapisovať ani veľké písmená
|
|
Registrovaný: 12.05.09 Prihlásený: 21.05.10 Príspevky: 33 Témy: 8 Bydlisko: Bánovce nad... |
jéééj to je pohoda ja som ti vďačný, že sa snažíš mi pomôcť...
a dalo by sa toto isté použiť aj v tej procedúre OnKeyDonw?? pokial viem tak tam je tá premenná key typu word a tam sa ukladá nejaké číslo...to je akože ordinárna hodnota??
a pld ospovedz mi aj na tie otázky predtým..vidím, že sa do delphi vyznáš...že akú používa delphi kódovaciu tabuľku, a že ako viem ktorá procedúra sa vykoná skôr, že podľa čoho je ta postupnosť procedúr či podľa toho ako sú napísané v zdrojáku alebo na základe niečoho...
Ďakujem veľmi pekne.
_________________ SE C905 8GB
Gaming Notebook MSI GX720X-027SK P8400 4GB 320GB VGA |
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 13.05.2009 21:11 | |
|
Nie som si istý, či pôjde Mariachi-ho kód v OnKeyDown, ale mne to nejde (po patričnej úprave). Ale to moje by ti šlo, no so spomenutými chybami, teda stlačenie klávesu dĺžeň/mäkčeň alebo schránka (obe sa dajú určite odstrániť).
Takže po úprave bude vyzerať udalosť OnKeyDown takto (OnChange ostane postarom):
Kód: procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin
S:= Edit1.Text; // tu sa uchová hodnota Editu pred stlačením klávesu
nezmen:= false;
if ( (Key in [96..105]) or (Key in [48, 50..57, 219]) ) then nezmen:= true;
if (key = VK_DELETE) then begin meno:= Edit1.Text; Edit2.Text:= Sprav(meno); end;
end;
feromakovi píše: ... premenná key typu word a tam sa ukladá nejaké číslo...to je akože ordinárna hodnota?? Áno, to je ordinálna hodnota (ale líši sa od tej z Turbo Pascalu. Môžeš si ju pozrieť napríklad tu). feromakovi píše: ktorá procedúra sa vykoná skôr?
Postupnosť je následovná:
1.) OnKeyDown
2.) OnKeyPress
3.) OnChange
4.) OnKeyUp
Postupnosť je takáto vždy, nezávisí to od rozloženia v kóde.
Ak sú ešte nejaké nejasnosti alebo mám niekde chybu, tak kľudne píš
|
|
Registrovaný: 12.05.09 Prihlásený: 21.05.10 Príspevky: 33 Témy: 8 Bydlisko: Bánovce nad... |
takže nakoniec sa mi to podarilo a funguje úplne presne ako som chcel pre zaujímavosť to vyzerá takto:
Kód: procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin if not(jetak) then begin
if not (key in ['a'..'z','A'..'Z',#8,#32]) then begin key := #0; end; jetak:=true; end; end;
procedure TForm1.Edit1Change(Sender: TObject); begin if jetak then begin meno:=edit1.Text;
edit2.Text:=sprav(meno); end;
end;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin jetak:=false; if (key = VK_DELETE) then jetak:=true;
end;
chalani veľká vám vďaka každý ste mi niečím pomohli
kenny a keď si mi napísal, že aké je to poradie tak v OnKeyDown som zisťoval ten delete....ak bol stlačený tak KeyPress preskočím ak nie tak vojdem a upravujem ďalej.. nereaguje ani na dĺžne ani na nič ani na zásobník...
a posledná otázka, že podľa čoho si vedel aká je tam tá postupnosť??
kde sa to dá zistiť?? to by ma zaujímalo
a kenny ešte taká maličkosť, že ja som to tak pochopil, že keď mám nejakú procedúru a stlačím kláves tak do editu sa to zapíše až na konci-> nedáva mi to zmysel keď si v OnKeyDown kontroloval či bol stlačený delete a že aak by bol tak by si načítal len ten pôvodný text a nie upravený s tým deletom....rozumieš čo myslím?? že ešte sa tam tá klávesa delete neprajavila...tak je to dobré alebo nie?? rád by som to totižto pochopil..
keby mám na edit všetky procedúry:
OnKeyDown
OnKeyPress
OnChange
OnKeyUp tak kedy sa vlastne upraví ten edit??? pri ktorej procedúre??
_________________ SE C905 8GB
Gaming Notebook MSI GX720X-027SK P8400 4GB 320GB VGA |
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 14.05.2009 8:10 | |
|
feromakovi píše: podľa čoho si vedel aká je tam tá postupnosť?? Najjednoduchšie to zistiš tak, že do tela každého eventu dáš kód pre vypísanie nového riadku (najlepšie s názvom eventu, aby si vedel, že to zapísal práve on) do TMemo napríklad. Neskúšaj to cez ShowMessage, pretože v tej sa ti zobrazí viac správ - jedna cez druhú - a to potom nebudeš vidieť, ktorá sa zobrazila skôr. feromakovi píše: ak stlačím kláves tak do editu sa to zapíše až na konci? No tak toto vážne neviem presne vysvetliť, ale ja to chápem tak, že najprv prebehne uživateľské ošetrenie patričnej správy (teda telo procedúry nejakej udalosti) a potom sa vykonajú základné "operácie", teda pri edite zápis stlačeného znaku. Ale to je iba môj názor, vážne neviem, či to tak je. feromakovi píše: kedy sa vlastne upraví ten edit??? pri ktorej procedúre?? Upraví sa po skončení OnKeyPress, lebo v OnChange je už text zmenený.
|
|
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| BBcode Edit v Redakčné systémy | 9 | 867 | 23.10.2006 13:48 PCMark | | Tlačítko EDIT [ Choď na stránku: 1, 2 ] v Správy pre vedenie fóra | 38 | 4773 | 19.05.2007 0:12 JanoF | | Edit error :) v Správy pre vedenie fóra | 2 | 1226 | 12.07.2008 23:20 Triminka | | Edit - prázdne v Delphi, Visual Basic | 3 | 661 | 05.06.2011 0:11 coldak | | Cool Edit v Audio programy | 0 | 1009 | 24.05.2007 18:04 diademus | | Image edit v Ostatné programy | 2 | 1208 | 09.04.2006 13:49 Spirit | | Edit profilu v PHP, ASP | 2 | 1167 | 14.12.2008 18:43 kajbo | | Programovanie - skuska - edit v Delphi, Visual Basic | 1 | 661 | 29.01.2013 0:49 Gregi555 | | memo + edit + textak v Delphi, Visual Basic | 12 | 715 | 06.07.2014 13:57 beni017 | | OC Zeleninky EDIT! v Biosy a ladenie výkonu | 8 | 1185 | 06.01.2006 13:17 Rasputin | | WoT, Grid, Edit v Predám | 9 | 511 | 16.12.2014 21:18 dank9o | | Quick Edit Mod v Redakčné systémy | 0 | 460 | 14.10.2006 15:08 JanoF | | [ C++ ] ComboBox + Edit v Assembler, C, C++, Pascal, Java | 3 | 1686 | 31.01.2010 1:18 stopa27 | | Delphi - prázdny edit v Delphi, Visual Basic | 2 | 524 | 08.09.2013 1:29 nBXXL | | edit aby nezostal prazdny v Delphi, Visual Basic | 2 | 647 | 15.02.2009 12:07 HMilos | | AJAX inline text edit v JavaScript, VBScript, Ajax | 1 | 417 | 27.04.2012 18:32 weroro |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|