Ik wilde een zoekfunctie toevoegen aan een TMemo (Memo1) in een van mijn projecten - met de optie om van gevonden tekst naar de volgende gevonden tekst te springen, en de gevonden tekst te highlighten.
Dit is geheel gebaseerd op dit voorbeeld in de Lazarus Wiki - ik plaats het hier met wat kleine modificaties en voor mijn eigen referentie.
Uiteraard hebben we hiervoor een TEdit (Edit1, enter search criteria) en een TButton (Button1) nodif.
...
Uses ... , StrUtils, LazUTF8;
...
function TForm1.FindInMemo(AString: String; StartPos: Integer): Integer;
begin
Result := PosEx(AString, Memo1.Text, StartPos);
if Result > 0 then
begin
Memo1.SelStart := UTF8Length(PChar(Memo1.Text), Result - 1);
Memo1.SelLength := Length(AString);
Memo1.SetFocus;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
SearchStart : Integer = 0;
SearchStr : string = '';
begin
if SearchStr <> Edit1.Text then
begin
SearchStart := 0;
SearchStr := Edit1.Text;
end;
SearchStart := FindInMemo(SearchStr, SearchStart + 1);
if SearchStart = 0 then beep;
end;
Het onClick event can de button moeten we natuurlijk aan de Button1Click() procedure koppelen.
Ik heb als extra nog een popup menu gemaakt voor de TMemo zodat ik een toets-combinatie kan gebruiken om naar het volgende zoek resultaat te springen (Mac: Command+G, Windows/Linux: F3).