Fórum Destacar letras com cor diferente no DBGrid? #365526

27/10/2008

0

Tenho uma procedure para fazer consultas no dbgrid destacando letras por uma determinada cor, e funciona blz.

A função é esta aqui
{:Função para pintar letra destacada no DBGrid}
procedure DrawTextDestacado(Canvas : TCanvas; Rect: TRect;
  TextoOrig, TextoDestaque : string;
  CorDestaque : TColor);

  procedure Draw(S : string; Cor : TColor);
  begin
    Canvas.Font.Color:= Cor;
    Canvas.TextRect(Rect, Rect.Left, Rect.Top + 2, S);
    Inc(Rect.Left, Canvas.TextWidth(S));
  end;

var
  S1 : string;
  P : Integer;
  CorOrig : TColor;
begin
  Canvas.FillRect(Rect);
  Inc(Rect.Left, 2);
  CorOrig := Canvas.Font.Color;

    while not (TextoDestaque = ´´) do
    begin
      P := Pos(´ ´, TextoDestaque);
      if P = 0 then
      begin
        S1 := TextoDestaque;
        TextoDestaque := ´´;
      end else
      begin
        S1 := Copy(TextoDestaque, 1, P-1);
        TextoDestaque := Trim(Copy(TextoDestaque, P+1, 255));
      end;

      if not (S1 = ´´) then
      begin
        P := Pos(UpperCase(S1), UpperCase(TextoOrig));
        if P = 0 then
          Break;

        Draw(Copy(TextoOrig, 1, P-1), CorOrig);
        Delete(TextoOrig, 1, P-1);
        P := Length(S1);
        Draw(Copy(TextoOrig, 1, P), CorDestaque);
        Delete(TextoOrig, 1, P);
      end;
    end;

    if not (TextoOrig = ´´) then
      Draw(TextoOrig, CorOrig);
end;


Em todas dbgrids do meu sistema funciona, mais tem um aqui que não quer funcionar de forma alguma, o método de uso é o mesmo para todas dbgrids.

Chamo assim no evento oncell do dbgrid
procedure TfrmListEmpresas.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
   {Primeiro chamo a função para destacar letras no DBGrid}
  if DataCol in [0, 1] then
    DrawTextDestacado(DBGrid1.Canvas, Rect, Column.Field.AsString, Trim(Edit2.Text), clBlue);
end;


O Select esta assim nesta ultima que não quer funcionar o destaque de cor no DBGrid.
var
  texto: string;
begin
  {:Primeiro passo os dados para serem filtrados no edit com mais de um nome e com espaços
  serve para filtrar tipo assim ADR SERV, JOAO DE S.... etc}
  if Trim(edit2.text) = ´´ then
     Exit;
     texto := AnsiUpperCase(StringReplace(TrimRight(edit2.text),´ ´,´¬ ´,[rfReplaceAll]))+´¬´;
     {:Aqui faço novamente o select agora passando por parametros}
     {:Obs Este select já esta cadastrado do DM com o parametro para o CDS reconheçer o parametro "ASSOCIADO"}
  with dm.ibPermissoesUser do
  begin
    Close;
    SelectSQL.Text := ´ select a.*, b.nmempresa,  b.cdempresa,    ´+
                      ´ b.nrcgc  from permissoesuser a, empresa b ´+
                      ´ where a.idusuario = :pusuario  and        ´+
                      ´ b.cdempresa = a.idempresa and a.marcarbox = ´´T´´ ´+
                      ´ and upper(b.nmempresa) like :busca        ´+
                      ´ order by b.cdempresa                      ´;
    ParamByName(´pusuario´).AsInteger := StrToInt(StatusBar1.Panels[1].Text);
    ParamByName(´busca´).AsString := AnsiUpperCase(Texto);
    Open;
    if IsEmpty then
       MessageDlg(´Não existe dados para esta pesquisa´, mtInformation, [mbOK], 0);
       Abort;
  end;


Somente nesta grid que não está funcionando, e eu não sei o motivo.

Grato pela ajuda
Adriano.


Adriano_servitec

Adriano_servitec

Responder

Posts

29/10/2008

Adriano_servitec

Resolvido

if (DataCol in [0, 1]) or SameText(Column.Field.FieldName, ´nmempresa´) then
       DrawTextDestacado(DBGrid1.Canvas, Rect, Column.Field.AsString, Trim(Edit2.Text), clBlue);



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar