Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Смена цвета слова в Memo


Автор: mr.Anderson 5.9.2005, 20:08
Задача. Юзверь вводит в Memo энный текст. Надо разыскать в этом тексте слово "Variable" и перекрасить его в синий цвет + сделать его жирным шрифтом. Подскажите, как это можно реализовать? Только плиз попроще, попонятней, если можно...

Автор: Snowy 5.9.2005, 20:14
В мемо нельзя.
Используй RichEdit.
Или SysUniHighliter

Автор: mr.Anderson 5.9.2005, 20:39
А там как менять? Приведите плиз пример. На моей задаче.

Автор: FRAGNATIC 5.9.2005, 20:48
sim7
я так понимаю те подсветку синтаксиса надо! то это по любому лучше юзай SynEdit + SysUniHighliter
потому что с ричэдитом оч много гемороя будет и будет это всё оч голимо работать)

Автор: Snowy 5.9.2005, 21:02
Цитата(sim7 @ 5.9.2005, 20:39)
А там как менять? Приведите плиз пример. На моей задаче.

Примеров с ричедитом здесь полно. Просто набери в поиске RichEdit.
Ну и загляни, конечно, в раздел по SysUniHighliter'у.

Автор: ~FoX~ 6.9.2005, 08:26
sim7
C:\Program Files\Borland\Delphi7\Demos\RichEdit\

Автор: mr.Anderson 6.9.2005, 17:02
Порылся я в поиске, ничего не нашел. SunUniHighliter мне не подходит - я хочу сделать своими ручками. Прошу дать мне пример кода (без всяких наворотов, просто перекраска) слова Variable в синий цвет и сделать его жирным! Все, мне больше ничего не надо! Дальше я сам разберусь, надеюсь.

Автор: _hunter 6.9.2005, 17:17
http://forum.vingrad.ru/index.php?showtopic=63101
Добавлено @ 17:18
P.S.
ладно б тема месячной давности была...

Автор: mr.Anderson 6.9.2005, 17:30
Видел я эту тему. Да не разобрался в коде тамошнем... smile

Автор: _hunter 6.9.2005, 17:34
а другого нет smile
Добавлено @ 17:34
+ что именно тебе не понятно?

Автор: mr.Anderson 7.9.2005, 16:06
Сообщение там от Archon7th. Он приводит код, а потом говорит:
Цитата
делает слово begin красным, при размере файла 65кб примерно за 0,5 сек

Ну, я в упор не вижу в энтом коде слова "begin"...
Добавлено @ 16:06
В смысле, не вижу, как оно используется. Непонятно. Зачем-то разбор на символы...

Автор: _hunter 7.9.2005, 16:27
а при чем тут его код?
код WIN32API вполне рабочий...

Автор: Akella 7.9.2005, 16:32
memo2 - TRichEdit

Код

    memo2.Lines.Add('>---ПОЛУЧЕНО СООБЩЕНИЕ ОТ: '+socket.RemoteHost+'---');
    L:=Length(Memo2.Text);
    memo2.SelStart:=Length(Memo2.Text);//начиная с конца текста, т.е. начало выделения
    memo2.SelAttributes.Color:=clRed;//выделяем будущий текст красным
    memo2.Lines.Add('>'+vResText);//добавляем текст
    memo2.SelLength:=L+Length(Memo2.Text);//выделяем текст, т.е. узнаем кол-во символов выделяемого текст
    memo2.Lines.Add('>---КОНЕЦ СООБЩЕНИЯ-------');

Автор: Rennigth 7.9.2005, 16:44
http://forum.vingrad.ru/index.php?showtopic=58277&st=0&#entry464833

Автор: Delphins 7.9.2005, 18:29
Приведу вырезку из MSDN, если хочеш разберайся. ,
Цитата
Coloring an Edit Control
Each time an edit control is about to be painted to the screen, Windows sends the parent window a WM_CTLCOLOR message. The wParam parameter contains the handle to the display context of the edit control, the low-order word of the lParam parameter identifies the edit control, and the high-order word of lParam contains CTLCOLOR_EDIT. The application can set the color or pattern for the edit control by returning a handle to a brush. Brush handles can be obtained by selecting a stock object or by building a brush from a pattern bitmap. The application can also set the text foreground and background colors.

The following code sets the colors for an edit control to white text on a gray background. The colors for other controls use the defaults.

.
.
.
  case WM_CTLCOLOR:
      if ( HIWORD(lParam) == CTLCOLOR_EDIT ) {
        // Set the text background color.
            SetBkColor(wParam, RGB(128,128,128));
        // Set the text foreground color.
            SetTextColor(wParam, RGB(255, 255, 255) );
        // Return the control background brush.
            return GetStockObject(LTGRAY_BRUSH);
                  }
      else
        return GetStockObject(WHITE_BRUSH);
