Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2010, 13:46   #1
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию BDGrid. Подсветить часть текста.

Как подсветить часть текста в ячейке BDGrid? Или цветом текста или фоном, все равно. (Хочу сделать при поиске по подстроке).
В RichEdit понятно, там проще.
А в ячейке не могу сообразить. Например, значение ячейки <DELPHI>.
Нужно подсветить четыре буквы <ELPH>

Пробовал в событии OnDrawColumnCell нарисовать Rect.
Pos('ELPH',text) мне известен.
Начало Rect-а = Length(Copy(Text,0,Pos('ELPH',Text) ))
т.е. я знаю сколько символов находится до нужной позиции.

А что дальше? Rect.Left плюс (умножить количество символов на количество пикселей в одном символе)?

Но оно может быть разным (символы разной ширины).

Или я вообще не с той стороны копаю?
Может уже есть готовый код? Я не нашел.

Последний раз редактировалось _SERGEYX_; 13.10.2010 в 13:53.
_SERGEYX_ вне форума Ответить с цитированием
Старый 13.10.2010, 14:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, Grids, DBGrids, DBTables, StdCtrls, ADODB;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Edit1: TEdit;
    ADOTable1: TADOTable;
    procedure DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
      Field: TField; State: TGridDrawState);
    procedure Edit1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
var i:integer;s:string;  r:TRect;
begin
  with DBGrid1.Canvas do begin
   r:=Rect;
   FillRect(r);
   i:=pos(Edit1.Text,Field.AsString);
   if i<>0 then begin
    s:=copy(Field.AsString,1,i-1);
     TextOut(r.Left,r.Top,s);
     r.Left:=r.Left+TextWidth(s);
    Brush.Color:=clRed;
    s:=Edit1.Text;
     TextOut(r.Left,r.Top,s);
     r.Left:=r.Left+TextWidth(s);
    Brush.Color:=clWhite;
    s:=copy(Field.AsString,i+length(Edit1.Text),length(Field.AsString));
     TextOut(r.Left,r.Top,s);
   end else begin
     TextOut(r.Left,r.Top,Field.AsString);
   end;
  end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
 DBGrid1.Repaint;
end;

end.
Смысл пояснить?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.10.2010, 14:41   #3
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Stilet, большое спасибо. Смысл понятен.
Я забыл, что существует TextWidth();
Работает отлично.

В догонку...
Stilet, может есть мысль как подсветить без учета регистра?
Вообще, было бы супер-пупер...

Последний раз редактировалось Stilet; 13.10.2010 в 15:15.
_SERGEYX_ вне форума Ответить с цитированием
Старый 13.10.2010, 15:14   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
i:=pos(AnsiLowerCase(Edit1.Text),AnsiLowerCase(Field.AsString));
Однако могу сказать что AnsiLowerCase(Edit1.Text) стоит сделать только один раз перед перерисовкой, например в OnChange, при этом можно перекинуть в какую нить глобальную переменку с в методе отрисовки с ней работать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.10.2010, 15:17   #5
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Точно. Еще раз спасибо.

Вот такой получился код (может кому интересно)
Таблица - mem
Поле - Detail_name
Edit для поиска - eFind

Код:
procedure TfrmMain.GridDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumnEh;
  State: TGridDrawState);
var i, tmpPos: integer;
  s, e, f2: string;
  r: TRect;
begin
  if DataCol = 2 then
  begin
    with Grid.Canvas do
    begin
      r := Rect;
      FillRect(r);
      e := AnsiUpperCase(eFind.Text);
      f2 := AnsiUpperCase(MemDetail_name.Text);
      i := pos(e, f2);
      if i <> 0 then
      begin
        s := copy(MemDetail_name.Text, 1, i - 1);
        Font.Color := clBlack;
        Font.Style := [];
        TextOut(r.Left, r.Top, s);
        r.Left := r.Left + TextWidth(s);
        Brush.Color := $00CCFFFF;
        tmpPos := Pos(e, f2);
        s := Copy(MemDetail_name.Text, tmpPos, Length(e));
        Font.Color := clMaroon;
        Font.Style := [fsBold];
        TextOut(r.Left, r.Top, s);
        r.Left := r.Left + TextWidth(s);
        Brush.Color := clWhite;
        s := copy(MemDetail_name.Text, i + length(e), length(f2));
        Font.Color := clBlack;
        Font.Style := [];
        TextOut(r.Left, r.Top, s);
      end else
      begin
        TextOut(r.Left, r.Top, MemDetail_name.Text);
      end;
    end;
  end;
end;

Последний раз редактировалось _SERGEYX_; 13.10.2010 в 16:56.
_SERGEYX_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отформатировать часть текста в ячейке eto Microsoft Office Excel 9 03.04.2016 19:33
Сдвинуть выделенную часть текста вначале на n знаков Zirat Microsoft Office Word 2 17.05.2010 19:12
Загрузить часть текста в TMemo Qami Работа с сетью в Delphi 4 09.03.2010 00:52
Как выделить часть текста в TEdit? Crazy_Gamer Помощь студентам 3 12.12.2009 19:53
как из одной BDgrid скопировать выделенное поле в другую BDgrid Шурик БД в Delphi 7 03.05.2007 14:24