2010-11-20 10 views
6

क्या कोई मुझे कुछ सरल कोड दे सकता है जो मुझे एक ज्ञापन में एक साधारण स्ट्रिंग को खोजने की क्षमता प्रदान करेगा और इसे मिलने के बाद ज्ञापन में हाइलाइट किया गया है?डेल्फी में एक ज्ञापन के माध्यम से खोजें?

उत्तर

3
function TForm1.FindText(const aPatternToFind: String):Boolean; 
    var 
    p: Integer; 
    begin 
    p := pos(aPatternToFind, Memo1.Text); 
    Result := (p > 0); 
    if Result then 
     begin 
     Memo1.SelStart := p; 
     Memo1.SelLength := Length(aPatternToFind); 
     Memo1.SetFocus; // necessary so highlight is visible 
     end; 
    end; 

यदि वर्डवाप सत्य है तो यह लाइनों में नहीं खोजता है।

+0

'TStrings.Strings' की बजाय' TStrings.Text' में खोजना बहुत महंगा है। तथ्य में 2 × एन। –

+0

@ user205376 - आप ऐसा क्यों कहते हैं? TStrings.Text एक एकल स्ट्रिंग है जिस पर मुझे लगता है कि pos() तेज़ होगा। जैसा कि आप सुझाव देते हैं, खोज रहे हैं, TStrings.Strings में प्रत्येक स्ट्रिंग तक पहुंचने के लिए सबस्क्रिप्ट शामिल होंगे। वह, आईएमओ, राय धीमा हो जाएगा और कोई अतिरिक्त कार्यक्षमता प्रदान नहीं करेगा जो pos() नहीं करता है। (और, पाया गया पैटर्न को हाइलाइट करने के लिए इसे कुछ मुश्किल कोड की आवश्यकता होगी) आप ऐसा क्यों नहीं सोचते? – RobertFrank

+0

खेल के लिए थोड़ा देर हो चुकी है, लेकिन उपर्युक्त के लिए, यह कार्यान्वयन पर निर्भर करता है। सभी टीएसट्रिंग्स सार के बाद। Memo.Lines.Text (= TMemoStrings.Text) को एक एकल एपीआई कॉल का उपयोग करके ज्ञापन का पाठ मिलता है, जबकि एक TStringList अलग स्ट्रिंग और TStringList स्टोर करता है। पाठ उन्हें प्रत्येक अनुरोध पर एक स्ट्रिंग में जोड़ता है (जो अक्सर कॉल करने से भी तेज़ होता है एपीआई, बीटीडब्ल्यू)। उत्तर Memo1.Text का उपयोग करता है जो मुझे लगता है कि किसी भी टीएसट्रिंग्स वंशज को छोड़ देता है और सीधे मेमो के हैंडल पर कुछ GetText एपीआई को कॉल करता है। – GolezTrol

11

यह खोज दस्तावेज़ रैप, केस (इन) संवेदनशील खोज और कर्सर स्थिति से खोज करने की अनुमति देती है।

type 
    TSearchOption = (soIgnoreCase, soFromStart, soWrap); 
    TSearchOptions = set of TSearchOption; 


function SearchText(
    Control: TCustomEdit; 
    Search: string; 
    SearchOptions: TSearchOptions): Boolean; 
var 
    Text: string; 
    Index: Integer; 
begin 
    if soIgnoreCase in SearchOptions then 
    begin 
    Search := UpperCase(Search); 
    Text := UpperCase(Control.Text); 
    end 
    else 
    Text := Control.Text; 

    Index := 0; 
    if not (soFromStart in SearchOptions) then 
    Index := PosEx(Search, Text, 
     Control.SelStart + Control.SelLength + 1); 

    if (Index = 0) and 
     ((soFromStart in SearchOptions) or 
     (soWrap in SearchOptions)) then 
    Index := PosEx(Search, Text, 1); 

    Result := Index > 0; 
    if Result then 
    begin 
    Control.SelStart := Index - 1; 
    Control.SelLength := Length(Search); 
    end; 
end; 

आप HideSelection = ज्ञापन चयन भले ही ज्ञापन ध्यान केंद्रित नहीं कर रहा है दिखाने के लिए पर झूठी सेट कर सकते हैं।

इस तरह

उपयोग:

SearchText(Memo1, Edit1.Text, []); 

खोज संपादन के साथ-साथ देता है।

+0

अपरकेस का उपयोग करके आप वांछित परिणाम नहीं दे सकते हैं, उदा। फ्रांसीसी में, ऊपरी केस के पात्रों का उच्चारण नहीं हो सकता है जबकि निचले केस वर्णों में एक हो सकता है (यह कनाडाई फ्रांसीसी से अलग है, जहां ऊपरी केस वर्णों को भी उच्चारण किया जा सकता है)। इसलिए, इस मामले में लोअरकेस का उपयोग बेहतर परिणाम देगा। – dummzeuch

+0

खैर, उच्चारण पत्र और असंतुलित पत्र दो अलग-अलग अक्षर हैं, है ना? फ्रांसीसी शब्द, जब अपरकेस में परिवर्तित किया जाता है, तो प्राइवके में दिखाया जाएगा, लोअरकेस में यह निजी होगा। दूसरी ओर, अपरकेस अक्षर ए को या तो परिवर्तित नहीं किया गया है, इसलिए मुझे नहीं पता कि यह खोज परिणामों को कैसे प्रभावित करेगा। हालांकि मुझे यह स्वीकार करना होगा कि मैं डेल्फी 7 में इसका परीक्षण कर रहा हूं। यदि आपके डेल्फी में यूनिकोड या लोकेल सेटिंग्स का संभावित उपयोग लोअरकेस का उपयोग करते समय बेहतर परिणामों में पैदा होता है, तो कृपया करें। – GolezTrol

+2

GolezTrol: छुपा चयन टिप के लिए धन्यवाद! – RobertFrank

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