Как изменить цвет текста делфи

Изменение цвета текста Delphi Решение и ответ на вопрос 124560

8 / 8 / 3

Регистрация: 16.04.2010

Сообщений: 80

1

Изменение цвета текста

02.05.2010, 19:41. Показов 19427. Ответов 34


Здравствуйте! Подскажите, пожалуйста, как можно изменить цвет текста в memo, лишь определенного слова.
Например слово hello, надо чтобы было красного цвета, а все остальные слова оставались прежними.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



1173 / 479 / 83

Регистрация: 04.03.2010

Сообщений: 1,019

02.05.2010, 19:47

2

RichText для этого существует



0



8 / 8 / 3

Регистрация: 16.04.2010

Сообщений: 80

02.05.2010, 21:09

 [ТС]

3

А как это сделать в RichEdit?? Подскажте пожалуйста, очень надо



0



Евгений В

911 / 671 / 133

Регистрация: 01.03.2010

Сообщений: 1,261

02.05.2010, 23:21

4

Tiktak,

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
var
 NamberStart,NamberCount: Integer;
 
begin
RichEdit1.Lines[0]:='Hello World'; {зададим строку в RichEdit1}
 
// NamberStart:=....; номер символа в тексте RichEdit от которого начнутся изменения
                        //(цвета в частности
 // NamberCount:=....; {сколько символов после NamberStart надо изменить}
 
 
 //Изменим цвет Hello в 'Hello World' на красный
  NamberStart:=0;
  NamberCount:=5;
  RichEdit1.SelStart:=NamberStart;
  RichEdit1.SelLength:=NamberCount;
  RichEdit1.SelAttributes.Color:=clRed;
 
{Если будешь работать с текстом, то NamberStart нужно расчитывать как сумму ВСЕХ ранее
идущих символов + по два невидимых символа c каждой строки означающих конец строки
и перевод каретки. }
 
{Например есть текст в три строки
 
аааа ппп      (в этой строке 7 символов, отчет идет с 0 и + 2 невидимых символа. Всего 9)
бббб иии    (здесь тоже 9 символов)
с аааааа
 
для символа 'c', например,  NamberStart будет равен 9+9 := 18;}
 
 
end;
 
 {Так можно изменить цвет выделенного мышкой текста }
procedure TForm1.Button1Click(Sender: TObject);
 
begin
 
  RichEdit1.SelLength:=Length(RichEdit1.SelText);
  RichEdit1.SelAttributes.Color:=clRed;
end;



1



27 / 27 / 3

Регистрация: 17.07.2008

Сообщений: 224

02.05.2010, 23:24

5



1



911 / 671 / 133

Регистрация: 01.03.2010

Сообщений: 1,261

03.05.2010, 00:37

6

Цитата
Сообщение от Konstantin1706
Посмотреть сообщение

По этой ссылке показано как сделать всю строку заданным цветом, а не определенный элемент в ней.



1



8 / 8 / 3

Регистрация: 16.04.2010

Сообщений: 80

03.05.2010, 21:16

 [ТС]

7

Спасибо большое!

Добавлено через 1 час 52 минуты
Последний вопрос, если поможете буду самым счастливым человеком
Как сделать так чтобы изменяло цвет нескольких слов в RichEdit? Например слово Hello у меня встречается два раза, в начале и в середине, как сделать чтобы они обо были крысные.
Извините если я очень назойлив.



0



Евгений В

911 / 671 / 133

Регистрация: 01.03.2010

Сообщений: 1,261

03.05.2010, 21:40

8

Tiktak,
Рассчитай програмно координаты второго слова «Hello» и подставь в

Delphi
1
2
3
4
5
  NamberStart:={здесь нужна координата};
  NamberCount:=5;
  RichEdit1.SelStart:=NamberStart;
  RichEdit1.SelLength:=NamberCount;
  RichEdit1.SelAttributes.Color:=clRed;



1



*~<`PIK`>~*

ﻌﺹ ﺦ ﺖﻀ ﺹ ﻙ ﺵﻔ ﺊ ﺘﺝ

607 / 387 / 81

Регистрация: 15.12.2009

Сообщений: 753

03.05.2010, 23:16

9

Для этого очень удобно использовать функцию PosEx из модуля StrUtils. Она делает поиск заданной подстроки в строке начиная с позиции указанной в 3 параметре. Твое задание:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.Button1Click(Sender: TObject);
var i,n:integer;
    s:string;
begin
n:=1;
s:='Hello';
For i:=1 to Length(RichEdit1.Text) do
begin
RichEdit1.SelStart:=PosEx(s, RichEdit1.Text, n)-1;
RichEdit1.SelLength:=Length(s);
RichEdit1.SelAttributes.Color:=clRed;
n:=PosEx(s, RichEdit1.Text, n)+Length(s)+1;
end;
end;



2



Евгений В

911 / 671 / 133

Регистрация: 01.03.2010

Сообщений: 1,261

04.05.2010, 00:27

10

Хороший вариант. Только лучше цикл сделать через while.
Иначе если в тексте, например,1000 символов, то и слово Hello будет окрашиваться 1000 раз.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.Button1Click(Sender: TObject);
var i,n,k:integer;
    s:string;
begin
k:=0;
n:=1;
s:='Hello';
while n>k do
begin
k:=n;
RichEdit1.SelStart:=PosEx(s, RichEdit1.Text, n)-1;
RichEdit1.SelLength:=Length(s);
RichEdit1.SelAttributes.Color:=clRed;
n:=PosEx(s, RichEdit1.Text, n)+Length(s)+1;
 
end;
end;



3



8 / 8 / 3

Регистрация: 16.04.2010

Сообщений: 80

04.05.2010, 20:27

 [ТС]

11

Спасибо вам огромное!



0



8 / 8 / 3

Регистрация: 16.04.2010

Сообщений: 80

08.05.2010, 18:36

 [ТС]

12

Может я надоел, но вот возник такой вопрос, richedit вместе с текстом сохраняет какие-то свои символы, они не видны если открывать через rtf редакторы, но если допустим через блокнот, то можно увидеть в начале строки подобное:

Код

