2012-04-02 9 views
7

आम तौर पर मैं अब समस्या आता है जब उपयोगकर्ता कुछ है कि एक नंबर परिवर्तित नहीं कर सकते में प्रवेश करती है डेटाबेसमैं संपादन नियंत्रण से केवल संख्याओं को कैसे स्वीकार कर सकता हूं?

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

में एक स्ट्रिंग मान बचाने के लिए निम्नलिखित करना होगा। मैं इसे कैसे रोक सकता हूं? क्या कोई व्यक्ति अपवाद का उपयोग कर सकता है और मैं इस अपवाद को कैसे लिखूं?

मैं डेल्फी XE2 का उपयोग कर रहा हूं।

+0

क्यों आप डेटा अवगत नियंत्रण का उपयोग नहीं कर रहे हैं पर समाधान नहीं मिला? जैसे [Vcl.DBCtrls.TDBEdit] (http://docwiki.embarcadero.com/Libraries/en/Vcl.DBCtrls.TDBEdit) – RRUZ

+0

उपयोगकर्ता को पहले स्थान पर अमान्य डेटा दर्ज करने से रोकने के लिए एक वैकल्पिक दृष्टिकोण होगा। आप इनपुट मास्क का समर्थन करने वाले नियंत्रण का उपयोग कर सकते हैं या उपयोगकर्ता को गैर-संख्यात्मक डेटा दर्ज करने से रोकने के लिए 'TEdit.OnChange' ईवेंट को संभाल सकता है। 'TEdit' में 'नंबर केवल' संपत्ति भी है लेकिन यह उपयोगकर्ता को क्षेत्र में अमान्य डेटा की प्रतिलिपि बनाने और चिपकाने से नहीं रोकेगी। –

+0

डेटा-जागरूक नियंत्रण मुझे एक सामान्य TEDit – Japster

उत्तर

11

सुनिश्चित करने के लिए की जरूरत है सबसे अच्छा समाधान (आईएमएचओ) 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; 

मुझे नहीं लगता कि यह try..except का उपयोग करने के लिए विशेष रूप से 'साफ' है, जब त्रुटि छोटी होती है और वास्तव में, जैसा कि इस मामले में अपेक्षित है।

+1

@ जैपस्टर: स्ट्रिंग-टू-फ्लोट रूपांतरण का परिणाम 'myfloat' में सहेजा गया है, यानी' TryStrToFloat (S, F) 'स्ट्रिंग 'S' को फ़्लोटिंग-पॉइंट नंबर में कनवर्ट करने का प्रयास करता है। यदि यह सफल होता है, तो यह 'सत्य' देता है और परिणाम 'myfloat' में सहेजा जाता है। यदि नहीं, तो यह 'झूठा' देता है। –

+1

@ एंड्रियास: पूरी तरह से सहमत हैं कि असाधारण मामलों के लिए अपवाद का उपयोग किया जाना चाहिए, न कि जब ऐसा नियमित रूप से ऐसा होने का अच्छा मौका होता है। –

5

आप निम्न

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

तुम भी

StrToFloatDef(edtNumber.text, -1) 

को देखने के लिए चाहते हो सकता है के साथ अपवाद पकड़ कर सकते हैं आप केवल आपके रिटर्न परिवर्तित एक वैध संख्या

+0

StrToFloatDef (edtNumber.text, -1) वास्तव में – Japster

+0

करता है, यह इस मामले में डिफ़ॉल्ट मान -1 में पारित करता है, यदि स्ट्रिंग मान्य संख्या – Dampsquid

+0

का प्रतिनिधित्व नहीं करती है तो 'TryStrToFloat (edtNumber.Text, val) भी है ' – jasonpenny

1

ऐसे कई नियंत्रण हैं जिन्हें संख्यात्मक इनपुट स्वीकार करने के लिए कहा जा सकता है, और आपके उत्तर के रूप में स्वीकार किए गए दृष्टिकोण पर इसका कुछ लाभ है।

उदाहरण के लिए jedi JVCL library में कई संख्यात्मक इनपुट नियंत्रण शामिल हैं और मूल वीसीएल में कुछ संभावनाएं शामिल हैं, जिनमें स्पिन एडिट कंट्रोल भी शामिल है जो पूर्णांक मानों के इनपुट के लिए है।

0

मैं http://www.festra.com/eng/snip05.htm

(लिंक से कोड)

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; 
संबंधित मुद्दे

 संबंधित मुद्दे