Компонент Richmemo

Модератор: Модераторы

ivanov1
новенький
Сообщения: 32
Зарегистрирован: 03.01.2015 15:25:04

Компонент Richmemo

Сообщение ivanov1 »

Добрый день!
Вот решил поделиться примером реализации блокнота со строками различных цветов.
Для этого использовал компонент richmemo http://wiki.freepascal.org/RichMemo

Но когда скачал его по ссылке выше, то при компиляции возникли ошибки в коде (неверное число параметров процедуры и т.п.) поэтому я не стал с этим возится и скачал рабочий пакет здесь http://lazplanet.blogspot.ru/2013/12/create-rich-text-editor-for-yourself.html

Если вы посмотрите блог очень хороший с подробными примерами.

Но далее интереснее - как выделить строку цветом не выделяя её, а просто при добавлений.

Логически было верно так

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  i: integer;
begin
 i:=rich.GetTextLen;
 s:='зеленая строка'+inttostr(i);
 rich.Lines.Add(s);
 rich.SetRangeColor(i+1,length(s),clgreen); //Число знаков до добавления + 1 - это начальная позиция.
end;


Но этот код не работает, поэтому пришлось зделать немного по другому.

Код: Выделить всё

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, RichMemo, Forms, Controls, Graphics, Dialogs,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Rich: TRichMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  i: integer;
begin
 i:=rich.GetTextLen;
 s:='зеленая строка'+inttostr(i);
 rich.SetRangeColor(i,1,clgreen);
 rich.Lines.Add(s);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  s: string;
  i: integer;
begin
 i:=rich.GetTextLen;
 s:='красная строка'+inttostr(i);
 rich.SetRangeColor(i,1,clred);
 rich.Lines.Add(s);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  s: string;
  i: integer;
begin
 i:=rich.GetTextLen;
 s:='обычная строка'+inttostr(i);
 rich.SetRangeColor(i,1,cldefault);
 rich.Lines.Add(s);
end;

end.


Буду рад любым комментариям, спасибо.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Re: Компонент Richmemo

Сообщение скалогрыз »

всё немножко грустнее, чем кажется.
SetRangeColor - ожидает позиции курсора (грубо говоря - № символа), а не номера байтов в UTF8 строке.
При работе с GetTextLength возвращается длинна utf8 строки в байтах.

в RichMemo package входит такой модуль RichMemoUtils. Если его использовать, то можно реализовать код выше, следующим образом:

Код: Выделить всё

