Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 10 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.05.09
Prihlásený: 21.05.10
Príspevky: 33
Témy: 8
Bydlisko: Bánovce nad...
Príspevok NapísalOffline : 12.05.2009 18:52

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....


Online

Skúsený užívateľ
Skúsený užívateľ
edit nastavenie

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOnline : 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;


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.05.09
Prihlásený: 21.05.10
Príspevky: 33
Témy: 8
Bydlisko: Bánovce nad...
Príspevok Napísal autor témyOffline : 12.05.2009 23:33

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
Offline

Užívateľ
Užívateľ
edit nastavenie

Registrovaný: 10.09.08
Prihlásený: 19.04.22
Príspevky: 126
Témy: 22
Bydlisko: Bratislava
Príspevok NapísalOffline : 13.05.2009 10:02

Kód:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (key in ['a'..'z','A'..'Z',#8]) then key := #0;
end;


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.05.09
Prihlásený: 21.05.10
Príspevky: 33
Témy: 8
Bydlisko: Bánovce nad...
Príspevok Napísal autor témyOffline : 13.05.2009 11:35

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
Online

Skúsený užívateľ
Skúsený užívateľ
edit nastavenie

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOnline : 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á


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.05.09
Prihlásený: 21.05.10
Príspevky: 33
Témy: 8
Bydlisko: Bánovce nad...
Príspevok Napísal autor témyOffline : 13.05.2009 20:28

:D 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
Online

Skúsený užívateľ
Skúsený užívateľ
edit nastavenie

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOnline : 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íš :)


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.05.09
Prihlásený: 21.05.10
Príspevky: 33
Témy: 8
Bydlisko: Bánovce nad...
Príspevok Napísal autor témyOffline : 13.05.2009 22:09

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
Online

Skúsený užívateľ
Skúsený užívateľ
edit nastavenie

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOnline : 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ý.


Odpovedať na tému [ Príspevkov: 10 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. BBcode Edit

v Redakčné systémy

9

867

23.10.2006 13:48

PCMark Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Tlačítko EDIT

[ Choď na stránku:Choď na stránku: 1, 2 ]

v Správy pre vedenie fóra

38

4773

19.05.2007 0:12

JanoF Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Edit error :)

v Správy pre vedenie fóra

2

1226

12.07.2008 23:20

Triminka Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Edit - prázdne

v Delphi, Visual Basic

3

661

05.06.2011 0:11

coldak Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Cool Edit

v Audio programy

0

1009

24.05.2007 18:04

diademus Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Image edit

v Ostatné programy

2

1208

09.04.2006 13:49

Spirit Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Edit profilu

v PHP, ASP

2

1167

14.12.2008 18:43

kajbo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Programovanie - skuska - edit

v Delphi, Visual Basic

1

661

29.01.2013 0:49

Gregi555 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. memo + edit + textak

v Delphi, Visual Basic

12

715

06.07.2014 13:57

beni017 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. OC Zeleninky EDIT!

v Biosy a ladenie výkonu

8

1185

06.01.2006 13:17

Rasputin Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. WoT, Grid, Edit

v Predám

9

511

16.12.2014 21:18

dank9o Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Quick Edit Mod

v Redakčné systémy

0

460

14.10.2006 15:08

JanoF Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. [ C++ ] ComboBox + Edit

v Assembler, C, C++, Pascal, Java

3

1686

31.01.2010 1:18

stopa27 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Delphi - prázdny edit

v Delphi, Visual Basic

2

524

08.09.2013 1:29

nBXXL Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. edit aby nezostal prazdny

v Delphi, Visual Basic

2

647

15.02.2009 12:07

HMilos Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. AJAX inline text edit

v JavaScript, VBScript, Ajax

1

417

27.04.2012 18:32

weroro Zobrazenie posledných príspevkov


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

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra