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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2013, 19:54   #1
noname_06
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 49
Вопрос Вставка текста с форматированием в RichEdit

Браузер на основной форме должен заполнять RichEdit дочерней формы по маске
Цитата:
Дата
Заголовок страницы
URL
Вместо этого или весь текст выводит как синий, подчеркнутый, или применяет форматирование хаотично.
Способ №1:
Код:
procedure TForm1.chrmAddressChange(Sender: TObject; const browser: ICefBrowser;
  const frame: ICefFrame; const url: ustring);
var
  SlStart,SlLen: Integer;
begin
  cbbAdress.Text:= url;
  with frmHistory.redtHistory do
    begin
    Lines.Add(TimeToStr(Now));
    Lines.Add(Form1.Caption);
 
    SlStart:=Length(Text);
    SlLen:=Length(url);
    Lines.Add(url);
    SelStart:=SlStart;
    SelLength:=SlLen;
    SelAttributes.Style:= SelAttributes.Style + [fsUnderline];
    SelAttributes.Color:= clBlue;
    SelStart:= 0;
    SelLength:= 0;
    end;
end;
Способ №2
Код:
procedure TForm1.chrmAddressChange(Sender: TObject; const browser: ICefBrowser;
  const frame: ICefFrame; const url: ustring);
begin
  cbbAdress.Text:= url;
  with frmHistory.redtHistory do
    begin
    Lines.Add(TimeToStr(Now));
    Lines.Add(Form1.Caption);
    Lines.Add(url);
    selstart:=findtext(lines[Lines.Count-1],0,length(text), [stMatchCase]);
    sellength:=length(lines[Lines.Count-1]);
    SelAttributes.Style:= SelAttributes.Style + [fsUnderline];
    SelAttributes.Color:= clBlue;
    SelStart:= 0;
    SelLength:= 0;
    end;
end;

Последний раз редактировалось noname_06; 05.05.2013 в 20:06.
noname_06 вне форума Ответить с цитированием
Старый 05.05.2013, 21:23   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
SlStart:=Length(Text)
наверно вам надо RichEdit.Lines.Text?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.05.2013, 21:34   #3
noname_06
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 49
По умолчанию

Убрал промежуточные переменные, заменил Length(Text) на Length(Lines.Text), все равно выделяет весь текст.
Код:
procedure TForm1.chrmAddressChange(Sender: TObject; const browser: ICefBrowser;
  const frame: ICefFrame; const url: ustring);
begin
  cbbAdress.Text:= url;
  with frmHistory.redtHistory do
    begin
    Lines.Add(TimeToStr(Now));
    Lines.Add(Form1.Caption);

    Lines.Add(url);
    SelStart:=Length(Lines.Text);
    SelLength:=Length(url);
    SelAttributes.Style:= SelAttributes.Style + [fsUnderline];
    SelAttributes.Color:= clBlue;
    SelStart:= 0;
    SelLength:= 0;
    end;
end;
Был еще такой вариант, но тоже выделял, что попало:
Код:
procedure TForm1.ColorLine(Line: Integer);
begin
  with frmHistory.redtHistory do
  begin
    SelStart := SendMessage(Handle, EM_LINEINDEX, Line, 0);
    SelLength := Length(Lines[Line]);
    SelAttributes.Color := clBlue;
    SelAttributes.Style := [fsUnderline];
  end;
end;
 
procedure TForm1.chrmAddressChange(Sender: TObject; const browser: ICefBrowser;
  const frame: ICefFrame; const url: ustring);
begin
  cbbAdress.Text:= url;
  with frmHistory.redtHistory do
    begin
    Lines.Add(TimeToStr(Now));
    Lines.Add(Form1.Caption);
    Lines.Add(url);
    ColorLine(Lines.Count-1);
    end;
end;
Вроде бы элементарно: выделить цветом кусок текста. Примеров - полно, ан нет.

Последний раз редактировалось noname_06; 05.05.2013 в 21:37.
noname_06 вне форума Ответить с цитированием
Старый 05.05.2013, 23:00   #4
hemn6vyr
Пользователь
 
Регистрация: 18.06.2012
Сообщений: 67
По умолчанию

Процедура
Код:
procedure WriteInRichEd(RichEd: TRichEdit; S: string; Color: TColor;
  Style: TFontStyles);
begin
   RichEd.SelStart:=Length(RichEd.Text);
   RichEd.SelAttributes.Color:=Color;
   RichEd.SelAttributes.Style:=Style;
   RichEd.SelText:=S
end;
Вызов
Код:
  WriteInRichEd(RichEdit1, 'Hello, World', clRed, [fsBold]);
  WriteInRichEd(RichEdit1, 'Hello, World', clGreen, [fsBold]);
Работает. Не моя, нашёл в инете. пользовался.
hemn6vyr вне форума Ответить с цитированием
Старый 05.05.2013, 23:53   #5
noname_06
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 49
По умолчанию

Опять же получаю бред
Цитата:
22:46:50
Google
htt p:/ /www.goo gle.com.ua/imghp?hl=uk&tab=wi

22:47:31
Google Drive
htt p:/ /news.goo gle.com.ua/nwshp?hl=uk&tab=inhttp://news.google.com.ua/nwshp?hl=uk&tab=in
22:47:33
Новини Google
htt p:/ /ua.for- ua.com/kiev/2013/05/05/125512.htmlhttp://ua.for-ua.com/kiev/2013/05/05/125512.html

22:47:41

Великодні богослужіння у столиці пройшли спокійно - ForUm
htt p://for- ua.com/video/
Вызываю так:
Код:
procedure TForm1.chrmAddressChange(Sender: TObject; const browser: ICefBrowser;
  const frame: ICefFrame; const url: ustring);
begin
  cbbAdress.Text:= url;
  with frmHistory.redtHistory do
    begin
    Lines.Add(TimeToStr(Now));
    Lines.Add(Form1.Caption);
    Lines.Add(url);
    WriteInRichEd(frmHistory.redtHistory, url, clGreen, [fsBold]);
    end;
end;
Похоже, снова Chromium воду мутит Буду пробовать привязать заполнение History к другому событию.

Последний раз редактировалось noname_06; 05.05.2013 в 23:57.
noname_06 вне форума Ответить с цитированием
Старый 06.05.2013, 00:11   #6
hemn6vyr
Пользователь
 
Регистрация: 18.06.2012
Сообщений: 67
По умолчанию

Цитата:
Сообщение от noname_06 Посмотреть сообщение
Опять же получаю бред

Вызываю так:
Код:
procedure TForm1.chrmAddressChange(Sender: TObject; const browser: ICefBrowser;
  const frame: ICefFrame; const url: ustring);
begin
  cbbAdress.Text:= url;
  with frmHistory.redtHistory do
    begin
    Lines.Add(TimeToStr(Now));
    Lines.Add(Form1.Caption);
    Lines.Add(url);
    WriteInRichEd(frmHistory.redtHistory, url, clGreen, [fsBold]);
    end;
end;
Похоже, снова Chromium воду мутит Буду пробовать привязать заполнение History к другому событию.
Не совсем так.
Примерно так:
Код:

a:tstringlist;
....
a.add('qeqwe'); // строка 0
a.add('safdsf'); // строка 1
a.add('zxcvzxc'); // строка 2
a.add('вапыва'); // строка 3
...
WriteInRichEd(richedit, a[0], clGreen, [fsBold]);//тут сам вписывает с форматированием которое ты указал
WriteInRichEd(richedit, a[1], clblue, [fsBold]);
WriteInRichEd(richedit, a[2], clblack, [fsBold]);
WriteInRichEd(richedit, a[3], clpink, [fsBold]);
....
Эта функция не заменяет тектс, а добавляет его
hemn6vyr вне форума Ответить с цитированием
Старый 06.05.2013, 00:41   #7
noname_06
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 49
По умолчанию

Спасибо за наводку. Теперь работает 50/50, но уже хоть что-то:
Код:
procedure TForm1.chrmAddressChange(Sender: TObject; const browser: ICefBrowser;
  const frame: ICefFrame; const url: ustring);
begin
  cbbAdress.Text:= url;
  with frmHistory.redtHistory do
    begin
    Lines.Add(#13+TimeToStr(Now));
    Lines.Add(Form1.Caption+#13);

    SelStart := GetTextLen;
    SelAttributes.Style:= [fsUnderline];
    SelAttributes.Color:= clBlue;
    SelText:= url;
    SelAttributes.Style:= SelAttributes.Style - [fsUnderline];
    SelAttributes.Color:= clBlack;
    end;
end;
Примерный результат:
Цитата:
22:46:50
Google

htt p:/ /www.goo gle.com.ua/imghp?hl=uk&tab=wi


22:47:31
Google Drive
htt p:/ /news.goo gle.com.ua/nwshp?hl=uk&tab=inhttp://news.google.com.ua/nwshp?hl=uk&tab=in

22:47:33
Новини Google
htt p:/ /ua.for- ua.com/kiev/2013/05/05/125512.htmlhttp://ua.for-ua.com/kiev/2013/05/05/125512.html
Т.е. первый раз добавляет неадекватно (кривое форматирование + лишняя строка) + если добавлять пустую строку между записями любым способом, кроме
Код:
Lines.Add(#13+TimeToStr(Now));
то выделяет весь текст.

Последний раз редактировалось noname_06; 06.05.2013 в 14:04.
noname_06 вне форума Ответить с цитированием
Старый 06.05.2013, 01:02   #8
hemn6vyr
Пользователь
 
Регистрация: 18.06.2012
Сообщений: 67
По умолчанию

Вот, работает нормально, #10 - перенос строки, можно и #13 использовать.
Можешь скинуть код, гляну, попробую поправить.
Код:
Unit Unit1;

Interface

  Uses
    Winapi.Windows,
    Winapi.Messages,
    System.SysUtils,
    System.Variants,
    System.Classes,
    Vcl.Graphics,
    Vcl.Controls,
    Vcl.Forms,
    Vcl.Dialogs,
    Vcl.StdCtrls,
    Vcl.ComCtrls;

  Type
    TForm1 = Class(TForm)
      Button1: TButton;
      RichEdit1: TRichEdit;
      Procedure WriteInRichEd(RichEd: TRichEdit; S: String; Color: TColor = ClWindowText; Style: TFontStyles = []);
      Procedure Button1Click(Sender: TObject);
    Private
    { Private declarations }
    Public
    { Public declarations }
    End;

  Var
    Form1: TForm1;

Implementation

{$R *.dfm}

  Procedure TForm1.Button1Click(Sender: TObject);
    Begin
      WriteInRichEd(RichEdit1, 'qweqweqweqwe' + #10, ClRed, [FsBold]);
      WriteInRichEd(RichEdit1, 'qweqweqweqwe' + #10, ClBlue, [FsBold]);
      WriteInRichEd(RichEdit1, 'qweqweqweqwe' + #10, ClGreen, [FsBold]);
      WriteInRichEd(RichEdit1, 'qweqweqweqwe' + #10, ClYellow, [FsBold]);
      WriteInRichEd(RichEdit1, 'qweqweqweqwe' + #10, ClGray, [FsBold]);
    End;

  Procedure TForm1.WriteInRichEd(RichEd: TRichEdit; S: String; Color: TColor; Style: TFontStyles);
    Begin
      RichEd.SelStart := Length(RichEd.Text);
      RichEd.SelAttributes.Color := Color;
      RichEd.SelAttributes.Style := Style;
      RichEd.SelText := S
    End;

End.
hemn6vyr вне форума Ответить с цитированием
Старый 06.05.2013, 01:14   #9
hemn6vyr
Пользователь
 
Регистрация: 18.06.2012
Сообщений: 67
По умолчанию

Цитата:
procedure TForm1.chrmAddressChange(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const url: ustring);
begin
cbbAdress.Text:= url;
with frmHistory.redtHistory do
begin
Lines.Add(#13+TimeToStr(Now));
Lines.Add(Form1.Caption+#13);

SelStart := GetTextLen;
SelAttributes.Style:= [fsUnderline];
SelAttributes.Color:= clBlue;
SelText:= url;
SelAttributes.Style:= SelAttributes.Style - [fsUnderline];
SelAttributes.Color:= clBlack;
end;
end;
твой код, просто поменянный ричедит и переменная url

Код:
      For I := 0 To 10 Do
        Begin
          With RichEdit1 Do
            Begin
              Lines.Add(TimeToStr(Now));
              Lines.Add(Form1.Caption);
              SelStart := GetTextLen;
              SelAttributes.Style := [FsUnderline];
              SelAttributes.Color := ClBlue;
              SelText := 'qweqweqweqwe' + #10;
              SelAttributes.Style := SelAttributes.Style - [FsUnderline];
              SelAttributes.Color := ClBlack;
            End;
        End;
Изображения
Тип файла: png Безымянный.png (11.3 Кб, 112 просмотров)
hemn6vyr вне форума Ответить с цитированием
Старый 06.05.2013, 01:25   #10
noname_06
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 49
По умолчанию

Спасибо огромное! Наконец домучился с ним, оптимальный вариант (если заполнять RichEdit из процедуры chrmAddressChange, то пишет ересь хаотичную, пришлось-таки полностью пользоваться внешней процедурой):
Цитата:
procedure TForm1.chrmAddressChange(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; const url: ustring);
begin
cbbAdress.Text:= url;
WriteInRichEd(frmHistory.redtHistor y, TimeToStr(Now) + #10, clBlack, []);
WriteInRichEd(frmHistory.redtHistor y, Form1.Caption + #10, clBlack, []);
WriteInRichEd(frmHistory.redtHistor y, url + #10 + #10, clBlue, [fsUnderline]);
end;
*зачем в последнем листинге цикл For I := 0 To 10 Do? (это уже праздный интерес)

Последний раз редактировалось noname_06; 06.05.2013 в 01:59.
noname_06 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в RichEdit сделать строку со сложным форматированием? Freimaks Общие вопросы Delphi 3 20.05.2012 19:53
Вставка скользящёй даты c форматированием valik65 Microsoft Office Excel 4 22.12.2010 20:47
Delphi 7 вставка текста в Richedit в позицию курсора newbee-dust Помощь студентам 3 10.06.2009 12:58
RichEdit вставка форматированного текста и расстояние между строками. Armorer Общие вопросы Delphi 2 30.04.2009 08:16
Вставка текста в RichEdit NoName_emaNoN Компоненты Delphi 4 03.05.2008 12:12