Search code examples
delphivirtualtreeviewtvirtualstringtree

TVirtualStringTree highlight of searching result


I would like to highlight the text from a node of VirtualStringTree according to search criteria like example from bellow:

enter image description here

Any suggestion please?


Solution

  • Thanks to TLama answer (How to underline or highlight a part of node caption) I adjust a bit the code in order to highlight the text also in the middle.

    procedure Tform_main.vt_mainDrawText(Sender: TBaseVirtualTree;
      TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
      const Text: string; const CellRect: TRect; var DefaultDraw: Boolean);
    var
      BackMode, position: Integer;
    begin
      // if the just rendered node's Text contain the text written in a TEdit control
      // called Edit, then...
      position:= Pos(AnsiLowerCase(edit_search.Text), AnsiLowerCase(text));
      if position > 0 then
      begin
        // store the current background mode; we need to use Windows API here because the
        // VT internally uses it (so the TCanvas object gets out of sync with the DC)
        BackMode := GetBkMode(TargetCanvas.Handle);
        // setup the color and draw the rectangle in a width of the matching text
        TargetCanvas.Brush.Color := clYellow;
        TargetCanvas.FillRect(Rect(
          CellRect.Left + TargetCanvas.TextWidth(Copy(Text, 1, position-1)),
          CellRect.Top + 3,
          CellRect.Left  + TargetCanvas.TextWidth(Copy(Text, 1, position-1)) + TargetCanvas.TextWidth(Copy(Text, position, Length(edit_search.Text))),
          CellRect.Bottom - 3)
        );
        // restore the original background mode (as it likely was modified by setting the
        // brush color)
        SetBkMode(TargetCanvas.Handle, BackMode);
      end;
    end;
    

    Best wishes to TLama!