Newsgroup: it.comp.lang.delphi
Titolo: evitare digitazione lettere

ho un campo di testo che è serve per memorizzare un valore in un campo
numerico in una tabella, ed io vorrei evitare che se premo un tasto di una
lettera invece di un numero non venga scritto nulla?
Potete farmi vedere del codice, io pensavo di inserire il codice nell'evento
onkeypress.
Grazie

 ha scritto nel messaggio
news:_SWU8.106639$j65.2...@twister1.libero.it...


 if not (Key in ['A'..'Z','a'..'z',chr(VK_BACK)] ) then  key :=#0;
Hai sbagliato il controllo, o togli il not oppure usi '0'..'9'.
  if not (Key in ['0'..'9',chr(VK_BACK)])
     then  key :=#0;
Ciao
--
- Carlo -
cbertu81(at)libero(dot)it

 ha scritto nel messaggio:

l'evento è esatto, il codice il seguente:
  if not (key in ['0'..'9']) then
     key := #0;
Ciao!


 ha scritto nel messaggio
news:_SWU8.106639$j65.2...@twister1.libero.it...

sull'evento onKeypress inserisco il seguente codice:
var
    valore : Integer;
begin
   // se il pulsante è diverso dal backspace
   if key = char(VK_BACK) then
        begin
            try
                // converto il campo in intero se vado in eccezione perchè
ad esempio ho premuto un tasto non valido
                 // allora annullo il carattere
                Valore := StrToInt (Trim(TuoEdit.Text) + Key);
            except
                Key := char(VK_CLEAR);
            end;
        end;
end;
ciao
--
Alessandro Zenoni
aze...@inwind.it

      key := #0;
Mi aggiungo alla discussione.
Da quanto mi ricordo, anche facendo così, se si fa incolla nel Tedit, è
possibile inserire dei caratteri non numerici. C'è un modo per risolvere
anche questo problema?
Ciao
Matteo

 risolvere anche questo problema?
Credo che l'unico modo per risolvere il problema sia di testare l'input
dopo che č stato inserito, carattere per carattere.
In questo modo si evitano anche problemi del tipo l'utente idiota scrive
1,24,567
che se fai il controllo sul KeyPress ti sfugge.
Se vuoi mi metto 10 minuti e butto giů una funzioncina...
--
Jax

 Grazie
prego.
Ciao, Antň.


--------------------------------
Inviato via 
http://usenet.libero.it
 

 dopo che č stato inserito, carattere per carattere.
č uno dei modi, non il solo! Si potrebbe intercettare a livello di
application la combinazione di tasti CTRL + V e impedire all'utente di
cliccare utlizzare la funzione incolla del menů tasto destro.
Comunque la soluzione migliore č intercettare e abolire il WM_PASTE sul
TEdit. Ecco qui.
type TEdit1 = class(TEdit)
   private
     procedure GETWMPASTE(var Msg:TMSG); message WM_PASTE;
   end;
implementation
{$R *.DFM}
procedure TEdit1.GETWMPASTE;
begin
  ShowMessage('Non sono mica un cosě pacco come TEdit');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  if Edit1 = nil then
   begin
    Edit1:=TEdit1.Create(Self);
    Edit1.Parent:=Self;
    Edit1.Show;
    Edit1.Name:='Edit1';
    Edit1.Width:=150;
    Edit1.Caption:='Sgamo i WM_PASTE! :-)';
   end;
end;
Ciao


 anche questo problema?
Io ho risolto cosě... avevo un Edit di nome "Age" e questo č il codice messo
nell'evento Exit:
procedure TAnagrafica.AgeExit(Sender: TObject);
begin
 if Age.Text = '' then Age.Text := '0';
 try
  StrToInt(Age.Text);
 except
  Application.MessageBox('The AGE Field accepts numbers
only.','Warning',mb_ok);
  Age.Undo;
 end;
end;
Nel mio caso accetto solo numeri interi... ma basta cambiare StrToInt con
StrToFloat per accettare anche numeri con virgola.
Ciao,
   Luca

  end;
con questo mio appunto si potrebbe entrare in una delle tante discussioni
teoriche da cui non si esce mai.
Questa soluzione è, secondo me, da utilizzare solo quandoe è l'unica strada
percorribile*, ma non mi sembra il caso di utilizzarla. Oltretutto mi sembra
che i blocchi try - except - finally rallentino di parecchio l'applicazione
che ne fa uso. Come scrissi tempo addietro: Le eccezioni è meglio evitarle
che gestirle.
--
- Carlo -
cbertu81(at)libero(dot)it
* Per intenderci; tempo addietro scrissi una piccola funzioncina che
analizzava 1 ad 1 le porte TCP e diceva quali di queste erano aperte. Per
farlo ho utilizzato un blocco Try - Except e nel Try provavo l'apertura
della porta; se l'apertura fallita c'era un altro server in ascolto su
quella. Non conoscevo (e non conosco) strade alternative

 che gestirle.
Vero... ma considera che l'uscita da un campo testo è abbastanza
infrequente. Non è una cosa che diciamo faresti 10 volte al secondo.
L'evento viene lanciato solo all'uscita del campo e l'except accade solo se
l'utente ha digitato o incollato "roba strana" nell'Edit.
Se non vuoi usare le eccezzioni puoi sempre usare il vecchio Int() anziché
l'StrToInt... se non mi sbaglio non fa uso delle eccezzioni perché deriva
dal Turbo Pascal.
Ciao,
   Luca