Avatar billede flyboy Nybegynder
16. juni 2005 - 22:47 Der er 8 kommentarer og
1 løsning

Søg i Richedit

Jeg kunne godt tænke mig at lave en funktion til at søge efter tekst i en richedit, hvor teksten bliver markeret hvis der bliver fundet noget...

kunne evt. ske ved en editboks til at indtaste søgeordet og en knap til at trykke "søg".

Jeg ved bare ikke hvordan jeg skal gribe det an, da jeg er meget newbee...

Mvh.
FlyBoy
Avatar billede stone Forsker
16. juni 2005 - 22:59 #1
function SearchForText_AndSelect(RichEdit: TRichEdit; SearchText: string): Boolean;
var
  StartPos, Position, Endpos: Integer;
begin
  StartPos := 0;
  with RichEdit do
  begin
    Endpos := Length(RichEdit.Text);
    Lines.BeginUpdate;
    while FindText(SearchText, StartPos, Endpos, [stMatchCase])<>-1 do
    begin
      Endpos  := Length(RichEdit.Text) - startpos;
      Position := FindText(SearchText, StartPos, Endpos, [stMatchCase]);
      Inc(StartPos, Length(SearchText));
      SetFocus;
      SelStart  := Position;
      SelLength := Length(SearchText);
    end;
    Lines.EndUpdate;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
SearchForText_AndSelect(RichEdit1, edit1.text);

end;
Avatar billede flyboy Nybegynder
16. juni 2005 - 23:18 #2
tak for det... lige et spørgsmål mere. hvordan giver jeg dig dine fortjente point?
Avatar billede flyboy Nybegynder
16. juni 2005 - 23:27 #3
Hvordan kan man evt lave en knap som går videre til næste søgeresultat hvis der findes et?
Avatar billede stone Forsker
17. juni 2005 - 00:00 #4
For at kunne gi point skal jeg lave et svar, når du har fået løst dit problem acceptere du mit svar ved at afmærke mit navn......

istedet for en edit kunne du bruge TFindDialog1 her har du find next

procedure TForm1.Button1Click(Sender: TObject);
begin
  FindDialog1.Position := Point(RichEdit1.Left + RichEdit1.Width, RichEdit1.Top);
  FindDialog1.Execute;

end;

procedure TForm1.FindDialog1Find(Sender: TObject);
var
  FoundAt: LongInt;
  StartPos, ToEnd: Integer;
begin
  with RichEdit1 do
  begin
    { begin the search after the current selection if there is one }
    { otherwise, begin at the start of the text }
    if SelLength <> 0 then

      StartPos := SelStart + SelLength
    else

      StartPos := 0;

    { ToEnd is the length from StartPos to the end of the text in the rich edit control }

    ToEnd := Length(Text) - StartPos;

    FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
    if FoundAt <> -1 then
    begin
      SetFocus;
      SelStart := FoundAt;
      SelLength := Length(FindDialog1.FindText);
    end;
  end;
  end;
Avatar billede stone Forsker
17. juni 2005 - 00:02 #5
TFindDialog finder du på paletten "Dialogs"
Avatar billede flyboy Nybegynder
17. juni 2005 - 00:20 #6
okay tak. lige en sidste ting før du får dine point. Den der nederste procedure, hvad skal jeg gøre af den? jeg kan ikke bare kopiere den over. hvad gør den, og skal jeg evt skrive noget nogle andre steder?
Avatar billede stone Forsker
17. juni 2005 - 00:43 #7
det nederste eksemplet bruger du i stedet for den anden, jo du kopiere den bare over

den her indsætter du i  FindDialog1 "onfind" event......

procedure TForm1.FindDialog1Find(Sender: TObject);
var
  FoundAt: LongInt;
  StartPos, ToEnd: Integer;
begin
  with RichEdit1 do
  begin
    { begin the search after the current selection if there is one }
    { otherwise, begin at the start of the text }
    if SelLength <> 0 then

      StartPos := SelStart + SelLength
    else

      StartPos := 0;

    { ToEnd is the length from StartPos to the end of the text in the rich edit control }

    ToEnd := Length(Text) - StartPos;

    FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
    if FoundAt <> -1 then
    begin
      SetFocus;
      SelStart := FoundAt;
      SelLength := Length(FindDialog1.FindText);
    end;
  end;
  end;

og den her indsætter du i din button eller.....

procedure TForm1.Button1Click(Sender: TObject);
begin
  FindDialog1.Position := Point(RichEdit1.Left + RichEdit1.Width, RichEdit1.Top);
  FindDialog1.Execute;

end;
Avatar billede flyboy Nybegynder
18. juni 2005 - 23:40 #8
"den her indsætter du i  FindDialog1 "onfind" event......" Det forstår jeg ikke.
hvordan gøres det? er det en funktion der hedder on find?
Avatar billede stone Forsker
23. juni 2005 - 08:22 #9
for componentet finddialog har en event som hedder onfind her skriver du......

var
  FoundAt: LongInt;
  StartPos, ToEnd: Integer;
begin
  with RichEdit1 do
  begin
    { begin the search after the current selection if there is one }
    { otherwise, begin at the start of the text }
    if SelLength <> 0 then

      StartPos := SelStart + SelLength
    else

      StartPos := 0;

    { ToEnd is the length from StartPos to the end of the text in the rich edit control }

    ToEnd := Length(Text) - StartPos;

    FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
    if FoundAt <> -1 then
    begin
      SetFocus;
      SelStart := FoundAt;
      SelLength := Length(FindDialog1.FindText);
    end;
  end;
  end;

og den her indsætter du i din button eller.....

procedure TForm1.Button1Click(Sender: TObject);
begin
  FindDialog1.Position := Point(RichEdit1.Left + RichEdit1.Width, RichEdit1.Top);
  FindDialog1.Execute;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester