2009-02-22 9 views
5

अनुशंसित वर्ण ए टू जेड, ए से ज़ेड, 0 से 9 तक हैं। कम से कम कोड या एकल फ़ंक्शन सबसे अच्छा होगा क्योंकि सिस्टम इनपुट के जवाब में समय महत्वपूर्ण है।डेल्फी 7 में स्ट्रिंग से गैर अल्फान्यूमेरिक वर्णों को अलग करने का सबसे तेज़ तरीका क्या है?

+2

वहां अच्छा टैगिंग;) – AdrianoKF

उत्तर

8
uses JclStrings; 

    S := StrKeepChars('mystring', ['A'..'Z', 'a'..'z', '0'..'9']); 
+2

नोट: नवीनतम जेसीएल लाइब्रेरी में, आप कहेंगे:' JclAnsiStrings का उपयोग करता है ' –

1

OnKeypress घटना

शुरू नहीं तो (में महत्वपूर्ण [ 'ए' .. 'Z', 'एक' .. 'z', '0' .. '9']) तो कुंजी: = # 0; अंत;

+0

आपको वैसे भी उपयोग करने से पहले टेक्स्ट को सत्यापित करना होगा। आप क्लिपबोर्ड या टेक्स्ट ड्रैग और ड्रॉप का उपयोग करके इस चेक को बाईपास कर सकते हैं। – DiGi

+0

ओपी एक स्ट्रिंग को पट्टी करना चाहता है - कीबोर्ड का कोई उल्लेख नहीं। –

3

बस एक टिप्पणी जोड़ने के लिए।

डेल्फी 7 में एक सेट का उपयोग करने का समाधान ठीक है, लेकिन यह डेल्फी 200 में कुछ समस्याएं पैदा कर सकता है क्योंकि सेट चार का नहीं हो सकता है (वे Ansichar में परिवर्तित हो जाते हैं)।

एक समाधान का उपयोग कर सकते है:

case key of 
    'A'..'Z', 'a'..'z', '0'..'9' : begin end; // No action 
else 
    Key := #0; 
end; 

लेकिन सबसे बहुमुखी रास्ता निश्चित रूप से है:

if not ValidChar(key) then 
    Key := #0; 

उस मामले आप कई स्थानों में ValidChar उपयोग कर सकते हैं और अगर यह होने की जरूरत में बदल गया आपको केवल इसे एक बार बदलना होगा।

10

अगर मैं तुम्हें सही ढंग से समझ आप इस तरह एक समारोह इस्तेमाल कर सकते हैं:

function StripNonAlphaNumeric(const AValue: string): string; 
var 
    SrcPtr, DestPtr: PChar; 
begin 
    SrcPtr := PChar(AValue); 
    SetLength(Result, Length(AValue)); 
    DestPtr := PChar(Result); 
    while SrcPtr <> #0 do begin 
    if SrcPtr[0] in ['a'..'z', 'A'..'Z', '0'..'9'] then begin 
     DestPtr[0] := SrcPtr[0]; 
     Inc(DestPtr); 
    end; 
    Inc(SrcPtr); 
    end; 
    SetLength(Result, DestPtr - PChar(Result)); 
end; 

यह (कम readibility की कीमत पर) उच्चतम गति के लिए PChar का प्रयोग करेंगे।

संपादित करें: उपयोग के बारे में gabr द्वारा टिप्पणी पुन DestPtr [0] DestPtr^ के बजाय: यह एक ही बाइट्स वैसे भी संकलन करना चाहिए, लेकिन इसी तरह के कोड है, जहां आप की जरूरत में अच्छा अनुप्रयोगों देखते हैं भविष्य का ध्यान करना। मान लीजिए कि आप न्यूलाइन को प्रतिस्थापित करना चाहते हैं, तो आप

function ReplaceNewlines(const AValue: string): string; 
var 
    SrcPtr, DestPtr: PChar; 
begin 
    SrcPtr := PChar(AValue); 
    SetLength(Result, Length(AValue)); 
    DestPtr := PChar(Result); 
    while SrcPtr <> #0 do begin 
    if (SrcPtr[0] = #13) and (SrcPtr[1] = #10) then begin 
     DestPtr[0] := '\'; 
     DestPtr[1] := 't'; 
     Inc(SrcPtr); 
     Inc(DestPtr); 
    end else 
     DestPtr[0] := SrcPtr[0]; 
    Inc(SrcPtr); 
    Inc(DestPtr); 
    end; 
    SetLength(Result, DestPtr - PChar(Result)); 
end; 

और इसलिए मैं आमतौर पर^का उपयोग नहीं कर सकता।

बीटीडब्लू, क्या किसी को यह पता है कि हाइलाइटिंग सही तरीके से कैसे काम करता है इस तरह प्रारूपित करना है?

+0

मुझे एसआरसीपीआरटी [0] का उपयोग बहुत दिलचस्प लगता है - पहले कभी ऐसा दृष्टिकोण नहीं देखा। SrcPtr^और DestPtr^का उपयोग करने के लिए और अधिक कैनोलिक तरीका होगा। – gabr

+0

पुन: स्वरूपण - शायद अगर आप "DestPtr [0]: = 't'" के बाद लापता अर्धविराम डालते हैं तो हाइलाइटिंग काम करेगी। :-) –

+0

धन्यवाद केन, सही है, लेकिन यह अभी भी काम नहीं कर रहा है :-(हाइलाइटर दुर्भाग्य से सी स्ट्रिंग्स के रूप में डेल्फी तारों का इलाज करता है। – mghie

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

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