.
.
.

In Windows version 3.0, there is a bug that caused a single-line edit control to be colored incorrectly. Windows would draw the control with the colors and brush from a WM_CTLCOLOR message and then again with the standard colors. Here are two workarounds to this problem:

Create a multiple-line edit control instead of a single-line edit control.
Use the following code instead of the code earlier in this section:
.
.
.
  case WM_CTLCOLOR:
      if ( HIWORD(lParam) == CTLCOLOR_EDIT
        || HIWORD(lParam) == CTLCOLOR_MSGBOX ) {
        // Set the text background color.
            SetBkColor(wParam, RGB(128,128,128));
        // Set the text foreground color.
            SetTextColor(wParam, RGB(255, 255, 255) );
        // Return the control background brush.
            return GetStockObject(LTGRAY_BRUSH);
            }
      else
        return GetStockObject(WHITE_BRUSH);
.
.
.

SetBkColor does not support dithered colors. This is not specific to edit controls, but the application developer needs to be aware of the situation when attempting to color edit controls. Windows uses the closest solid color for background color of a control. Thus both of the following statements produce a gray control background with a 16-color driver:

  SetBkColor(wParam, RGB(64,128,128));
  SetBkColor(wParam, RGB(128,128,128));

With a 256-color driver the first statement creates a gray/green background, and the second statement produces a gray background.


Таким образом в Memo можно сделать слово цветным.

Автор: mr.Anderson 7.9.2005, 18:35
dsergey, ваш код не работает. Компилер ругается на неизвестные идентификаторы socket и vResText.

Автор: _hunter 7.9.2005, 18:43
smile))
само-собой. это просто пример, а не готовое решение...

Автор: mr.Anderson 7.9.2005, 18:49
Я пока не обладаю достаточным уровнем знаний, чтобы самому дописать эти идентификаторы! smile Я даже не знаю, для чего они. Вы мне можете дать готовый код смены цвета конкретного слова?! Даже если подобные темы уже были, напишите еще раз, неужели вам трудно? Напишите код и плиз подробно прокомментируйте, и все будет в порядке! smile

Автор: _hunter 7.9.2005, 19:21
а их и не нужно дописывать...
socket можеш вообще удалить. вместо vResText любой текст...

Автор: mr.Anderson 9.9.2005, 16:20
Цитата(sim7 @ 7.9.2005, 19:49)
Вы мне можете дать готовый код смены цвета конкретного слова?! Даже если подобные темы уже были, напишите еще раз, неужели вам трудно? Напишите код и плиз подробно прокомментируйте

Ну, какие же вы ленивые, не в упрек вам будь сказано!

Автор: _hunter 9.9.2005, 16:27
мы не ленивые. просто ни один программист не любит писать рутинный ( тривиальный ) код.
а тот, что ты просиш -- именно такой.
+ все, что можно было написать, -- уже написанно..

Автор: Akella 12.9.2005, 09:16
А ты не ленивый? Ты даже не попытался разобраться smile

Автор: Akella 12.9.2005, 09:43
Вот тебе пример

Автор: mr.Anderson 18.9.2005, 19:39
Цитата(dsergey @ 12.9.2005, 10:16)
А ты не ленивый?

Да нет. Я ж пытаюсь, но раз не въехал - то что ж тут поделать? Нету у меня учителя хорошего. Да и плохого нет, впрочем...
Проект сейчас гляну.

Автор: FRAGNATIC 18.9.2005, 23:17
sim7
да лан у 99% здесь находяшихся тож учителей небыло) книга лучший учитель)

Автор: Poseidon 19.9.2005, 00:50
Эх, ну чтоб sim7 без Посейдона делал? Что-то лень с меня сегодня сошла smile

Воть:
Код
procedure TForm1.Button1Click(Sender: TObject);
const srch = 'Variable';
var i: integer;
begin
for i:= 1 to Length(RichEdit1.Text)do
if copy(RichEdit1.Text,i,Length(srch)) = srch
then
  begin
  RichEdit1.SelStart:= i-1;
  RichEdit1.SelLength:= Length(srch);
  RichEdit1.SelAttributes.Color:= clBlue;
  RichEdit1.SelAttributes.Style:= [fsBold];
  end;

end;

Добавлено @ 00:54
Только нужно будет потом вернуть значения SelAttributes по умолчению. А то вводить не получится как хотелось бы. Но это я оставил на домашнее задание. Не все же за чужой счет делать. Нужно и самому учится smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)