Destacar string no dbgrid
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?
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
Curtidas 0
Respostas
Mmoreira
01/07/2005
sobe ...
GOSTEI 0
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:
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
É 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