Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.04.24;
Скачать: CL | DM;

Вниз

Добавление разноцветной форматированной строки в RichEdit   Найти похожие ветки 

 
azl   (2011-01-16 15:12) [0]

Здравствуйте, уважаемые Мастера.
Подскажите, пожалуйста, каким образом можно добавить строку в RichEdit, чтобы у нее были некоторые слова разного цвета, некоторые выделены жирным?
Например:

Это разноцветная форматированная строка в RichEdit.

Слово "разноцветная" - красного цвета, слово "форматированная" - зеленого цвета, а "RichEdit" - синего.
"форматированная строка" - выделено жирным.

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

Работаю в Delphi XE.

Заранее спасибо.


 
Palladin ©   (2011-01-16 15:44) [1]

http://tinyurl.com/46j5hjq

интересно, каким образом целые строки отличаются от части текста


 
azl   (2011-01-16 21:25) [2]

А то я бы сам не догадался ввести в гугл? Искал, долго искал. Ничего толкового там нет.
Было бы, я бы не стал здесь писать.
Есть ссылка на конкретный пример, покажите, а ссылки на гугл и я могу давать.


 
Palladin ©   (2011-01-16 21:30) [3]

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

и все же... как же ты так хитро строчки то добавляешь с разным форматированием? средства, предоставляемые объктом, не работают со строками, они работают с частью текста... примеры есть как раз в первой десятке...


 
azl   (2011-01-16 21:50) [4]

Не надо умничать, пожалуйста. Вот возьми хоть один и попробуй. Я перепробовал все. Как ты определил, что работает, если не захотел в дерьме рыться и алмазики выискивать?

Единственный толковый ответ здесь, на похожий вопрос:
http://forum.sources.ru/index.php?s=9b03753932c9b6d580ef12b3d4ed1c43&showtopic=280274

Правда, там для Си. Но в переводе на Delphi не работает.

RichEdit1.Clear;
     
RichEdit1.SelAttributes.Color := clBlue;
RichEdit1.SelText := "Главный Герой:) ";
RichEdit1.SelAttributes.Color := clBlack;
RichEdit1.SelText := "стрельнул вправо в ";
RichEdit1.SelAttributes.Color := clRed;
RichEdit1.SelText := "Монстр1";
RichEdit1.SelAttributes.Color := clBlack;
RichEdit1.SelText := ", который отошел влево, и промахнулся";
//и т.д.


Выводится ", который отошел влево, и промахнулся" без всякого форматирования.


 
Leonid Troyanovsky ©   (2011-01-16 21:50) [5]


> azl   (16.01.11 21:25) [2]

> Было бы, я бы не стал здесь писать.

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/828f6f7876add59c

--
Regards, LVT.


 
Palladin ©   (2011-01-16 21:59) [6]


> azl   (16.01.11 21:50) [4]

Если у тебя не проблемы с головой, то с мышлением проблемы точно. Этож надо... присваивать SelText значение и думать что все эти значения в тексте будут в Selection... читаем до просветления

Read SelText to determine the value of the selected text. Set SelText to replace the selected text with a new string. If there is no selection, but the edit control has focus, set SelText to insert a new string into the text at the cursor.

а вот пример на основе ПЕРВОЙ ДЕСЯТКИ РЕЗУЛЬТАТОВ ПОИСКА В ГУГЛЕ !!!111 адин адин адин

procedure RESetTextColor(p_theRE: TRichEdit; p_nColor: TColor;
 p_nFrom, p_nTo: Integer);
var
 n: Integer;
begin
 n := p_theRE.SelStart;
 p_theRE.SelStart := p_nFrom;
 p_theRE.SelLength := abs(p_nFrom - p_nTo) + 1;
 p_theRE.SelAttributes.Color := p_nColor;
 p_theRE.SelStart := n;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 RichEdit1.Text := "Мама мыла раму"#13#10"в раму мама чегото";
 RESetTextColor(RichEdit1, clBlue, 1, 4);
end;


 
azl   (2011-01-16 22:04) [7]

У меня с головой проблем нет, я привел пример, который был выложен на одном из форумов.

За пример, спасибо.


 
Palladin ©   (2011-01-16 22:17) [8]

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


 
azl   (2011-01-16 22:24) [9]

Кстати, вышеуказанные пример не совсем подходит. Он наглядно демонстрирует, что можно раскрасить текст с определенной позиции и указать сколько символов.
А если до этого в RichEdit было уже много текста и добавляемый текст может отличаться? Например:

бла-бла-бла
бла-бла-бла
Андрей, Вы успешно выполнили задание.

Вместо Андрея может быть Александр и т.д.


 
Palladin ©   (2011-01-16 22:30) [10]

о господи... ну уж местоположение слов в тексте сам научись искать...
ппц, скоро коллапс наступит...


 
azl   (2011-01-17 00:08) [11]

Эх, что за манера общаться? Был бы ты в техподдержке какой-либо, вышвырнули бы в 2 счета.
Баба не дала, что ли?
Не хочешь отвечать, не отвечай. Нахрена кому нужны твои недовольные высказывания? Не зря ведь написал в соответствующем форуме.


 
azl   (2011-01-17 00:20) [12]


> средства, предоставляемые объктом, не работают со строками

Ага, а как же Lines.Add? Уж не добавить ли новую строку?


 
Servy ©   (2011-01-17 00:50) [13]


> Был бы ты в техподдержке какой-либо, вышвырнули бы в 2 счета.

Был бы в техподдержке, ему б зарплату за это платили. А нахаляву правило "клиент всегда прав" не работает :).


> Он наглядно демонстрирует, что можно раскрасить текст с
> определенной позиции и указать сколько символов.
> А если до этого в RichEdit было уже много текста и добавляемый
> текст может отличаться?

Вам даны все карты в руки. Можно узнать и общее количество текста в RichEdit, и строка "Андрей"/"Александр" тоже у вас очевидно где-то хранится, а значит вы можете узнать ее длину. Решений множество, но придется что-то написать самому, скопипастить все с форумов не выйдет, такие дела.


 
Palladin ©   (2011-01-17 01:06) [14]


> azl   (17.01.11 00:20) [12]


> Ага, а как же Lines.Add?

все таки у тебя проблемы с головой...
найми программиста


 
Германн ©   (2011-01-17 01:23) [15]


> azl   (17.01.11 00:20) [12]
>
>
> > средства, предоставляемые объктом, не работают со строками
>
> Ага, а как же Lines.Add? Уж не добавить ли новую строку?
>
>

Не парься. Нет способов добавить в РичЭдит заранее отформатированную строку. Либо добавляй строку "кусками" (каждый кусок со своим цветом). Либо форматируй строку/строки после добавления.


> Эх, что за манера общаться? Был бы ты в техподдержке какой-
> либо, вышвырнули бы в 2 счета.

Эх, что за вопросы? Обратился бы ты ко мне в техподдержку, я бы тебе сказал...
Не надо упоминать тут про техподдержку. Тут многие её знают не понаслышке!
:)


 
KilkennyCat ©   (2011-01-17 02:16) [16]


> Правда, там для Си. Но в переводе на Delphi не работает.

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


 
Германн ©   (2011-01-17 02:34) [17]


> KilkennyCat ©   (17.01.11 02:16) [16]
>
>
> > Правда, там для Си. Но в переводе на Delphi не работает.
>

А там и для Си нет того когда, который алчет автор-троешник.


 
Leonid Troyanovsky ©   (2011-01-17 03:35) [18]


> Германн ©   (17.01.11 01:23) [15]

> Не парься. Нет способов добавить в РичЭдит заранее отформатированную
> строку.

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/c4a1742be94427c7

See also:
http://bellsouthpwp2.net/r/e/rediv/Yacs.html

--
Regards, LVT.


 
Германн ©   (2011-01-17 05:22) [19]


> Leonid Troyanovsky ©   (17.01.11 03:35) [18]
>
>
> > Германн ©   (17.01.11 01:23) [15]
>
> > Не парься. Нет способов добавить в РичЭдит заранее отформатированную
> > строку.
>
> http://groups.google.com/group/fido7.ru.delphi.chainik/msg/c4a1742be94427c7
>

Это не ко мне, Леонид.
Это к ТС, если он поймёт.
Но всё равно спасибо за ссылку. Может когда и пригодится.


 
azl   (2011-01-17 09:56) [20]


> все таки у тебя проблемы с головой...

Проблемы, видимо, у тебя, это я уже понял. Геморрой, может, мучат, покоя не дает?


> KilkennyCat ©   (17.01.11 02:16) [16]

Ну в данном случае особых трудностей нет.


> Германн ©   (17.01.11 01:23) [15]


> Leonid Troyanovsky ©   (17.01.11 03:35) [18]

Спасибо, буду разбираться.


 
azl   (2011-01-18 19:29) [21]

Вот, таки, получилось у меня реализовать поставленную задачу, может, кому-то пригодиться.

Взял за основу пример из JVCL с JvRichEdit. там есть пример мессенджера, он -то мне и помог.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, JvExStdCtrls, JvRichEdit, RxRichEd;

type
 TForm1 = class(TForm)
   Button1: TButton;
   RxRichEdit1: TRxRichEdit;
   procedure Button1Click(Sender: TObject);
   procedure InsertFormatText(Index: Integer; const S: string; const AFont: TFont = nil);
 private
   { Private declarations }
   FHeaderFont: TFont;
 public
   { Public declarations }
   constructor Create(AOwner: TComponent); override;
   procedure AddTextToRichEdit(P: PChar; const ALength: Integer; AFont: TFont);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.InsertFormatText(Index: Integer; const S: string; const AFont: TFont = nil);
var
 ASelStart, ASelLength: Integer;
begin
 if S = "" then
   Exit;
 ASelStart := RxRichEdit1.SelStart;
 ASelLength := RxRichEdit1.SelLength;
 try
   if Index > -1 then
     RxRichEdit1.SelStart := Index;
   RxRichEdit1.SelLength := 0;
   if AFont <> nil then
     RxRichEdit1.SelAttributes.Assign(AFont);
   RxRichEdit1.SelText := S;
 finally
   RxRichEdit1.SelStart := ASelStart;
   RxRichEdit1.SelLength := ASelLength;
 end;
end;

procedure TForm1.AddTextToRichEdit(P: PChar; const ALength: Integer; AFont: TFont);
var
 S: string;
begin
 if ALength < 0 then
   Exit;
 SetString(S, P, ALength);
 InsertFormatText(-1, S, AFont);
 { Move cursor }
 with RxRichEdit1.GetSelection do
   RxRichEdit1.SetSelection(cpMin + ALength, cpMin + ALength, False);
end;

constructor TForm1.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FHeaderFont := TFont.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 RxRichEdit1.SetSelection(MaxInt, MaxInt, False);
 AddTextToRichEdit("Это ", 4, FHeaderFont);

 FHeaderFont.Color := clRed;
 AddTextToRichEdit("разноцветная ", 13, FHeaderFont);

 FHeaderFont.Color := clGreen; FHeaderFont.Style := [fsBold];
 AddTextToRichEdit("форматированная ", 16, FHeaderFont);

 FHeaderFont.Color := clBlack;
 AddTextToRichEdit("строка ", 7, FHeaderFont);

 FHeaderFont.Style := FHeaderFont.Style - [fsBold];
 AddTextToRichEdit("в ", 2, FHeaderFont);

 FHeaderFont.Color := clBlue;
 AddTextToRichEdit("RichEdit", 9, FHeaderFont);

 RxRichEdit1.SetFocus;
end;

end.


 
KilkennyCat ©   (2011-01-18 23:37) [22]


> Взял за основу пример из JVCL с JvRichEdit. там есть пример
> мессенджера, он -то мне и помог.

все это описано в справке. причем очень доступно. нафига какието джедаевские примеры...


> может, кому-то пригодиться.
>

извиняюсь, но только идиоту.
коряво очень.
особенно прикольнуло
"форматированная ", 16

не устал считать буковки?


 
Студент   (2011-01-18 23:47) [23]

RichEdit в делфи устаревший... Импортируйте RichBox из ActiveX... Тогда будет доступ к самим RTF-тегам...
Хотя может и лишнее...)


> Выводится ", который отошел влево, и промахнулся" без всякого
> форматирования.


Ну разумеется... Где ж RichEdit1.SelLength:=0; после каждого SelAttributes?


 
azl   (2011-01-19 17:39) [24]


> коряво очень.

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


> не устал считать буковки?

Я что больной? В редактор вставил и посмотрел.


> Ну разумеется...

Пример, который я привел был проверен на Delphi7, Turbo Delphi и Delphi 2009. Везде работает корректно. На Delphi XE не работает.


 
azl   (2011-01-19 17:47) [25]


> Ну разумеется...

О, чудо. Попробовал еще раз на XE, все работает. )))


 
azl   (2011-01-19 17:51) [26]

Сейчас понял в чем проблема была. Я пробовал проделать это с RxRichEdit.


 
Palladin ©   (2011-01-20 17:48) [27]


> Я что больной? В редактор вставил и посмотрел.

))))))))))



Страницы: 1 вся ветка

Текущий архив: 2011.04.24;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.014 c
15-1292834915
12
2010-12-20 11:48
2011.04.24
Как существует Антиматерия or Где хранить всепрожигающую киcлоту?


11-1233219482
chum
2009-01-29 11:58
2011.04.24
Как перевести проект с 7 на 10.


2-1295358908
Сергей
2011-01-18 16:55
2011.04.24
Как запустить окно (winapi) по клику кнопки?


15-1294650746
Palladin
2011-01-10 12:12
2011.04.24
Автоскролл при нажатии на колесо мыши


15-1294694994
Юрий
2011-01-11 00:29
2011.04.24
С днем рождения ! 11 января 2011 вторник