2016-08-10 6 views
3

Ich führe eine Abfrage und Anzeige der zurückgegebenen Daten in dbgrid.Markieren Sie einen bestimmten Text in DBGrid

Ich möchte die Elemente hervorheben, die den Suchkriterien entsprechen. Etwas wie:

Suchen nach: "Test"

In DBGrid, zurückgegebenen Daten sein würde.

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

Das Ziel hier ist kein Zweifel über die Abfrage von Daten. Aber wie markiert man bestimmten Text in DBGrid?

Wichtig: Nur der spezifische Teil des Textes sollte hervorgehoben werden.

HINWEIS: Die dargestellten Informationen sollen klarstellen, nicht genau der Realität entsprechen.

+0

, die im Standard DBGrid nicht möglich ist. Und Fragen nach einer anderen Komponente sind laut [help/on-topic] off-topic. Wir sind nicht das Komponenten-Shopping-Netzwerk. –

+2

Theoretisch können Sie die Standardzeichnung auf "false" setzen und die Zelle mithilfe der Ereignisse "OnDrawColumnCell" und "OnDrawDataCell" selbst zeichnen, aber das ist ziemlich viel Arbeit auf ziemlich niedrigem Niveau. Das Gitter selbst kann es nicht tun. – Dsm

+0

Das DevExpress-Gridview tut dies sofort, aber es ist nicht billig. – GuidoG

Antwort

6

Dieses Verfahren Highlight `FilterText‘ in DBGRID

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; 

es in DbGrid.OnDrawColumnCell Ereignisse Verwendung:

Zum Beispiel Highlight Text ist "ro".

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

Das Ergebnis:

enter image description here

Edit:

A litle demo

+1

Können Sie eine Demo zur Verfügung stellen, wo der Benutzer eine Suchphrase in einem Bearbeitungssteuerelement eingibt und das Raster die Phrase hervorhebt (ohne das Raster zu scrollen)? Der einzige Weg, den ich sehen kann, wäre, das gesamte Gitter ungültig zu machen, was zu einem hässlichen Flackern führen wird. –

+0

Vielen Dank Val Marinov! Die angegebene Methode funktioniert einwandfrei, ohne Probleme. – Marcoscdoni

+0

@KenWhite Ok. Hier ist die Demo. Reicht das? : https://www.youtube.com/watch?v=pGKSDT5eSPA&feature=youtu.be –

Verwandte Themen