2012-04-02 16 views
7

Normalmente avrei effettuare le seguenti operazioni per salvare un valore stringa nel databaseCome posso accettare solo numeri da un controllo di modifica?

DataModule.tbTableNumber.Value := StrToFloat(edtNumber.text); 

Ora il problema nasce quando l'utente immette qualcosa che non può convertire in un numero. Come potrei essere in grado di impedirlo? Una persona può usare un'eccezione e come scriverò questa eccezione?

Sto usando Delphi XE2.

+0

Perché non si utilizzano i controlli data-aware? come [Vcl.DBCtrls.TDBEdit] (http://docwiki.embarcadero.com/Libraries/en/Vcl.DBCtrls.TDBEdit) – RRUZ

+0

Un approccio alternativo sarebbe impedire all'utente di immettere dati non validi in primo luogo. È possibile utilizzare un controllo che supporta le maschere di input o gestire l'evento 'TEdit.OnChange' per impedire all'utente di immettere dati non numerici. 'TEdit' ha anche una proprietà' NumbersOnly' ma non impedisce all'utente di copiare e incollare dati non validi nel campo. –

+0

Quali vantaggi un controllo basato sui dati mi dà su un normale TEdit – Japster

risposta

11

Il la migliore soluzione (IMHO) è quella di utilizzare TryStrToFloat:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    myfloat: double; 
begin 
    if TryStrToFloat(Edit1.Text, myfloat) then 
    DataModule.tbTableNumber.Value := myfloat 
    else 
    ShowMessage('Incorrect value.'); 
end; 

Non penso che sia particolarmente 'pulito' utilizzare try..except quando l'errore è banale e, infatti, come previsto, come in questo caso.

+1

@Japster: il risultato della conversione da stringa a float viene salvato in 'myfloat', ovvero,' TryStrToFloat (S, F) 'prova a convertire la stringa' S' in un numero in virgola mobile. Se ha successo, restituisce 'true' e il risultato viene salvato in' myfloat'. In caso contrario, restituisce 'false'. –

+1

@Andreas: concordemente sul fatto che Eccezione dovrebbe essere utilizzata per casi eccezionali, non quando esiste una buona probabilità che ciò avvenga in modo così routinario. –

5

È possibile intercettare l'eccezione con il seguente

try 
    val := StrToFloat(edtNumber.text); 
    except 
    on E: EConvertError do 
    begin 
     ShowMessage('Entered Data is not a valid Floating Point number'); 
    end; 
    end; 

Si potrebbe anche voler guardare

StrToFloatDef(edtNumber.text, -1) 

Se avete solo bisogno per essere sicuri di convertire restituisce un numero valido

+0

cosa fa lo StrToFloatDef (edtNumber.text, -1) fa esattamente – Japster

+0

restituisce il valore predefinito passato -1 in questo caso, se la stringa non rappresenta un numero valido – Dampsquid

+0

C'è anche 'TryStrToFloat (edtNumber.Text, val) ' – jasonpenny

1

Ci sono molti controlli che possono essere detti solo per accettare input numerici, e questo ha alcuni vantaggi rispetto all'approccio accettato come risposta.

Il jedi JVCL library ad esempio include diversi controlli numerici di input e il VCL di base include alcune possibilità, incluso il controllo Spin Edit che è per l'immissione di valori interi.

0

ho trovato la soluzione su http://www.festra.com/eng/snip05.htm

(codice dal collegamento)

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); 
begin 
    if not (Key in [#8, '0'..'9', '-', DecimalSeparator]) then begin 
    ShowMessage('Invalid key: ' + Key); 
    Key := #0; 
    end 
    else if ((Key = DecimalSeparator) or (Key = '-')) and 
     (Pos(Key, Edit1.Text) > 0) then begin 
    ShowMessage('Invalid Key: twice ' + Key); 
    Key := #0; 
    end 
    else if (Key = '-') and (Edit1.SelStart <> 0) then begin 
    ShowMessage('Only allowed at beginning of number: ' + Key); 
    Key := #0; 
    end; 
end; 
Problemi correlati