代码之家  ›  专栏  ›  技术社区  ›  Marcoscdoni

突出显示DBGrid中的特定文本

  •  3
  • Marcoscdoni  · 技术社区  · 8 年前

    我正在执行查询并在dbgrid中显示返回的数据。

    我想突出显示符合搜索条件的项目。类似于:

    搜索依据:“ 测验

    在DBGrid中,返回的数据将是。

    ID     Return
    1      This is a **test**
    2      **Test**ing
    

    这里的目标无疑是查询数据。但如何在DBGrid中突出显示特定文本?

    重要提示:只应突出显示文本的特定部分。

    注:所提供的信息是为了明确,而不是与实际情况完全对应。

    1 回复  |  直到 8 年前
        1
  •  6
  •   Val Marinov    8 年前

    此过程突出显示DbGrid中的“FilterText”

    procedure HighlightCellText(AGrid :TDbGrid; const ARect : TRect; AColumn : TColumn;  FilterText : string; AState:TGridDrawState ;
      BkColor : TColor = clYellow; SelectedBkColor : TColor = clGray);
    var
      HlRect : TRect;
      Position : Integer;
      HlText, FilterColName,DisplayText: string;
      i, offset : Integer;
    begin
       DisplayText := Acolumn.Field.AsString;
       Position := Pos(AnsiLowerCase(FilterText), AnsiLowerCase(DisplayText){  AnsiLowerCase(AColumn.DisplayText)});
       if Position > 0 then
       begin
         // set highlight area
         case AColumn.Alignment of
           taLeftJustify:  HlRect.Left := ARect.Left + AGrid.Canvas.TextWidth(Copy(DisplayText, 1, Position-1)) + 1;
           taRightJustify: begin
             Offset := AGrid.Canvas.TextWidth(Copy(DisplayText, 1,1)) - 1;
             HlRect.Left :=  (ARect.Right - AGrid.Canvas.TextWidth(DisplayText)-offset) + AGrid.Canvas.TextWidth(Copy(DisplayText, 1, Position-1));
           end;
           taCenter: begin
             Offset := ((ARect.Right - ARect.Left) div 2) - (AGrid.Canvas.TextWidth(DisplayText) div 2) - (AGrid.Canvas.TextWidth(Copy(DisplayText, 1,1)) - 2);
    
             HlRect.Left := (ARect.Right - AGrid.Canvas.TextWidth(DisplayText)- offset) + AGrid.Canvas.TextWidth(Copy(DisplayText, 1, Position-1));
           end;
         end;
    
         HlRect.Top := ARect.Top + 1;
         HlRect.Right := HlRect.Left +AGrid.Canvas.TextWidth(Copy(DisplayText, Position, Length(FilterText))) + 1 ;
         HlRect.Bottom := ARect.Bottom - 1;
    
         //check for  limit of the cell
         if HlRect.Right > ARect.Right then
           HlRect.Right := ARect.Right;
    
         // setup the color and draw the rectangle in a width of the matching text
         if gdSelected in AState then
           AGrid.Canvas.Brush.Color := SelectedBkColor
         else
           AGrid.Canvas.Brush.Color := BkColor;
    
         AGrid.Canvas.FillRect(HlRect);
    
         HlText := Copy(DisplayText,Position, Length(FilterText));
         AGrid.Canvas.TextRect(HlRect,HlRect.Left + 1,HlRect.Top + 1, HlText);
       end;
    end;
    

    在DbGrid中使用它。OnDrawColumnCell事件:

    例如,突出显示文本为“ro”。

    procedure TForm6.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
     begin
       HighlightCellText(TDBGrid(Sender),Rect, Column,'ro',State);
    end;
    

    结果是:

    enter image description here

    编辑:

    A litle demo