{rtf1ansideff0{fonttbl{f0fnil MS Sans Serif;}}
viewkind4uc1pardlang1049f0fs16

И на каждой новой строке такое:

Можно ли как-нибудь от этого избавиться?

Добавлено через 12 минут
Сори, уже разобрался! Переставил значение PlainText на True



0



911 / 671 / 133

Регистрация: 01.03.2010

Сообщений: 1,261

08.05.2010, 18:40

13

Цитата
Сообщение от Tiktak
Посмотреть сообщение

richedit вместе с текстом сохраняет какие-то свои символы,

Это данные для RichEdit о шрифте, цвете, размере, переводе строки и т.п.
Это так, к слову



1



8 / 8 / 3

Регистрация: 16.04.2010

Сообщений: 80

09.05.2010, 17:50

 [ТС]

14

Последний раз беспокою вас по этой теме
Я поставил чтобы слово меняло цвет после нажатия на кнопку пробел

Код

while n>k do
begin
k:=n;
RichEdit1.SelStart:=PosEx('hello', RichEdit1.Text, n)-1;
RichEdit1.SelLength:=Length('hello');
RichEdit1.SelAttributes.Color:=clRed;
n:=PosEx('hello', RichEdit1.Text, n)+Length('hello')+1;
end;
end;

И теперь где бы я не нажал пробел, курсор перемещается в конец richEdit`а, как сделать чтобы курсор был там где должен быть +1 символ, ну т.е. как при обычном наборе текста.



0



Евгений В

911 / 671 / 133

Регистрация: 01.03.2010

Сообщений: 1,261

09.05.2010, 21:17

15

Tiktak,
Так попробуй:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char);
Var
PosText: Integer;
begin
 
if Key := ' ' then
  begin
    PosText:=RichEdit1.SelStart;
 
    //Поиск слов и изменение цвета
    //.....
 
    RichEdit1.SelStart:=PosText;
  end;
end;

Добавлено через 13 минут

Delphi
1
if Key = ' ' then

конечно.



1



ﻌﺹ ﺦ ﺖﻀ ﺹ ﻙ ﺵﻔ ﺊ ﺘﺝ

607 / 387 / 81

Регистрация: 15.12.2009

Сообщений: 753

09.05.2010, 22:34

16

Евгений В, оно то так можно если ты хочешь сделать прокрутку в начало текста, но насколько я понял, то Tiktak хочет сделать типо как в ворде нажал пробел и тебе неправильное слово подчеркнуло(но ты можешь продолжать ввод там где ты остановился!!!!!) а с помощью твоего кода этого не получится.



1



Евгений В

911 / 671 / 133

Регистрация: 01.03.2010

Сообщений: 1,261

09.05.2010, 23:32

17

*~<`PIK`>~*,
Ты не прав

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char);
Var
PosText: Integer;
 i,n,k:integer;
    s:string ;
begin
 
 
if Key = ' ' then
  begin
    PosText:=RichEdit1.SelStart;
 
k:=0;
n:=1;
s:='Hello';
while n>k do
begin
k:=n;
RichEdit1.SelStart:=PosEx(s, RichEdit1.Text, n)-1;
RichEdit1.SelLength:=Length(s);
RichEdit1.SelAttributes.Color:=clRed;
n:=PosEx(s, RichEdit1.Text, n)+Length(s)+1;
 
    RichEdit1.SelStart:=PosText;
  end;
end;
end;

После нажатия пробела, все слова «Hello» в RichEdit станут красными, а курсор сместится на +1



1



*~<`PIK`>~*

ﻌﺹ ﺦ ﺖﻀ ﺹ ﻙ ﺵﻔ ﺊ ﺘﺝ

607 / 387 / 81

Регистрация: 15.12.2009

Сообщений: 753

10.05.2010, 12:58

18

хммм)точно)я вроде проверял не получалось)НО!!!!! есть 1 недоработка!!когда написал слово Hello, сразу после него нажал пробел, то все последующие символы будут красными!

Добавлено через 3 минуты
Попробуй после этой стоки

Delphi
1
n:=PosEx(s, RichEdit1.Text, n)+Length(s)+1;

вставь это

Delphi
1
2
3
RichEdit1.SelStart:=RichEdit1.SelStart+RichEdit1.SelLength;
RichEdit1.SelLength:=1;
RichEdit1.SelAttributes.Color:=clBlack;



2



911 / 671 / 133

Регистрация: 01.03.2010

Сообщений: 1,261

10.05.2010, 13:57

19

*~<`PIK`>~*,
Это да. Если пробел сделать именно после слова «Hello» , то весь последующий ввод символов после этого слова будет красным.
Дельное замечание. Но, я думаю, автору в этом задании еще много чего придется додумывать.
Это нормально.



1



8 / 8 / 3

Регистрация: 16.04.2010

Сообщений: 80

10.05.2010, 19:56

 [ТС]

20

Спасибо вам=) Вы лучшие)



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

10.05.2010, 19:56

20

    unit DefEdit;

    interface

    uses

      SysUtils, Classes, Controls, StdCtrls, Graphics, Messages, JvStrUtils;

    type

      TDefEdit = class(TEdit)

      private

        FDefaultText: string;

        FColorDefaultText: TColor;

        FColorUserText: TColor;

        procedure SetDefText(aText: string);

        procedure SetDefColor(aColor: TColor);

        procedure Loaded(); override;

        procedure SetTextColor();

        { Private declarations }

      protected

        { Protected declarations }

      public

        procedure CMEnter(var Message: TCMEnter); message CM_ENTER;

        procedure CMExit(var Message: TCMExit); message CM_EXIT;

        procedure CMChanged(var Message: TMessage); message CM_CHANGED;

        constructor Create(aOwner: TComponent); override;

        { Public declarations }

      published

        property DefaultText: string read FDefaultText write SetDefText;

        property ColorDefaultText: TColor read FColorDefaultText write SetDefColor;

        property ColorUserText: TColor read FColorUserText write FColorUserText;

        { Published declarations }

      end;

    procedure Register;

    implementation

    procedure Register;

    begin

      RegisterComponents(‘My’, [TDefEdit]);

    end;

    { TDefEdit }

    procedure TDefEdit.CMChanged(var Message: TMessage);

    begin

      inherited;

      SetTextColor();

    end;

    procedure TDefEdit.CMEnter(var Message: TCMEnter);

    begin

      if Text = DefaultText then Text := »;

      inherited;

    end;

    procedure TDefEdit.CMExit(var Message: TCMExit);

    begin

      if IsEmptyStr(Text,[‘ ‘]) then Text := DefaultText;

      SetTextColor();

      inherited;

    end;

    constructor TDefEdit.Create(aOwner: TComponent);

    begin

      inherited;

      ColorDefaultText := clSilver;

      ColorUserText := clBlack;

    end;

    procedure TDefEdit.Loaded;

    begin

      inherited;

      if IsEmptyStr(Text,[‘ ‘]) then DefaultText := ‘Enter your text here’;

    end;

    procedure TDefEdit.SetDefColor(aColor: TColor);

    begin

      FColorDefaultText := aColor;

      Font.Color := aColor;

      SetTextColor();

    end;

    procedure TDefEdit.SetDefText(aText: string);

    begin

      FDefaultText := aText;

      if IsEmptyStr(Text,[‘ ‘]) then Text := aText;

    end;

    procedure TDefEdit.SetTextColor;

    begin

      if Text = DefaultText

        then Font.Color := ColorDefaultText

          else Font.Color := ColorUserText;

    end;

    end.

Как можно изменить цвет текста в Edit’е?
Решить данную проблему пробовал как с использованием диалоговой панели «Цвет», так и с использованием диалогового окна «Шрифт»:

Код:

Var lf:LOGFONT;
     hParentDC:HDC;
     Font:HFONT;
     CF:TCHOOSEFONT;
     acrCustClr:array[0..15] of COLORREF;
     …
function WndProc(wnd:HWND; msg, wParam, lPapram:longint):longint; stdcall;
begin
result:=DefWindowProc(wnd, msg, wParam, lParam);
case msg of
WM_CREATE: begin
           hParentDC:=GetDC(Edit);
           lf.lfHeight:= -MulDiv( 10, GetDeviceCaps(hParentDC,LOGPIXELSY), 72);
           lf.lfWidth:= 0;
           lf.lfEscapement:= 0;
           lf.lfOrientation:=0;
           lf.lfWeight:= FW_NORMAL;
           lf.lfItalic:= 0;
           lf.lfUnderline:= 0;
           lf.lfStrikeOut:= 0;
           lf.lfCharSet:= ANSI_CHARSET;
           lf.lfOutPrecision:= OUT_TT_PRECIS;
           lf.lfClipPrecision:= CLIP_DEFAULT_PRECIS;
           lf.lfQuality:= DEFAULT_QUALITY;
           lf.lfPitchAndFamily:= DEFAULT_PITCH or FF_DONTCARE;
           lf.lfFaceName:=’Arial’;
           Font:=CreateFontIndirect(lf);
           Edit:=CreateWindowEx(0,’Edit’,»,WS_CHILD or WS_VISIBLE or ES_MULTILINE or
                                ES_AUTOVSCROLL or WS_VSCROLL, 0, 0, 0, 0, wnd,
                                HMENU(20), hInstance, nil);
           SendMessage(Edit, WM_SETFONT, integer(Font),MakelParam(0,1));
           SetFocus(Edit);

           //Инициализация диалога «Цвет»
           FillChar(CC, SizeOf(TCHOOSECOLOR),0);
           CC.lStructSize:=SizeOf(TCHOOSECOLOR);
           CC.hWndOwner:=wnd;
           CC.hInstance:=hInstance;
           CC.lpCustColors:=@acrCustClr;
           CC.Flags:=CC_FULLOPEN;

           //Инициализация диалога «Шрифт»
           FillChar(CF, SizeOf(TCHOOSEFONT),0);
           CF.lStructSize:=SizeOf(TCHOOSEFONT);
           CF.hWndOwner:=Wnd;
           CF.lpLogFont:=@lf;
           CF.Flags:=CF_SCREENFONTS or CF_EFFECTS;
           CF.hDC:=hParentDC;
           end;
WM_COMMAND: case wParam of
                      118: begin //Использование диалога «Цвет»
                             ChooseColor(CC);
                             CF.rgbColors:=CC.rgbResult;
                             Font:=CreateFontIndirect(CF.lpLogFont^);
                             PrevFont:=SelectObject(hParentDC, Font);
                       SendMessage(Edit, WM_SETFONT, Font, MakelParam(0, 1));
                             SetFocus(Edit);
                             end;
                      119: begin //Использование диалога «Шрифт»
                             ChooseFont(CF);
                             Font:=CreateFontIndirect(CF.lpLogFont^);
                             PrevFont:=SelectObject(hParentDC, Font);
       SendMessage(Edit, WM_SETFONT, integer(PrevFont),MakelParam(0,1));
                             SetFocus(Edit);
                             end;
                      end;
end;
end;

Диалог «Шрифт» изменяет шрифт текста. Цвет текста остаётся без изменений (чёрным). Даже явное задание цвета ни к чему не приведёт:

Код:

CF.rgbColors:=RGB(255, 0, 0);

Также пробовал решить проблему так:

Код:

SetTextColor(hParentDC, CF.rgbColors);

SetTextColor(hParentDC, CC.rgbResult);

Возникают проблемы и при изменении цвета фона Edit’a.
Цвет фона изменяю так:

Код:

function WndProc(wnd:HWND; msg, wParam, lParam:longint):longint; stdcall;
Begin
result:=DefWindowProc(wnd, msg, wParam, lParam);
case msg of
WM_COMMAND: case wParam of
                      …
                      117: begin
                             ChooseColor(CC);
                         SendMessage(Edit, WM_CTLCOLOREDIT, hParentDC, Edit);
                             SetFocus(Edit);
                             end;
                        end;
WM_CTLCOLOREDIT: begin
                             SetBkColor(HDC(wParam), CC.rgbResult);
                             result:=longint(CreateSolidBrush(CC.rgbResult));
                             end;
end;
End;

В этом случае цвет фона Edit’а изменяется, но возникают серьёзные проблемы с прорисовкой всего окна в случае многострочного редактора текста. При этом также следует учесть, что строка

Код:

result:=DefWindowProc(wnd, msg, wParam, lParam)

должна предшествовать обработке сообщений; в противном случае цвет фона не изменяется.

Замечательные возможности DBGrid

Нередко при разработке приложений, использующих табличный вывод данных, требуется отобразить те или иные строки таблиц нестандартным образом, например, с целью привлечения внимания пользователя к этим строкам. В данной статье содержатся некоторые советы, касающиеся нестандартного отображения данных в компоненте TDBGrid.

Как изменить цвет строки в TDBGrid

Предположим, нам требуется изменить атрибуты текста и фона строки в компоненте TDBGrid, если значение какого-либо поля удовлетворяет заранее заданному условию. Для этой цели принято использовать обработчик события OnDrawColumnCell этого компонента. Отметим, что возможности, предоставляемые при его использовании, весьма разнообразны.

Рассмотрим простейшее приложение с TDBGrid, содержащее один компонент TTable, один компонент TDataSource и один компонент TDBGrid: Установим значения их свойств в соответствии с приведенной ниже таблицей:

Компонент

Свойство

Значение

Table1

DatabaseName

TableName

Active

BCDEMOS (или DBDEMOS)

events.db

true

DataSource1

DataSet

Table1

DBGrid1

DataSource

DataSource1

Обычно для перерисовки изображения в ячейках используется метод OnDrawColumnCell.

Его параметр Rect – структура, описывающая занимаемый ячейкой прямоугольник; параметр Column — колонка DBGrid, в которой следует изменить способ рисования изображения. Для вывода текста используется метод TextOut свойства Canvas компонента TDBGrid.

Предположим, нам нужно изменить цвет текста и фона строки в зависимости от значения какого-либо поля (например, VenueNo). Создадим обработчик события OnDrawColumnCell компонента DBGrid1.

В случае Delphi соответствующий код имеет вид:

procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Table1.FieldByName('VenueNo').Value = 1 then
    with DBGrid1.Canvas do
    begin
      Brush.Color := clGreen;
      Font.Color := clWhite;
      FillRect(Rect);
      TectOut(Rect.Left + 2, Rect.Top + 2, Column.Field.Text);
    end;
end;

В результате на этапе выполнения при отображении строк, в которых значение поля VenueNo равно 1, фон ячеек будет окрашен в зеленый цвет, а текст выведен белым цветом.

При выводе выделенных строк все данные в ячейках оказались выровненными по левому краю. Если мы хотим более корректно отобразить выравнивание текста в колонке, следует слегка модифицировать наш код, учитывая значение свойства Alignment текущей (то есть рисуемой в данный момент) колонки:

Соответствующий код для Delphi имеет вид:

procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Table1.FieldByName('VenueNo').Value = 1 then
    with DBGrid1.Canvas do
    begin
      Brush.Color := clGreen;
      Font.Color := clWhite;
      FillRect(Rect);
      if Column.Alignment = taRightJustify then
        TectOut(Rect.Right - 2 - TectWidth(Column.Field.Text),
        Rect.Top+2, Column.Field.Text)
      else
        TectOut(Rect.Left + 2, Rect.Top + 2, Column.Field.Text);
    end;
end;

В этом случае выравнивание текста в колонках совпадает с выравниванием столбцов.

Отметим, что величина смещения (в данном случае два пиксела), вообще говоря, зависит от гарнитуры и размера шрифта, используемого в данной колонке, и должна подбираться индивидуально.

Если необходимо отобразить нестандартным образом не всю строку, а только некоторые ячейки, следует проанализировать имя поля, отображаемого в данной колонке, как в приведенном ниже обработчике событий.

Соответствующий код для Delphi имеет вид:

procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn;  State: TGridDrawState);
begin
  if (Table1.FieldByName('VenueNo').Value = 1) and (Column.FieldName = 'VenueNo') then
    with DBGrid1.Canvas do
    begin
      Brush.Color := clGreen;
      Font.Color := clWhite;
      FillRect(Rect);
      if Column.Alignment = taRightJustify then
        TectOut(Rect.Right - 2 - TectWidth(Column.Field.Text),
        Rect.Top + 2, Column.Field.Text)
      else
        TectOut(Rect.Left + 2, Rect.Top + 2, Column.Field.Text);
    end;
end;

В результате выделенными оказываются только ячейки, для которых выполняются выбранные нами условия:

Как заменить данные в столбце компонента TDBGrid

Нередко в колонке DBGrid нужно вывести не реальное значение, хранящееся в поле соответствующей таблицы, а другие данные, соответствующие имеющимся (например, символьную строку вместо ее числового кода). В этом случае также используется метод TextOut свойства Canvas компонента TDBGrid:

Соответствующий код для Delphi имеет вид:

procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn;  State: TGridDrawState);
begin
  if Column.FieldName = 'VenueNo' then
    with DBGrid1.Canvas do
    begin
      Brush.Color := clWhite;
      FillRect(Rect);
      if Table.FieldByName('VanueNo').Value = 1 then
      begin
        Font.Color := clRed;
        TextOut(Rect.Right - 2 - DBGrid1.Canvas.TextWidth('our vanue'),
        Rect.Top + 2, 'our vanue');
      end
      else
        TextOut(Rect.Right - 2 - DBGrid1.Canvas.TextWidth('other vanue'),
        Rect.Top + 2, 'other vanue');
    end;
end;

Еще один пример – использование значков из шрифтов Windings или Webdings в качестве подставляемой строки.

Соответствующий код для Delphi имеет вид:

procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn;  State: TGridDrawState);
begin
  if Column.FieldName = 'VenueNo' then
    with DBGrid1.Canvas do
    begin
      Brush.Color := clWhite;
      FillRect(Rect);
      Font.name := 'Windings';
      Font.Size := -14;
      if Table.FieldByName('VanueNo').Value = 1 then
      begin
        Font.Color := clRed;
        TextOut(Rect.Right - 2 - DBGrid1.Canvas.TextWidth('J'),
        Rect.Top + 2, 'J');
      end
      else
        TextOut(Rect.Right - 2 - DBGrid1.Canvas.TextWidth('F'),
        Rect.Top + 2, 'F');
    end;
end;

Как поместить графическое изображение в TDBGrid

Использование свойства Canvas компонента TDBGrid в методе OnDrawColumnCell позволяет не только выводить в ячейке текст методом TextOut, но и размещать в ячейках графические изображения. В этом случае используется метод Draw свойства Canvas.

Модифицируем наш пример, добавив в форму компонент TImageList и поместив в него несколько изображений.

Модифицируем код нашего приложения:

Соответствующий код для Delphi имеет вид:

procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn;  State: TGridDrawState);
var
  Im1: TBitmap;
begin
  Im1 := TBitmap.Create;
  if Column.FieldName = 'VenueNo' then
    with DBGrid1.Canvas do
    begin
      Brush.Color := clWhite;
      FillRect(Rect);
      if Table.FieldByName('VanueNo').Value = 1 then
        ImageList1.GetBitmap(0, Im1)
      else
        ImageList1.GetBitmap(2, Im1);
      Draw(round((Rect.Left + Rect.Right - Im1.Width) / 2), Rect.Top, Im1);
    end;
end;

Теперь в TDBGrid в колонке VenueNo находятся графические изображения.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить цвет текста внутри div
  • Как изменить цвет текста unturned
  • Как изменить цвет текста unity
  • Как изменить цвет текста placeholder css
  • Как изменить цвет текста php

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии