1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194:
| function Get_Text_FuerEineDefinierteBreite(pcanvas: TCanvas; ptext: String; pbreite: integer): String; var lStringLaenge:Integer;
begin while pCanvas.TextWidth(pText) > pBreite do begin lStringLaenge := Length(pText); if lStringLaenge > 1 then pText := Copy(pText, 1, lStringLaenge-1) else begin pText := ''; break; end; end; Result := pText; end;
procedure Erzeuge_SuchWortListe(pSuchWoerter: String; var pSuchWortListe:TStrings); var Pos_Leer:Integer; S, TextFilter, lSuchWoerter:String; lLength:integer; begin pSuchWortListe.Clear; S := AnsiUpperCase(pSuchWoerter); Pos_Leer := Pos(' ', S); while Pos_Leer > 0 do begin TextFilter := TRIM(Copy(S, 1, Pos_Leer)); if TextFilter <> '' then pSuchWortListe.Add(TextFilter); S := TRIM(Copy(S, Pos_Leer, lLength)); Pos_Leer := Pos(' ', S); end; if s <> '' then pSuchWortListe.Add(S); end;
function Get_Markierungsmaske(pSuchwortListe: TStrings; pText: String): String; var i, j, lLaenge, lSuchwortlaenge:Integer; lTextUpperCase, lHelpText, lMarkierungsmaske:String; Pos_start: Integer; Pos_Ende: Integer; begin lTextUpperCase := AnsiUpperCase(pText); lLaenge := Length(lTextUpperCase); lMarkierungsmaske := DupeString('0', lLaenge); for i:= 0 to (pSuchwortListe.Count - 1) do begin lSuchwortlaenge := Length(pSuchwortListe[i]); lHelpText:= lTextUpperCase; Pos_Start := Pos(pSuchwortListe[i], lHelpText); while Pos_Start > 0 do begin for j:= 0 to (lSuchwortlaenge - 1) do lMarkierungsmaske[Pos_Start + j] := '1'; Pos_Ende := Pos_Start + lSuchwortlaenge; lHelpText := DupeString(' ', Pos_Ende - 1) + Copy(lHelpText, Pos_Ende, lLaenge); Pos_Start := Pos(pSuchwortListe[i], lHelpText); end; end; Result := lMarkierungsmaske; end;
procedure Write(pCanvas: TCanvas; pX, pY: integer; pSuchwoerter, pText: String; pHighlightColor, pTextColor: TColor); function WriteText(iCanvas:TCanvas; iBkColor, iTextColor:cardinal; iText: String): String; begin SetBkColor(iCanvas.handle, iBkColor); SetTextColor(iCanvas.handle,iTextColor); TextOut(iCanvas.handle,0,0,pchar(iText),Length(iText)); end; var i, lLaenge:Integer; lMarkierungsmaske, lMitMarkierung, lOhneMarkierung:String; lBkColor, lTextColor: cardinal; savedTextAlign, SavedBkColor, savedTextColor: cardinal; savedPt: TPoint; SuchwortListe:TStrings; begin SuchwortListe := TStringList.Create; try Erzeuge_SuchWortListe(pSuchwoerter, SuchwortListe); if (TRIM(SuchWortListe.Text) = '') then begin pCanvas.TextOut(pX, pY, pText); exit; end; lMarkierungsmaske := Get_Markierungsmaske(SuchwortListe, pText); lLaenge := Length(pText); if Pos('1', lMarkierungsmaske) > 0 then begin lBkColor := ColorToRGB(pHighlightColor); lTextColor := ColorToRGB(pTextColor);
SavedTextColor := GetTextColor(pCanvas.Handle); SavedBkColor := GetBkColor(pCanvas.handle); savedTextAlign := GetTextAlign(pCanvas.Handle); SetTextAlign(pCanvas.Handle, savedTextAlign or TA_UPDATECP); MoveToEx(pCanvas.Handle, pX, pY, @savedPt);
lOhneMarkierung := ''; lMitMarkierung := ''; for i:= 1 to lLaenge do begin if lMarkierungsmaske[i] = '0' then begin if (lMitMarkierung <> '') then begin WriteText(pCanvas, lBkColor, lTextColor, lMitMarkierung); lMitMarkierung := ''; lOhneMarkierung := ''; end; lOhneMarkierung := lOhneMarkierung + pText[i]; end else begin if (lOhneMarkierung <> '') then begin WriteText(pCanvas, savedBkColor, savedTextColor, lOhneMarkierung); lMitMarkierung := ''; lOhneMarkierung := ''; end; lMitMarkierung := lMitMarkierung + pText[i]; end; end;
if lMitMarkierung <> '' then WriteText(pCanvas, lBkColor, lTextColor, lMitMarkierung) else WriteText(pCanvas, savedBkColor, savedTextColor, lOhneMarkierung);
SetTextColor(pCanvas.handle,savedTextColor); SetBkColor(pCanvas.handle, SavedBkColor); SetTextAlign(pCanvas.Handle, savedTextAlign); MoveToEx(pCanvas.Handle, savedPt.X, savedPt.Y, nil); end; finally SuchwortListe.Free; end; end;
procedure MarkupTextOut(pCanvas: TCanvas; pRect: TRect; pSuchwoerter, pText: String; pHighlightColor:TColor = $0080FF80; pTextColor:TColor = clBlack); var lText:String; begin pCanvas.FillRect(pRect); lText := Get_Text_FuerEineDefinierteBreite(pCanvas, pText, pRect.Right - pRect.Left - 4); Write(pCanvas, pRect.Left+2, pRect.Top+2, pSuchwoerter, lText, pHighlightColor, pTextColor); end; |