Destacar string no dbgrid

Delphi

01/07/2005

Salve pessoal,

estou com a seguinte duvida: É possivel destacar apenas uma string dentro de outra string em uma celula do dbgrid. Vou explicar tenho um dbgrid que exibe o resultado de uma busca, tenho a coluna nome do produto onde vamos supor tenho um produto com o seguiente nome: CABO PARA IMPRESSORA HP se eu fizer uma busca digitando no edit ¬IMPRESSORA¬ a string IMPRESSORA no dbgrid seria negritada, apenas ela.
é possivel fazer isso?


Mmoreira

Mmoreira

Curtidas 0

Respostas

Mmoreira

Mmoreira

01/07/2005

sobe ...


GOSTEI 0
Jairroberto

Jairroberto

01/07/2005

Olá, Moreira!

É possível fazer algo parecido com o que você quer utilizando o método ´OnDrawColumnCell´ do DBGrid. Só sugiro não utilizar negrito, pois isso altera a largura do texto, o que complicaria um pouco o código. Mas você pode usar uma cor diferente no fundo da palavra encontrada. Veja um exemplo que destaca o texto usando um fundo amarelo:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
  CorDestaque = clYellow;
var
  s: string;
  i: Integer;
  TextoRectLeft, TextoRectWidth: Integer;
begin
  if Column.Field.FieldName = ´Description´ then
  begin
    s := Column.Field.AsString;
    if AnsiContainsText(s, Texto) then
    begin
      with (Sender as TDBGrid) do
      begin
        Canvas.Font.Assign(Column.Font);
        if gdFocused in State then
        begin
          Canvas.Brush.Color := Column.Color;
          Canvas.DrawFocusRect(Rect);
        end;
        if gdSelected in State then
        begin
          Canvas.Brush.Color := clHighlight;
          Canvas.Font.Color := clHighlightText;
          Canvas.Rectangle(Rect);
        end
        else
        begin
          TextoRectLeft := 2;
          Canvas.Brush.Color := CorDestaque;
          while AnsiContainsText(s, Texto) do
          begin
            // Localiza a posição do texto no campo
            i := Pos(UpperCase(Texto), UpperCase(s));
            // Posiciona o retângulo no final do texto anterior ao texto encontrado
            TextoRectLeft := TextoRectLeft + Canvas.TextWidth(Copy(s, 1, i-1));
            // Calcula a largura do texto procurado conforme consta no campo
            TextoRectWidth := Canvas.TextWidth(Copy(s, i, Length(Texto)));
            // Desenha um retângulo com a CorDestaque na posição em que vai ficar o texto encontrado
            Canvas.FillRect(Classes.Rect(Rect.Left + TextoRectLeft, Rect.Top, Rect.Left + TextoRectLeft + TextoRectWidth, Rect.Bottom));
            // Elimina a parte já processada do texto para procurar novas incidências
            Delete(s, 1, i + Length(Texto) - 1);
            // Posiciona o retângulo no final do texto encontrato para a próximo incidência
            TextoRectLeft := TextoRectLeft + TextoRectWidth;
          end;
        end;
        // Desenha o texto com fundo transparente sobre o fundo com os destaques
        Canvas.Brush.Style := bsClear;
        Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Column.Field.DisplayText);
      end;
    end
    else
      (Sender as TDBGrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end
  else
    (Sender as TDBGrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;



Considere que a variável ´Texto´ no exemplo corresponde ao texto procurado no campo, que no exemplo foi o ´Description´ da tabela ´Parts.xml´ que acompanha os exemplos de dados do Delphi 6.


Um abraço,
Jair


GOSTEI 0
POSTAR