Компонент Richmemo

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

Компонент Richmemo

Сообщение ivanov1 » 25.01.2015 22:05:14

Добрый день!
Вот решил поделиться примером реализации блокнота со строками различных цветов.
Для этого использовал компонент 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.


Буду рад любым комментариям, спасибо.
ivanov1
новенький
 
Сообщения: 32
Зарегистрирован: 03.01.2015 16:25:04

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

Сообщение скалогрыз » 25.01.2015 23:38:35

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

в RichMemo package входит такой модуль RichMemoUtils. Если его использовать, то можно реализовать код выше, следующим образом:
Код: Выделить всё
begin
  InsertColorStyledText(rich, 'зелёная строка'+IntToStr(rich.GetTextLen)+#13#10, clGreen, []);
end;

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

Если проблема с параметрами... то какая конкретно ошибка выпадает? и версия Лазаря какая?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение ivanov1 » 26.01.2015 00:43:42

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


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

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


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

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

Добавлено спустя 6 минут 46 секунд:
Есть ли смысл отписывать про ошибку в этой версии, вроде она очень старая.
ivanov1
новенький
 
Сообщения: 32
Зарегистрирован: 03.01.2015 16:25:04

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

Сообщение скалогрыз » 26.01.2015 01:38:04

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
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение ivanov1 » 26.01.2015 04:39:56

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

Код: Выделить всё
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;
ivanov1
новенький
 
Сообщения: 32
Зарегистрирован: 03.01.2015 16:25:04

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

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

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

Кстати, если ты планируешь написать чат-приложение, то рекомендую ознакомится с проектом "inline" в папочке "samples".
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение ivanov1 » 26.01.2015 23:41:48

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

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

Нет, сейчас работаю над другим (выложу, как доделаю (в конце года)). inline заценю. Еще разик Спасибо.
ivanov1
новенький
 
Сообщения: 32
Зарегистрирован: 03.01.2015 16:25:04

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

Сообщение *Rik* » 28.01.2015 08:34:20

Пробовал примеры на Linux, при закрытии программы использующей TRichMemo всё время ошибка выпадает..
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

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

Сообщение скалогрыз » 28.01.2015 17:05:59

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

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

Сборка такая: Ubuntu x64 - Lazarus 1.0.10 - fpc 2.6.2 - RichMemo-trunk (r3900).
Проект собрат для Gtk2.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение *Rik* » 29.01.2015 00:10:02

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;
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

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

Сообщение скалогрыз » 29.01.2015 02:30:45

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

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

Сообщение *Rik* » 29.01.2015 08:46:37

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


richerr.png
richerr.png (14.55 КБ) Просмотров: 35071


http://youtu.be/d6bmjiYTUmo
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

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

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

r3910, ошибка должна быть исправлена.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение *Rik* » 30.01.2015 06:57:56

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

Теперь компилируется, но не запускается.
richerr1.png
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

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

Сообщение скалогрыз » 31.01.2015 03:53:36

r3916
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

След.

Вернуться в Компоненты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru