23. september 2004 - 08:09Der er
16 kommentarer og 1 løsning
Søge efter samme substring flere gange i en string
Hej dér,
Jeg har en richedit med en masse tekst, og der vil jeg gerne highlighte et bestemt ord gennem hele strengen. Jeg bruger:
richedit1.SelAttributes.Style := [fsBold]; og richedit1.SelAttributes.Color := clRed;
til at highlighte. Oprindeligt ville jeg bruge Pos til at finde ordet, men er der mere end 1 ord i strengen der skal highlightes, så retunerer Pos altså kun for det første. Hvordan får jeg den til at springe det ord over den lige har fundet? Uden at slette ordet naturligvis ;-)
Håber der er nogen med en god ide til hvordan man lige kan gøre det.
Alternativt kan du evt. bruge PosN functionen fra http://www.swissdelphicenter.com/en/showcode.php?id=738 i en while lykke som løber teksten igennem og tæller 1 op hver gang den finder noget, og så lade den køre indtil den ikke finder flere ord der passer.
Det lyder UTROLIGT besværligt at lave om på den nuværende Pos funktion bare for at løse dette problem. Mht. PosN, så kan jeg ikke bruge eksemplet som det er, så skal man jo fortælle netop hvilken occurence man vil have fat i, det er da besværligt.
Jeg har selv fundet en løsning som jeg kan bruge. Jeg laver en kopi af den streng jeg skal søge i. Derefter søger jeg i kopien, og finder jeg en occurence af ordet, så erstatter jeg det bare med noget andet, f.eks. en stak mellemrum (selvfølgelig så mange som ordet indeholder af tegn). Så laver jeg det jeg skal med ordet (laver farven om) og søger videre i kopien. Smart :-)
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; var I,X: Integer; Len, LenSubStr: Integer; begin if Offset = 1 then Result := Pos(SubStr, S) else begin I := Offset; LenSubStr := Length(SubStr); Len := Length(S) - LenSubStr + 1; while I <= Len do begin if S[I] = SubStr[1] then begin X := 1; while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do Inc(X); if (X = LenSubStr) then begin Result := I; exit; end; end; Inc(I); end; Result := 0; end; end;
function inString(const subStr: string; const str: string; start: integer): integer; //returnerer index på substr i str, men starter fra start i str. //hvis ikke fundet, eller start er størrer end længden på str, returneres 0. begin if start <= length(str) then begin result:=pos(subStr,copy(str,start,length(str)-start+1)); if result<>0 then result:=result+start-1; end else result:=0; end; //inString
Synes godt om
Ny brugerNybegynder
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.