Delphi 突出显示DBGrid中的特定文本
我正在执行查询并在dbgrid中显示返回的数据 我想突出显示符合搜索条件的项目。比如: 搜索方式:“测试” 在DBGrid中,返回的数据将是Delphi 突出显示DBGrid中的特定文本,delphi,delphi-xe7,Delphi,Delphi Xe7,我正在执行查询并在dbgrid中显示返回的数据 我想突出显示符合搜索条件的项目。比如: 搜索方式:“测试” 在DBGrid中,返回的数据将是 ID Return 1 This is a **test** 2 **Test**ing 这里的目标无疑是查询数据。但是如何突出显示DBGrid中的特定文本 重要提示:只应突出显示文本的特定部分 注意:提供的信息是为了说明问题,而不是与实际情况完全对应。此过程在DbGrid中突出显示“FilterText” procedure
ID Return
1 This is a **test**
2 **Test**ing
这里的目标无疑是查询数据。但是如何突出显示DBGrid中的特定文本
重要提示:只应突出显示文本的特定部分
注意:提供的信息是为了说明问题,而不是与实际情况完全对应。此过程在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”
结果是:
编辑:
这在标准DBGrid中是不可能的。根据报告,关于另一个组件的问题在这里是离题的。我们不是组件购物网络。理论上,您可以通过将默认绘图设置为false,并使用OnDrawColumnCell和/或OnDrawDataCell事件自己绘制单元格,但这在相当低的级别上是相当多的工作。网格本身无法做到这一点。DevExpress gridview可以直接做到这一点,但并不便宜。谢谢@KenWhite的回答。但我的目标是解决这个问题,不一定要买一个组件,可以是一个免费软件,也可以像ValMarinov一样是一个明智的答案。无论如何,我删除了文本中脱离主题的部分;)您是否可以提供一个演示,让用户在编辑控件中键入搜索短语,然后网格突出显示该短语(而不滚动网格)?我能看到的唯一方法是使整个网格失效,这将导致一些丑陋的闪烁。非常感谢Val Marinov!给定的方法工作正常,没有任何问题。@KenWhite Ok。这是演示。够了吗是的。:-)做得很好。我必须用真实数据测试闪烁问题(比网格中显示的数据更多的列、行),但它似乎工作得很好。谢谢。:-)
procedure TForm6.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
HighlightCellText(TDBGrid(Sender),Rect, Column,'ro',State);
end;