2016-04-04 11 views
3

Ich habe eine reiche Bearbeitung für ein Delphi-Formular, das eine Finddialogbox enthält. Der Benutzer gibt das zu suchende Wort ein, und das Programm hebt das gefundene Wort richtig hervor - das funktioniert gut. Ich möchte jedoch, dass das Programm scrollt, so dass das erste Vorkommen des gefundenen Wortes in der ersten Zeile der Richit-Box erscheint. Klickt der Benutzer dann auf "Weiter" (Suchfeld), wird das Scrollen fortgesetzt, so dass das nächste Vorkommen des Wortes in der ersten Zeile erscheint, und so weiter. Kann mir hier jemand helfen?So scrollen Sie zum gefundenen Wort, das der Benutzer in das Suchdialogfeld eingegeben hat

procedure tform3.FindDialog1Find(Sender: TObject); 
var 
    sText: string; 
    StartFrom, FoundPos: integer; 
begin 
    { If saved position is 0, this must be a "Find First" operation. } 
    if PreviousFoundPos = 0 then 
    { Reset the frFindNext flag of the FindDialog } 
    findDialog1.Options := findDialog1.Options - [frFindNext]; 

    if not (frFindNext in FindDialog1.Options) then begin // is it a Find "First" ? 
    sText := Richedit1.Text; 
    StartFrom := 1; 
    end 
    else begin // it's a Find "Next" 
    { Calculate from where to start searching: 
     start AFTER the end of the last found position. } 
    StartFrom := PreviousFoundPos + Length(FindDialog1.Findtext); 
    { Get text from the RichEdit, starting from StartFrom } 
    sText := Copy(Richedit1.Text, StartFrom, Length(Richedit1.Text) - StartFrom + 1); 
    end; 

    if frMatchCase in FindDialog1.Options then // case-sensitive search? 
    { Search position of FindText in sText. 
     Note that function Pos() is case-sensitive. } 
    FoundPos := Pos(FindDialog1.FindText, sText) 
    else 
    { Search position of FindText, converted to uppercase, 
     in sText, also converted to uppercase  } 
    FoundPos := Pos(UpperCase(FindDialog1.FindText), UpperCase(sText)); 

    if FoundPos > 0 then begin 
    { If found, calculate position of FindText in the RichEdit } 
    PreviousFoundPos := FoundPos + StartFrom - 1; 
    { Highlight the text that was found } 
    RichEdit1.SelStart := PreviousFoundPos - 1; 
    RichEdit1.SelLength := Length(FindDialog1.FindText); 
    RichEdit1.SetFocus; 
    end 
    else 
    ShowMessage('Could not find "' + FindDialog1.FindText + '"'); 
end; 
+0

Danke NineBerry. Das funktioniert perfekt. Der Himmel weiß, wie lange ich gebraucht hätte, um es herauszufinden (wenn überhaupt!). – Mariner

+1

Die Frage hat nichts mit Dialogen zu tun und dreht sich nur um das Control. FWIW, Ihr Code zum Suchen im Text ist nicht effizient. Sie sollten die Kontrolle erhalten, um die Arbeit zu erledigen. –

+1

Auch wenn Sie der Meinung sind, dass die Frage beantwortet wurde, sollten Sie die beste Antwort akzeptieren: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

Antwort

4

Sie können den folgenden Code verwenden, um die Cursorposition in der TRichEdit Steuerung zu blättern:

RichEdit1.SelStart := PreviousFoundPos - 1; 
RichEdit1.SelLength := Length(FindDialog1.FindText); 
RichEdit1.SetFocus; 

// Now scroll to the current cursor position 
RichEdit1.Perform(EM_SCROLLCARET, 0, 0); 

Dieser sendet die Meldung Windows EM_SCROLLCARET an die Steuerung, die die Steuer blättern zu den aktuellen Cursor machen Position.