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;
Danke NineBerry. Das funktioniert perfekt. Der Himmel weiß, wie lange ich gebraucht hätte, um es herauszufinden (wenn überhaupt!). – Mariner
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. –
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 –