8 / 8 / 3 Регистрация: 16.04.2010 Сообщений: 80 |
|
1 |
|
Изменение цвета текста02.05.2010, 19:41. Показов 19427. Ответов 34
Здравствуйте! Подскажите, пожалуйста, как можно изменить цвет текста в memo, лишь определенного слова.
__________________
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,
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 |
По этой ссылке показано как сделать всю строку заданным цветом, а не определенный элемент в ней.
1 |
8 / 8 / 3 Регистрация: 16.04.2010 Сообщений: 80 |
|
03.05.2010, 21:16 [ТС] |
7 |
Спасибо большое! Добавлено через 1 час 52 минуты
0 |
Евгений В 911 / 671 / 133 Регистрация: 01.03.2010 Сообщений: 1,261 |
||||
03.05.2010, 21:40 |
8 |
|||
Tiktak,
1 |
*~<`PIK`>~* ﻌﺹ ﺦ ﺖﻀ ﺹ ﻙ ﺵﻔ ﺊ ﺘﺝ 607 / 387 / 81 Регистрация: 15.12.2009 Сообщений: 753 |
||||
03.05.2010, 23:16 |
9 |
|||
Для этого очень удобно использовать функцию PosEx из модуля StrUtils. Она делает поиск заданной подстроки в строке начиная с позиции указанной в 3 параметре. Твое задание:
2 |
Евгений В 911 / 671 / 133 Регистрация: 01.03.2010 Сообщений: 1,261 |
||||
04.05.2010, 00:27 |
10 |
|||
Хороший вариант. Только лучше цикл сделать через while.
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 минут
0 |
911 / 671 / 133 Регистрация: 01.03.2010 Сообщений: 1,261 |
|
08.05.2010, 18:40 |
13 |
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,
Добавлено через 13 минут
конечно.
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`>~*,
После нажатия пробела, все слова «Hello» в RichEdit станут красными, а курсор сместится на +1
1 |
*~<`PIK`>~* ﻌﺹ ﺦ ﺖﻀ ﺹ ﻙ ﺵﻔ ﺊ ﺘﺝ 607 / 387 / 81 Регистрация: 15.12.2009 Сообщений: 753 |
||||||||
10.05.2010, 12:58 |
18 |
|||||||
хммм)точно)я вроде проверял не получалось)НО!!!!! есть 1 недоработка!!когда написал слово Hello, сразу после него нажал пробел, то все последующие символы будут красными! Добавлено через 3 минуты
вставь это
2 |
911 / 671 / 133 Регистрация: 01.03.2010 Сообщений: 1,261 |
|
10.05.2010, 13:57 |
19 |
*~<`PIK`>~*,
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 находятся графические изображения.