begin
  InsertColorStyledText(rich, 'зелёная строка'+IntToStr(rich.GetTextLen)+#13#10, clGreen, []);
end;

но нужно использовать доступен ревизию после r3400 (которая в блоге предлагается). Желательно последнюю.

Если проблема с параметрами... то какая конкретно ошибка выпадает? и версия Лазаря какая?
ivanov1
новенький
Сообщения: 32
Зарегистрирован: 03.01.2015 15:25:04

Re: Компонент Richmemo

Сообщение ivanov1 »

скалогрыз писал(а):всё немножко грустнее, чем кажется.
SetRangeColor - ожидает позиции курсора (грубо говоря - № символа), а не номера байтов в UTF8 строке.
При работе с GetTextLength возвращается длинна utf8 строки в байтах.


А в моем примере позиция курсора всегда в конце строки, я правильно понимаю.

Если проблема с параметрами... то какая конкретно ошибка выпадает? и версия Лазаря какая?


Версия есть в моей подписи, про ошибку посмотрю (перекомпилю) и отпишу.

Добавлено спустя 6 минут 31 секунду:
А где взять последнюю На странице http://sourceforge.net/projects/lazarus-ccr/files/RichMemo Версия 1.0.0 от 2009-06-21

Добавлено спустя 6 минут 46 секунд:
Есть ли смысл отписывать про ошибку в этой версии, вроде она очень старая.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Re: Компонент Richmemo

Сообщение скалогрыз »

ivanov1 писал(а):А где взять последнюю На странице http://sourceforge.net/projects/lazarus-ccr/files/RichMemo Версия 1.0.0 от 2009-06-21

в SVN-е: https://lazarus-ccr.svn.sourceforge.net ... s/richmemo
например так

Код: Выделить всё

svn co  https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/components/richmemo 
ivanov1
новенький
Сообщения: 32
Зарегистрирован: 03.01.2015 15:25:04

Re: Компонент Richmemo

Сообщение ivanov1 »

Спасибо, с репозитория установилось корректно, функция тоже работает!

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  i: integer;
begin
 i:=rich.GetTextLen;
 InsertColorStyledText(rich, 'зелёная строка'+IntToStr(i)+#13#10, clGreen, []);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  s: string;
  i: integer;
begin
 i:=rich.GetTextLen;
 InsertColorStyledText(rich, 'красная строка'+IntToStr(i)+#13#10, clred, []);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  s: string;
  i: integer;
begin
 i:=rich.GetTextLen;
 InsertColorStyledText(rich, 'обычная строка'+IntToStr(i)+#13#10, cldefault, []);
end;
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Re: Компонент Richmemo

Сообщение скалогрыз »

Буду признателен, если напишешь об этом в выше указанном блоге ;) А то люди так и застаряли в r3400 :(

Кстати, если ты планируешь написать чат-приложение, то рекомендую ознакомится с проектом "inline" в папочке "samples".
ivanov1
новенький
Сообщения: 32
Зарегистрирован: 03.01.2015 15:25:04

Re: Компонент Richmemo

Сообщение ivanov1 »

скалогрыз писал(а):Буду признателен, если напишешь об этом в выше указанном блоге ;) А то люди так и застаряли в r3400 :(

ок
Кстати, если ты планируешь написать чат-приложение, то рекомендую ознакомится с проектом "inline" в папочке "samples".

Нет, сейчас работаю над другим (выложу, как доделаю (в конце года)). inline заценю. Еще разик Спасибо.
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Re: Компонент Richmemo

Сообщение *Rik* »

Пробовал примеры на Linux, при закрытии программы использующей TRichMemo всё время ошибка выпадает..
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Re: Компонент Richmemo

Сообщение скалогрыз »

*Rik* писал(а):Пробовал примеры на Linux, при закрытии программы использующей TRichMemo всё время ошибка выпадает..

Пробовал примеры на Linux, при закрытии программы использующей TRichMemo ошибка не выпадает.

Сборка такая: Ubuntu x64 - Lazarus 1.0.10 - fpc 2.6.2 - RichMemo-trunk (r3900).
Проект собрат для Gtk2.
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Re: Компонент Richmemo

Сообщение *Rik* »

ALT Linux Simply x32 fpc 2.6.4 Lazarus 1.2.4
Брал здесь:
svn co https://svn.code.sf.net/p/lazarus-ccr/s ... s/richmemo

Приложение нормально отрабатывает, только если перед закрытием поставить курсор в самое начало, в противном случае закрывается с ошибкой.
ps.
Даже не курсор, а полосу прокрутки надо в начало возвращать...
На данный момент помогло в OnClose формы прописать
RichMemo1.Clear;
Application.ProcessMessages;
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Re: Компонент Richmemo

Сообщение скалогрыз »

не буду юлить вокруг да около, спрошу прямо - текст ошибки какой?
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Re: Компонент Richmemo

Сообщение *Rik* »

скалогрыз писал(а):не буду юлить вокруг да около, спрошу прямо - текст ошибки какой?


richerr.png
richerr.png (14.55 КБ) 68312 просмотров


http://youtu.be/d6bmjiYTUmo
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Re: Компонент Richmemo

Сообщение скалогрыз »

r3910, ошибка должна быть исправлена.
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Re: Компонент Richmemo

Сообщение *Rik* »

скалогрыз писал(а):r3910, ошибка должна быть исправлена.

Теперь компилируется, но не запускается.
richerr1.png
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Re: Компонент Richmemo

Сообщение скалогрыз »

r3916
Ответить