Difference between revisions of "RichMemo/ru"

From Free Pascal wiki
Jump to navigationJump to search
 
(76 intermediate revisions by 4 users not shown)
Line 5: Line 5:
 
'''RichMemo''' - это пакет, который включает компонент для замены компонента Delphi TRichEdit. Он разработан кросс-платформенным способом, поэтому его реализация возможна для следующих платформ: Win32, MacOSX и Linux. Поскольку [[RichMemo/ru#Матрица поддержки платформы| кроссплатформенность]] является основной целью, нативный API RichMemo может быть [[RichMemo/ru#(Delphi) RichEdit-подобный интерфейс|расширен]], чтобы сделать его совместимым с Delphi RichEdit.
 
'''RichMemo''' - это пакет, который включает компонент для замены компонента Delphi TRichEdit. Он разработан кросс-платформенным способом, поэтому его реализация возможна для следующих платформ: Win32, MacOSX и Linux. Поскольку [[RichMemo/ru#Матрица поддержки платформы| кроссплатформенность]] является основной целью, нативный API RichMemo может быть [[RichMemo/ru#(Delphi) RichEdit-подобный интерфейс|расширен]], чтобы сделать его совместимым с Delphi RichEdit.
  
Its main characteristics are
+
Его основными характеристиками являются:
* Text highlight
+
* Подсветка текста
* System based Unicode edit support
+
* Системная поддержка редактирования Юникода
  
Planned: (patches are welcomed)  
+
Планируется: (исправления приветствуются)  
* Adding images into text
+
* Добавление изображений в текст
* Embedding LCL Controls?
+
* Встраивание элементов управления LCL?
  
The download contains the component, an installation package and a demo application, that illustrates the features of the component along with some instrumentation for evaluating the chart on a given system.
+
Загружаемый файл содержит компонент, установочный пакет и демонстрационное приложение, которое иллюстрирует возможности компонента, а также некоторые инструменты для оценки диаграммы в данной системе.
 +
 
 +
Пожалуйста, добавляйте ваши багрепорты/функции на [https://github.com/skalogryz/richmemo/issues Github].
  
Please add your Bugreports/Feature requests in [http://bugs.freepascal.org/set_project.php?project_id=9 Lazarus CCR] project of the Lazarus bug tracker.
 
  
 
__TOC__
 
__TOC__
  
== Licensing ==
+
== Лицензия ==
Author: [[User:Skalogryz|Dmitry 'skalogryz' Boyarintsev]]
+
Автор: [[User:Skalogryz|Дмитрий 'скалогрыз' Бояринцев]]
 +
 
 +
[http://svn.freepascal.org/svn/lazarus/trunk/COPYING.modifiedLGPL modified] [http://svn.freepascal.org/svn/lazarus/trunk/COPYING.LGPL LGPL] (так же, как FPC RTL и Lazarus LCL). Вы можете связаться с автором, если измененный LGPL не работает с вашим проектом лицензирования.
  
[http://svn.freepascal.org/svn/lazarus/trunk/COPYING.modifiedLGPL modified] [http://svn.freepascal.org/svn/lazarus/trunk/COPYING.LGPL LGPL] (same as the FPC RTL and the Lazarus LCL). You can contact the author if the modified LGPL doesn't work with your project licensing.
+
== Загрузка ==
 +
Последняя версия доступна здесь:
 +
https://github.com/skalogryz/richmemo
  
== Download ==
 
The latest trunk is available here:
 
https://sourceforge.net/p/lazarus-ccr/svn/HEAD/tree/components/richmemo
 
  
Trunk snapshot can be downloaded from here:  
+
[[User:Zoltanleo|Прим.перев.]]: Существует также [https://github.com/mrandreastoth/richmemo форк] данного компонента на гитхабе от [https://github.com/mrandreastoth Andreas Toth] aka mrandreastoth.
https://havefunsoft.com/share/richmemo.zip . The snapshot is updated nightly. Review "revision.txt" file within the snapshot to find out about the revision it's currently built of.
 
  
 
== Change Log ==
 
== Change Log ==
Line 35: Line 36:
 
* Version 0.8.0 Jun 2009
 
* Version 0.8.0 Jun 2009
  
== Dependencies / System Requirements ==
+
== Зависимости / Системные требования ==
 
* Lazarus 1.0.0
 
* Lazarus 1.0.0
  
Status: Released.
+
Статус: выпущен.
  
 
== Установка ==
 
== Установка ==
Line 48: Line 49:
  
 
== TRichMemo ==
 
== TRichMemo ==
=== Font Parameters ===
+
=== Параметры шрифта ===
Font parameters are generally represented by TFontParams record.
+
Параметры шрифта обычно представлены записью <tt>TFontParams</tt>.
The type is used to describe '''rich''' attributes of the font. Some attributes goes beyond the scope of TFont class, thus an extra type was necessary. However, most of the TFont related data types are reused (i.e. TFontStyles).
+
Тип используется для описания атрибутов шрифта '''rich'''. Некоторые атрибуты выходят за рамки класса <tt>TFont</tt>, поэтому необходим дополнительный тип. Однако большинство типов данных, связанных с <tt>TFont</tt>, используются повторно (т.е. <tt>TFontStyles</tt>).
* Name - name of the font (family).  
+
* <tt>Name</tt> - название шрифта (семейство).  
* Size - size of the font in points (passing a negative value might produce unexpected results).
+
* <tt>Size</tt> - размер шрифта в пунктах (передача отрицательного значения может привести к неожиданным результатам).
* Color - color of the font.
+
* <tt>Color</tt> - цвет шрифта.
* Style - font styles, including Bold, italic, strike-through, underline.
+
* <tt>Style</tt> - стили шрифта, включая полужирный, курсив, зачеркнутый, подчеркивание.
* HasBkClr - boolean flag, if the text for the should have background color (if true, BkColor field is used, otherwise BkColor is ignored). Transparency is not supported.
+
* <tt>HasBkClr</tt> - логический флаг, если текст для должен иметь цвет фона (если true, поле BkColor используется, в противном случае BkColor игнорируется). Прозрачность не поддерживается.
* BkColor - background (aka highlight) color for the text.
+
* <tt>BkColor</tt> - цвет фона (или подсветка) для текста.
* VScriptPos - vertical adjustment for the text [[Image:richmemo_Subsuper.png|right]].
+
* <tt>VScriptPos</tt> - вертикальная настройка текста [[Image:richmemo_Subsuper.png|right]].
** vpNormal - no special position.
+
** <tt>vpNormal</tt> - нет особой позиции.
** vpSubscript - the text is subscript.  
+
** <tt>vpSubscript</tt> - текст  - нижний индекс.  
** vpSuperscript - the text is superscript.  
+
** <tt>vpSuperscript</tt> - текст - верхний индекс.  
:The actual vertical offset of super/sub scripts depends on OS implementation and currently cannot be controlled.
+
:Фактическое вертикальное смещение индексов верх/низ зависит от реализации ОС и в настоящее время не может контролироваться.
  
You can assign FontParams from TFont structure. For that you'll need to use <tt>GetFontParams(afont: TFont)</tt> function. Note, most of LCL controls have TFont set to "default" values. These are not actual values, but rather an indication that control's default font should be used (similar to crDefault for TColor).  
+
Вы можете присвоить <tt>FontParams</tt> из структуры <tt>TFont</tt>. Для этого вам нужно использовать функцию <tt>GetFontParams(afont: TFont)</tt>. Обратите внимание, что для большинства элементов управления LCL для <tt>TFont</tt> установлены значения по умолчанию. Это не фактические значения, а скорее указание на то, что следует использовать шрифт по умолчанию для элемента управления (аналогично <tt>crDefault</tt> для <tt>TColor</tt>).
  
GetFontParams function resolves "Default" font name and returns the actual font family name.
+
Функция <tt>GetFontParams</tt> разрешает имя шрифта по умолчанию и возвращает фактическое имя семейства шрифтов.
  
== methods ==
+
== Методы ==
 
=== SetTextAttributes ===
 
=== SetTextAttributes ===
<syntaxhighlight>procedure SetTextAttributes(TextStart, TextLen: Integer; AFont: TFont);</syntaxhighlight>
+
<syntaxhighlight lang=pascal>procedure SetTextAttributes(TextStart, TextLen: Integer; AFont: TFont);</syntaxhighlight>
* TextStart : Integer - the first character to be modified
+
* <tt>TextStart : Integer</tt> - первый символ, который будет изменен
* TextLen : Integer - number of characters to be modified
+
* <tt>TextLen : Integer</tt> - количество символов для изменения
* AFont : TFont - a font that should be applied to the part of the text
+
* <tt>AFont : TFont</tt> - шрифт, который должен быть применен к части текста
  
<syntaxhighlight>procedure SetTextAttributes(TextStart, TextLen: Integer; const TextParams: TFontParams);</syntaxhighlight>
+
<syntaxhighlight lang=pascal>procedure SetTextAttributes(TextStart, TextLen: Integer; const TextParams: TFontParams);</syntaxhighlight>
* TextStart : Integer - the first character to be modified
+
* <tt>TextStart : Integer</tt> - первый символ, который будет изменен
* TextLen : Integer - number of characters to be modified
+
* <tt>TextLen : Integer</tt> - количество символов для изменения
* TextParams : TFontParams - font parameters to be set
+
* <tt>TextParams : TFontParams</tt> - параметры шрифта, которые будут установлены
  
SetTextureAttributes methods are changing specified text range style. Font parameters is passed in both methods, by AFont parameter (LCL TFont object) or by TFontParams (declared at RichMemo).
+
Методы <tt>SetTextureAttributes</tt> изменяют указанный стиль текстового диапазона. Параметры шрифта передаются в обоих методах, параметром <tt>AFont</tt> (объект LCL <tt>TFont</tt>) или <tt>TFontParams</tt> (объявлено в RichMemo)
  
Setting text attributes does not change current selection. If it's necessary to modify the style of currently selected text, you should SelStart and SelLength as a text range values:
+
Установка атрибутов текста не меняет текущий выбор. Если необходимо изменить стиль выделенного в данный момент текста, вам следует выбрать <tt>SelStart</tt> и <tt>SelLength</tt> в качестве значений текстового диапазона:
<syntaxhighlight>RichMemo1.SetTextAttributes(RichMemo1.SelStart, RichMemo1.SelLength, FontDialog1.Font);</syntaxhighlight>
+
<syntaxhighlight lang=pascal>RichMemo1.SetTextAttributes(RichMemo1.SelStart, RichMemo1.SelLength, FontDialog1.Font);</syntaxhighlight>
  
 
=== GetTextAttributes ===
 
=== GetTextAttributes ===
<syntaxhighlight>function GetTextAttributes(TextStart: Integer; var TextParams: TFontParams): Boolean; virtual;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>function GetTextAttributes(TextStart: Integer; var TextParams: TFontParams): Boolean; virtual;</syntaxhighlight>
* TextStart : Integer - the character position to be queried for font parameters
+
* <tt>TextStart : Integer</tt> - позиция символа для запроса параметров шрифта
* var TextParams : TFontParams - output value, filled with charachter's font attributes. If the method fails and returns false, record's field values is undefined.
+
* <tt>var TextParams : TFontParams</tt> - выходное значение, заполненное атрибутами символа шрифта. Если метод завершается неудачно и возвращает <tt>false</tt>, значения поля записи будут неопределенными.
  
Fill font params of the character, at TextStart position.  
+
Заполняет параметры шрифта символа в позиции <tt>TextStart</tt>.
Method returns True if textstart is valid character position, and False overwise.
+
Метод возвращает <tt>True</tt>, если <tt>TextStart</tt> является действительной позицией символа, и <tt>False</tt> в противном случае.
  
 
=== GetStyleRange ===
 
=== GetStyleRange ===
<syntaxhighlight>function GetStyleRange(CharPos: Integer; var RangeStart, RangeLen: Integer): Boolean; virtual;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>function GetStyleRange(CharPos: Integer; var RangeStart, RangeLen: Integer): Boolean; virtual;</syntaxhighlight>
 +
 
 +
Возвращает диапазон символов с одинаковыми параметрами шрифта, т.е. все символы в диапазоне имеют одинаковые имя, размер, цвет и стили шрифта.
  
Returns a range of characters that share the same font parameters, i.e. all characters in the range has the same font name, size, color and styles.  
+
* <tt>CharPos : Integer</tt> - символ, который принадлежит диапазону стилей. Позиция не обязательно быть в начале диапазона стилей. Она может быть в середине конца диапазона стилей. Первая позиция символа возвращается параметром <tt>RangeStart</tt>.
 +
* <tt>var RangeStart : Integer</tt> - первый символ в диапазоне
 +
* <tt>var RangeLen : Integer</tt> - количество символов в диапазоне
  
* CharPos : Integer - a character that belongs to the style range. It's not necessary for this position to be at the begining on the style range. It can be in the middle on in the end of the style range. The first character position is returned by RangeStart parameter.
+
Метод возвращает <tt>true</tt> в случае успеха. Метод возвращает <tt>false</tt>, если <tt>CharPos</tt> имеет неправильное значение - больше доступных символов или какая-либо другая ошибка.
* var RangeStart : Integer - the first character in the range
 
* var RangeLen : Integer - number of characthers in the range
 
  
The method returns true if successed. the method returns false, if CharPos is incorrect value - more than available characters or some other error.
 
 
=== CharAtPos ===
 
=== CharAtPos ===
<syntaxhighlight>function CharAtPos(x,y: Integer): Integer; virtual;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>function CharAtPos(x,y: Integer): Integer; virtual;</syntaxhighlight>
  
Returns zero-based character offset (not UTF8 position). Returns -1 if fails.
+
Возвращает смещение символа от нулевой позиции (не позиция UTF8). Возвращает -1 в случае неудачи.
  
* x, y - is a point in the client area of the RichMemo control.
+
* <tt>x, y</tt> - точка в клиентской области элемента управления RichMemo.  
 
   
 
   
The method is aware of scrolling state of the control. Thus two calls to CharAtPos(0,0) might return different values if scroll positions is changed between calls.
+
Метод знает о состоянии прокрутки элемента управления. Таким образом, два вызова <tt>CharAtPos(0,0)</tt> могут возвращать разные значения, если между вызовами изменяется позиция прокрутки.
See "examples/hittest" for the sample of usage.
+
Смотрите "examples/hittest" для [получения] примера использования.
  
If specified x,y would be out of the content of RichMemo the return value is undefined. It is left up to widgetset to either return -1 or closes character available.
+
Если указанные <tt>x,y</tt> будут вне содержимого RichMemo, возвращаемое значение [будет] неопределенным. [Поведение] остается [на усмотрение] набора виджетов, который либо возвращает -1, либо закрывает доступный символ.
  
 
=== SetRangeColor ===
 
=== SetRangeColor ===
  
<syntaxhighlight>procedure SetRangeColor(TextStart, TextLength: Integer; FontColor: TColor);</syntaxhighlight>
+
<syntaxhighlight lang=pascal>procedure SetRangeColor(TextStart, TextLength: Integer; FontColor: TColor);</syntaxhighlight>
  
The method sets color of characters in the specified range to the FontColor. Other font  parameters (name, size, styles) are left unchanged.  
+
Метод устанавливает цвет символов в указанном диапазоне для FontColor. Другие параметры шрифта (имя, размер, стили) остаются без изменений.
  
* TextStart: Integer - the first character in the range
+
* <tt>TextStart: Integer</tt> - первый символ в диапазоне
* TextLength: Integer - number of characters in the range
+
* <tt>TextLength: Integer</tt> - количество символов в диапазоне
* FontColor: TColor - color that should be set
+
* <tt>FontColor: TColor</tt> - цвет, который должен быть установлен
  
 
=== SetRangeParams ===
 
=== SetRangeParams ===
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
     procedure SetRangeParams(TextStart, TextLength: Integer; ModifyMask: TTextModifyMask;
 
     procedure SetRangeParams(TextStart, TextLength: Integer; ModifyMask: TTextModifyMask;
 
       const fnt: TFontParams; AddFontStyle, RemoveFontStyle: TFontStyles); overload;
 
       const fnt: TFontParams; AddFontStyle, RemoveFontStyle: TFontStyles); overload;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
The method changes font parameters in the specified range.
+
Метод изменяет параметры шрифта в указанном диапазоне.
* TextStart - the first character in the range
+
* <tt>TextStart</tt> - первый символ в диапазоне
* TextLength - number of characters in the range
+
* <tt>TextLength</tt> - количество символов в диапазоне
* ModifyMask - shows what exact font attributes must be updated The mask accepts any combination of the following values:
+
* <tt>ModifyMask</tt> - показывает, какие именно атрибуты шрифта должны быть обновлены. Маска принимает любую комбинацию из следующих значений:
** tmm_Color - font color would be modified (fnt.Color field must be populated)
+
** <tt>tmm_Color</tt> - Цвет шрифта будет изменен (поле <tt>fnt.Color</tt> должно быть заполнено)
** tmm_Name - font name would be modified (fnt.Name field must be populated)
+
** <tt>tmm_Name</tt> - имя шрифта будет изменено (поле <tt>fnt.Name</tt> должно быть заполнено)
** tmm_Size - font size would be modified (fnt.Size field must be populated)
+
** <tt>tmm_Size</tt> - размер шрифта будет изменен (поле <tt>fnt.Size</tt> должно быть заполнено)
** tmm_Styles - font styles would be modified as specified by AddFontStyle, RemoveFontStyle parameters 
+
** <tt>tmm_Styles</tt> - стили шрифта будут изменены в соответствии с параметрами <tt>AddFontStyle, RemoveFontStyle</tt>
** tmm_BackColor - text highlight (background) color would be modified. (fnt.HasBkClr and fnt.BkColor fields must be populated )
+
** <tt>tmm_BackColor</tt> - Цвет подсветки текста (фона) будет изменен. (поля <tt>fnt.HasBkClr</tt> и <tt>fnt.BkColor</tt> должны быть заполнены)
** Sending an empty mask will cause the method to return without making any changes.
+
** Отправка пустой маски приведет к возврату метода без внесения каких-либо изменений.
* fnt - font parameters that are going to be used, depending on the ModifyMask values.
+
* <tt>fnt</tt> - Параметры шрифта, которые будут использоваться, в зависимости от значений <tt>ModifyMask</tt>.
* AddFontStyle - set of styles that should be applied to the range (used only if tmm_Styles in ModifyMask, otherwise ignored)
+
* <tt>AddFontStyle</tt> - набор стилей, которые должны применяться к диапазону (используется только если <tt>tmm_Style</tt>s в <tt>ModifyMask</tt>, в противном случае игнорируется)
* RemoveFontStyle - set of font style should should be removed from the range (used only if tmm_Styles in ModifyMask, otherwise ignored)
+
* <tt>RemoveFontStyle</tt> - набор стилей шрифта должен быть удален из диапазона (используется только если <tt>tmm_Styles</tt> в <tt>ModifyMask</tt>, в противном случае игнорируется)
 +
 
  
<syntaxhighlight>procedure SetRangeParams(TextStart, TextLength: Integer;
+
<syntaxhighlight lang=pascal>procedure SetRangeParams(TextStart, TextLength: Integer;
 
     ModifyMask: TTextModifyMask; const FontName: String;  
 
     ModifyMask: TTextModifyMask; const FontName: String;  
 
     FontSize: Integer; FontColor: TColor;  
 
     FontSize: Integer; FontColor: TColor;  
 
     AddFontStyle, RemoveFontStyle: TFontStyles);</syntaxhighlight>
 
     AddFontStyle, RemoveFontStyle: TFontStyles);</syntaxhighlight>
  
The overloaded version of the method. It's just a wrapper around the parameter using TFontParams structure.  
+
Перегруженная версия метода. Это просто оболочка вокруг параметра, использующая структуру <tt>TFontParams</tt>.
The method doesn't support changing of background color, you should use the TFontParams version
+
Метод не поддерживает изменение цвета фона, вы должны использовать версию <tt>TFontParams</tt>
* FontName - font name that should set (used only if tmm_Name in ModifyMask, otherwise ignored)
+
* <tt>FontName</tt> - имя шрифта, которое должно быть установлено (используется только если <tt>tmm_Name</tt> в <tt>ModifyMask</tt>, в противном случае игнорируется)
* FontColor - font color that should set (used only if tmm_Color in ModifyMask, otherwise ignored)
+
* <tt>FontColor</tt> - Цвет шрифта, который должен быть установлен (используется только если <tt>tmm_Color</tt> в <tt>ModifyMask</tt>, в противном случае игнорируется)
  
For example, if the following code is used
+
Например, если используется следующий код
 
<source lang="delphi">
 
<source lang="delphi">
 
   RichMemo1.SetRangeParams (  
 
   RichMemo1.SetRangeParams (  
 
     RichMemo1.SelStart, RichMemo1.SelLength,
 
     RichMemo1.SelStart, RichMemo1.SelLength,
     [tmm_Styles, tmm_Color], // changing Color and Styles only
+
     [tmm_Styles, tmm_Color], // только изменение цвета и стиля
     '',  // this is font name - it's not used, thus we can leave it empty
+
     '',  // имя шрифта - оно не используется, поэтому мы можем оставить его пустым
     0,  // this is font size - it's font size, we can leave it empty
+
     0,  // размер шрифта - это размер шрифта, мы можем оставить его пустым
     clGreen, // making all the text in the selected region green color
+
     clGreen, // сделать весь текст в выбранной области зеленым цветом
     [fsBold, fsItalic],  // adding Bold and Italic Styles
+
     [fsBold, fsItalic],  // добавление жирного и курсивного стилей
 
     []
 
     []
 
   );
 
   );
Line 168: Line 171:
  
 
===GetParaAlignment===
 
===GetParaAlignment===
Gets paragraph alignment
+
Получает выравнивание абзаца
<syntaxhighlight>function GetParaAlignment(TextStart: Integer; var AAlign: TParaAlignment): Boolean; </syntaxhighlight>
+
<syntaxhighlight lang=pascal>function GetParaAlignment(TextStart: Integer; var AAlign: TParaAlignment): Boolean; </syntaxhighlight>
* TextStart - the position of the character that's belongs to the paragraph
+
* <tt>TextStart</tt> - позиция символа, который принадлежит абзацу
* AAlign - gets alignment of a paragraph.
+
* <tt>AAlign</tt> - получение выравнивания абзаца.
'''Note''':  
+
 
* Win32 - full-width Justification doesn't work on Windows XP and earlier.
+
'''Примечание''':  
* OSX - due to Carbon limitation, this is not working in Carbon, but works for Cocoa widgetset.
+
* Win32 - выравнивание по ширине не работает в Windows XP и более ранних версиях.
 +
* OSX - из-за ограничений Carbon, это не работает в Carbon, но работает для виджетов Cocoa.
 +
 
 
===SetParaAlignment===
 
===SetParaAlignment===
Sets paragraph alignent
+
Устанавливает выравнивание абзаца
<syntaxhighlight>procedure SetParaAlignment(TextStart, TextLen: Integer; AAlign: TParaAlignment); </syntaxhighlight>
+
<syntaxhighlight lang=pascal>procedure SetParaAlignment(TextStart, TextLen: Integer; AAlign: TParaAlignment); </syntaxhighlight>
'''Note''':  
+
 
* Win32 - full-width Justification doesn't work on Windows XP and earlier.
+
'''Примечание''':  
* OSX - due to Carbon limitation, this is not working in Carbon, but works for Cocoa widgetset. It's also need to loaded that the correct alignment would be loaded from RTF file
+
* Win32 - выравнивание по ширине не работает в Windows XP и более ранних версиях.
 +
* OSX - из-за ограничений Carbon, это не работает в Carbon, но работает для виджетов Cocoa. Также необходимо, чтобы правильное выравнивание было загружено из файла RTF.
  
 
===GetParaMetric===
 
===GetParaMetric===
Returns paragraph metrics for a given paragraph
+
Возвращает отступ метрики абзаца для данного абзаца
 
[[Image:richmemo_parametric.PNG|right]]
 
[[Image:richmemo_parametric.PNG|right]]
* FirstLine - an offset for the first line (in points), of the paragraph from the beginning of control
+
* <tt>FirstLine</tt> - смещение для первой строки (в пунктах) абзаца от начала элемента управления [(т.н. "красная строка")]
* TailIndent - an offset for each line (in points), except for the first line, of the paragraph from the end of the control
+
* <tt>TailIndent</tt> - смещение для каждой строки (в пунктах), за исключением первой строки, абзаца от конца элемента управления
* HeadIndent - an offset for each line (in points) of the paragraph from the end of the control
+
* <tt>HeadIndent</tt> - смещение для каждой строки (в пунктах) абзаца от начала элемента управления
* SpaceBefore - additional space before paragraph (in points)
+
* <tt>SpaceBefore</tt> - дополнительное место перед абзацем (в пунктах)
* SpaceAfter  - additional space after paragraph (in points)
+
* <tt>SpaceAfter</tt> - дополнительное место после абзаца (в пунктах)
* LineSpacing - a factor used to calculate line spacing between lines in the paragraph. The factor is applied to Font size (tallest in the line), not the line height. Thus it's matching CSS's line-height property. Note that normal line-spacing is 1.2. I.e. font of 12 pt size, an actual lines spacing set to 1.2, would result in 14pt line height.  
+
* <tt>LineSpacing</tt> - коэффициент, используемый для расчета межстрочного интервала между строками в абзаце. Коэффициент применяется к размеру шрифта (самый высокий в строке), а не к высоте строки. Таким образом, это соответствует свойству CSS line-height. Обратите внимание, что нормальный межстрочный интервал равен 1,2. То есть шрифт размером 12 пт, фактический межстрочный интервал (равный 1,2) приведет к высоте строки 14 пт.
** not supported in WinXP or earlier
+
** не поддерживается в WinXP или более ранних версиях
** most of the system would not allow if linespacing is set to less than 1.2. The value would be ignored and they'd default to 1.2
+
** в большинстве систем не будет разрешено, если для межстрочного интервала установлено значение меньше 1,2. Значение будет проигнорировано, и оно по умолчанию будет равно 1,2
  
'''Note'''  
+
'''Примечание'''  
* RichEdit paragraph settings are specified in pixels, not points, so you'll need to either convert these sizes yourself or use RichMemoHelper methods
+
* Параметры абзаца RichEdit указываются в пикселях, а не в точках, поэтому вам нужно либо преобразовать эти размеры самостоятельно, либо использовать метод RichMemoHelper.
* the notation of "Left"/"Right" offsets is avoided to prevent confusion for RTL.
+
* обозначение смещений «влево»/«вправо» исключено, чтобы избежать путаницы для RTL.
<syntaxhighlight>function GetParaMetric(TextStart: Integer; var AMetric: TParaMetric): Boolean; </syntaxhighlight>
+
<syntaxhighlight lang=pascal>function GetParaMetric(TextStart: Integer; var AMetric: TParaMetric): Boolean; </syntaxhighlight>
  
 
===SetParaMetric===
 
===SetParaMetric===
Sets paragraph metrics
+
Устанавливает метрики абзаца
<syntaxhighlight>procedure SetParaMetric(TextStart, TextLen: Integer; const AMetric: TParaMetric); </syntaxhighlight>
+
<syntaxhighlight lang=pascal>procedure SetParaMetric(TextStart, TextLen: Integer; const AMetric: TParaMetric); </syntaxhighlight>
  
It's recommended to use InitParaMetric function in order to initialize TParaMetric structure. Otherwise zeroing structure out is by it size (i.e. FillChar(m, sizeof(TParaMetric), 0) is sufficient. If TParaMetric values are received from GetParaMetric call, then the structure is considered to be initialized properly.
+
Рекомендуется использовать функцию <tt>InitParaMetric</tt> для инициализации структуры <tt>TParaMetric</tt>. В противном случае обнуление структуры равно ее размеру (т.е. достаточно <tt>FillChar(m, sizeof(TParaMetric), 0)</tt>. Если значения <tt>TParaMetric</tt> получены из вызова <tt>GetParaMetric</tt>, то структура считается правильно инициализированной).
  
 
===GetParaRange===
 
===GetParaRange===
Returns character range for a paragraph. The paragraph is identified by a character.
+
Возвращает диапазон символов для абзаца. Абзац идентифицируется символом.
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   function GetParaRange(CharOfs: Integer; var ParaRange: TParaRange): Boolean;  
 
   function GetParaRange(CharOfs: Integer; var ParaRange: TParaRange): Boolean;  
 
   function GetParaRange(CharOfs: Integer; var TextStart, TextLength: Integer): Boolean;
 
   function GetParaRange(CharOfs: Integer; var TextStart, TextLength: Integer): Boolean;
 
</syntaxhighlight>
 
</syntaxhighlight>
CharOfs - is a character that belongs to a paragraph which range is returned.
+
<tt>CharOfs</tt> - символ, который принадлежит абзацу, диапазон которого возвращается.
TParaRange - is a structure that returns 3 fields
+
<tt>TParaRange</tt> - это структура, которая возвращает 3 поля
* start - the first character in the paragraph
+
* <tt>start</tt> - первый символ в абзаце
* lengthNoBr - the length of the paragraph, excluding the line break character
+
* <tt>lengthNoBr</tt> - длина абзаца, за исключением символа разрыва строки
* length - the length of the paragrpah, including the line break, if present the last line in the control doesn't contain a line break character, thus length = lengthNoBr value.
+
* <tt>length</tt> - длина абзаца, включая разрыв строки, если присутствующая последняя строка в элементе управления не содержит символа перевода строки, следовательно, <tt>длина = lengthNoBr</tt>.
  
 
===SetParaTabs===
 
===SetParaTabs===
Sets the set of tab stops to paragraphs in the specified length.
+
Устанавливает набор табуляций для абзацев указанной длины.
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   procedure SetParaTabs(TextStart, TextLen: Integer; const AStopList: TTabStopList);  
 
   procedure SetParaTabs(TextStart, TextLen: Integer; const AStopList: TTabStopList);  
 
</syntaxhighlight>
 
</syntaxhighlight>
* TextStart
+
* <tt>TextStart</tt>
* TextLen
+
* <tt>TextLen</tt>
* AStopList - the structure that contains an array of tab stops.  
+
* <tt>AStopList</tt> - структура, которая содержит массив табуляций.
** Count - specifies the number of initialized elements.  
+
** <tt>Count</tt> - указывает количество инициализированных элементов.
** Tabs - array contains the description of each tab stop, consisting of an Offset and Alignment.   
+
** <tt>Tabs</tt> - массив содержит описание каждой позиции табуляции, состоящее из <tt>Offset</tt> и <tt>Alignment</tt>.   
*** Offset - the tab point offset in points (from the left side of the control)
+
*** <tt>Offset</tt> - смещение точки табуляции в пунктах (с левой стороны элемента управления)
*** Align  - the alignment of the tab stop (tabLeft - default one, tabCenter, tabRight, tabDecimal).
+
*** <tt>Align</tt> - выравнивание позиции табуляции (<tt>tabLeft</tt> - по умолчанию, <tt>tabCenter, tabRight, tabDecimal</tt>).
'''Notes'''
+
'''Примечание'''
;Renamefest: Prior to r4140 TTabAlignment enum values were taLeft, taCenter, taRight, taDecimal,but it did collide with Classes.TAlignment declarations. Thus the suffix was changed.
+
;Renamefest: до r4140 перечисляемыми значениями <tt>TTabAlignment</tt> были <tt>taLeft, taCenter, taRight, taDecimal</tt>, но они вступали в противоречие с объявлениями <tt>Classes.TAlignment</tt>. Таким образом суффикс был изменен.
;win32:allows no more that 32 tabs
+
;win32: позволяет не более 32 табуляций
;gtk2:only tabLeft align is supported
+
;gtk2: поддерживается только выравнивание <tt>tabLeft</tt>
;carbon:not implemented
+
;carbon: не реализовано
  
 
===GetParaTabs===
 
===GetParaTabs===
Gets the tab stops array. If no specific tabs were specified (widget default tab stops) AStopList count would be set to 0.
+
Получает массив табуляции. Если конкретные вкладки не указаны (по умолчанию виджет табуляции), счетчик AStopList будет установлен в 0.
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
  function GetParaTabs(CharOfs: Integer; var AStopList: TTabStopList): Boolean;  
 
  function GetParaTabs(CharOfs: Integer; var AStopList: TTabStopList): Boolean;  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
===SetRangeParaParams===
 
===SetRangeParaParams===
Sets paragraph metrics selectively
+
Выборочно устанавливает метрики абзаца
<syntaxhighlight> procedure SetRangeParaParams(TextStart, TextLength: Integer; ModifyMask: TParaModifyMask; const ParaMetric: TParaMetric);
+
<syntaxhighlight lang=pascal> procedure SetRangeParaParams(TextStart, TextLength: Integer; ModifyMask: TParaModifyMask; const ParaMetric: TParaMetric);
 
</syntaxhighlight>
 
</syntaxhighlight>
* TextStart - the character of the the first paragraph to apply the style too
+
* <tt>TextStart</tt> - символ первого абзаца, чтобы тоже применить стиль
* TextLength - the number of characters that paragraph properties should be modified
+
* <tt>TextLength</tt> - количество символов, которые должны изменить свойства абзаца
* ModifyMask - masks the identifies what para metric should be set for each paragraph within TextStart..TextLength block. Other characters will be left unmodified. Members of the set are
+
* <tt>ModifyMask</tt> - Маска определяет, какой показатель должен быть установлен для каждого абзаца в блоке <tt>TextStart..TextLength</tt>.Другие символы останутся без изменений. Являются членами набора
** pmm_FirstLine - changes the first line indentation. FirstLine field of ParaMetric must be initialized
+
** <tt>pmm_FirstLine</tt> - изменяет отступ первой строки. Поле <tt>FirstLine</tt> константы <tt>ParaMetric</tt> должно быть инициализировано
** pmm_HeadIndent - changes the heading paragraph indentation. HeadIndent field of ParaMetric must be initialized
+
** <tt>pmm_HeadIndent</tt> - изменяет отступ абзаца с головы. Поле <tt>HeadIndent</tt> константы <tt>ParaMetric</tt> должно быть инициализировано
** pmm_TailIndent - changes the trail paragraph indentation. TailIndent field of ParaMetric must be initialized
+
** <tt>pmm_TailIndent</tt> - изменяет отступ абзаца с хвоста. Поле <tt>TailIndent</tt> константы <tt>ParaMetric</tt> должно быть инициализировано
** pmm_SpaceBefore - changes the space preceding . SpaceBefore field of ParaMetric must be initialized
+
** <tt>pmm_SpaceBefore</tt> - меняет пробел до абзаца. Поле <tt>SpaceBefore</tt> константы <tt>ParaMetric</tt> должно быть инициализировано
** pmm_SpaceAfter - changes the space after (below) the paragraph. SpaceAfter field of ParaMetric must be initialized
+
** <tt>pmm_SpaceAfter</tt> - меняет пробел после (ниже) абзаца. Поле <tt>SpaceAfter</tt> константы <tt>ParaMetric</tt> должно быть инициализировано
** pmm_LineSpacing - line spacing within paragraph. LineSpace field of ParaMetric must be initialized
+
** <tt>pmm_LineSpacing</tt> - межстрочный интервал внутри абзаца. Поле <tt>LineSpace</tt> константы <tt>ParaMetric</tt> должно быть инициализировано
* ParaMetric - the structure containing the values to be set. Only fields specified by ModifyMask should be initialized
+
* <tt>ParaMetric</tt> - структура, содержащая значения, которые будут установлены. Только поля, указанные [структурой] <tt>ModifyMask</tt> должны быть инициализированы
  
 
=== LoadRichText ===
 
=== LoadRichText ===
<syntaxhighlight>function LoadRichText(Source: TStream): Boolean; virtual;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>function LoadRichText(Source: TStream): Boolean; virtual;</syntaxhighlight>
  
* Source: TStream - a stream to read richtext data from
+
* <tt>Source: TStream</tt> - поток для чтения данных из форматированного текста
  
The method loads RTF enocded data from the specified stream. Returns true if success, and false otherwise. If source is nil, the method returns false
+
Метод загружает данные в формате RTF из указанного потока. Возвращает true в случае успеха и false в противном случае. Если source равно nil, метод возвращает false.
  
The content of TRichMemo is completely replaced by the content on the source stream. Current text selection is reset.
+
Содержимое TRichMemo полностью заменяется содержимым в исходном потоке. Текущий выбор текста сбрасывается.
  
 
=== SaveRichText ===
 
=== SaveRichText ===
  
<syntaxhighlight>function SaveRichText(Dest: TStream): Boolean; virtual;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>function SaveRichText(Dest: TStream): Boolean; virtual;</syntaxhighlight>
  
* Source: TStream - a stream to read richtext data from
+
* <tt>Source: TStream</tt> - поток для записи данных форматированного текста
  
The method saves RTF enocded data to the specified stream. Returns true if success, and false otherwise. If source is nil, the method returns false
+
Метод сохраняет RTF-кодированные данные в указанном потоке. Возвращает true в случае успеха и false в противном случае. Если source равно nil, метод возвращает false.
 +
 
 +
Текущее состояние TRichMemo не меняется после возврата метода.
  
Current state of TRichMemo is unchanged after the method returns
 
 
===Search===
 
===Search===
<syntaxhighlight>function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions): Integer;</syntaxhighlight>
+
<syntaxhighlight lang=pascal>function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions): Integer;</syntaxhighlight>
* ANiddle: string - a text to search for
+
* <tt>ANiddle: string</tt> - текст для поиска.
* Start: Integer - a character position to start search from, if -1 or 0 search from the start
+
* <tt>Start: Integer</tt> - позиция символа, с которой начинается поиск, если -1 или 0 - поиск сначала.
* Len: Integer - length (in characters, not bytes) of the text to search for the niddle.
+
* <tt>Len: Integer</tt> - длина (в символах, а не в байтах) текста для поиска посередине.
* SearchOpt: TSearchOptions  
+
* <tt>SearchOpt: TSearchOptions</tt>
** soMatchCase - case sensitive search
+
** <tt>soMatchCase</tt> - поиск с учетом регистра.
** soBackward - searching from the end of the document to the character identified by "Start" parameter
+
** <tt>soBackward</tt> - поиск от конца документа до символа, обозначенного параметром "Start".
** soWholeWord - searching for the whole word
+
** <tt>soWholeWord</tt> - поиск всего слова.
  
The method returns the character position of the found sub-string. The position is suitable for use in SelStart property. However, might not be usable for the direct Copy operation, if Unicode characters are present in the code. Instead UTF8Copy should be used.
+
Метод возвращает положение символа найденной подстроки. Позиция подходит для использования в свойстве <tt>SelStart</tt>. Тем не менее, может быть невозможно использовать для операции прямого копирования, если в коде присутствуют символы Unicode. Вместо этого следует использовать UTF8Copy.
  
If the ANiddle was not found in the text, -1 is returned
+
Если <tt>ANiddle</tt> не был найден в тексте, возвращается -1
  
<syntaxhighlight>function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions;
+
<syntaxhighlight lang=pascal>function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions;
 
   var TextStart, TextLength: Integer): Boolean;</syntaxhighlight>
 
   var TextStart, TextLength: Integer): Boolean;</syntaxhighlight>
(The method is introduced with r5115)
+
(Метод введен с r5115)
* ANiddle: string - a text to search for
+
* <tt>ANiddle: string</tt> - текст для поиска.
* Start: Integer - a character position to start search from, if -1 or 0 search from the start
+
* <tt>Start: Integer</tt> - позиция символа, с которой начинается поиск, если -1 или 0 - поиск сначала.
* Len: Integer - length (in characters, not bytes) of the text to search for the niddle.
+
* <tt>Len: Integer</tt> - длина (в символах, а не в байтах) текста для поиска посередине.
* SearchOpt: TSearchOptions  
+
* <tt>SearchOpt: TSearchOptions</tt>
** soMatchCase - case sensitive search
+
** <tt>soMatchCase</tt> - поиск с учетом регистра
** soBackward - searching from the end of the document to the character identified by "Start" parameter
+
** <tt>soBackward</tt> - поиск от конца документа до символа, обозначенного параметром "Start".
** soWholeWord - searching for the whole word
+
** <tt>soWholeWord</tt> - поиск всего слова.
* (output) ATextStart - a position of the text found (in characters)
+
* <tt>(output) ATextStart</tt> - позиция найденного текста (в символах)
* (output) ATextLength - length of the text found (in characters (cursor positions!))
+
* <tt>(output) ATextLength</tt> - длина найденного текста (в символах (позиции курсора!))
The method returns the true if searched sub-string is found, false otherwise.  
+
Метод возвращает значение true, если искомая подстрока найдена, в противном случае - значение false.
  
The returned ATextStart and ATextLength values are suitable for use in SelStart and SelLength properties.  
+
Возвращенные значения <tt>ATextStart</tt> и <tt>ATextLength</tt> подходят для использования в свойствах <tt>SelStart</tt> и <tt>SelLength</tt>.
  
'''Note''': for complex scripts, the found text might be exactly the same as the sub-string searched. The search behavior (on complex scripts) is widgetset specific. Thus searching for the same string on different widgetsets (i.e. win32 or gtk2) might produce different results. If you need the same results and don't get them, please create a bug report.
+
{{Note| для сложных сценариев найденный текст может совпадать с искомой подстрокой. Поведение поиска (в сложных сценариях) зависит от набора виджетов. Таким образом, поиск одной и той же строки в разных наборах виджетов (например, win32 или gtk2) может привести к разным результатам. Если вам нужны одинаковые результаты и вы их не получили, создайте отчет об ошибке.}}
  
  
If you need to extract the found text, you should use GetText() method (passing ATextStart and ATextLength values).
+
Если вам нужно извлечь найденный текст, вы должны использовать метод <tt>GetText()</tt> (передавая значения <tt>ATextStart</tt> и <tt>ATextLength</tt>).
 +
 
 
===GetText, GetUText===
 
===GetText, GetUText===
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
     function GetText(TextStart, TextLength: Integer): String;
 
     function GetText(TextStart, TextLength: Integer): String;
 
     function GetUText(TextStart, TextLength: Integer): UnicodeString;
 
     function GetUText(TextStart, TextLength: Integer): UnicodeString;
 
</syntaxhighlight>
 
</syntaxhighlight>
* TextStart: Integer - a character position to start extract from. (0 - is the first character in the text).  
+
* <tt>TextStart: Integer</tt> -позиция символа для начала извлечения (0 - это первый символ в тексте).
* TextLength: Integer - length (in characters, not bytes) of the text to extract
+
* <tt>TextLength: Integer</tt> - длина (в символах, а не в байтах) текста для извлечения
 +
 
 +
<tt>GetText()</tt> возвращает подстроку UTF8
  
GetText() returns UTF8  sub-string
+
<tt>GetUText()</tt> возвращает подстроку UTF16
  
GetUText() returns UTF16  sub-string
+
Текущее выделение не будет зависеть от операции. (Если вы видите, что выделение пострадало, пожалуйста, сообщите о проблеме).
  
Current selection would not be affected by the operation. (If you see the selection affected, please report as an issue).
+
Вы не должны учитывать [абстрактную] эффективность любого метода. Например, WinAPI внутренне работает с символами UTF16, поэтому <tt>GetUText()</tt> '''может''' быть более эффективным для него. В то время как Gtk2 работает с UTF8 и вызов <tt>GetText()</tt> '''может''' быть более эффективным для него. Вместо того, чтобы думать о базовой системе, вы должны учитывать потребности вашей задачи.
  
You should not consider the efficiency of either method. For example, WinAPI internally operates with UTF16 characters, thus GetUText() '''might''' be more efficient for it. While Gtk2 operates UTF8 and calling GetText() '''might''' be more efficient for it. Instead of thinking about underlying system, you should be considering the needs of your task.
 
 
===Redo===
 
===Redo===
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
     procedure Redo;
 
     procedure Redo;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
The method redos the last change [http://lazarus-ccr.sourceforge.net/docs/lcl/stdctrls/tcustomedit.undo.html undone] previously.
+
Метод восстанавливает последнее предыдущее изменение [http://lazarus-ccr.sourceforge.net/docs/lcl/stdctrls/tcustomedit.undo.html undone].
  
You can always call [[#CanRedo|CanRedo]] to check, if there're any actions can be redone.
+
Вы всегда можете вызвать для проверки [[RichMemo/ru#CanRedo|CanRedo]], если есть какие-либо действия[, которые] могут быть переделаны.
  
== properties ==
+
== Свойства ==
  
 
=== ZoomFactor ===  
 
=== ZoomFactor ===  
<syntaxhighlight>property ZoomFactor: double</syntaxhighlight>
+
<syntaxhighlight lang=pascal>property ZoomFactor: double</syntaxhighlight>
  
Read/Write property. Controls zooming of the RichMemo content. 1.0 - is no-zoom. Less than < 1.0 - decrease zoom, more than 1.0 - increasing zooming. If 0 is set - value defaults to 1.0 zoom factor (no zoom).
+
Read/Write свойство. Управляет масштабированием содержимого RichMemo. 1.0 - без увеличения. Менее < 1,0 - уменьшить масштаб, более 1,0 - увеличить масштаб. Если установлено 0 - [приводится к] значению по умолчанию равным 1,0 коэффициенту масштабирования (без увеличения).
  
 
=== HideSelection ===
 
=== HideSelection ===
  
<syntaxhighlight>property HideSelection: Boolean default false</syntaxhighlight>
+
<syntaxhighlight lang=pascal>property HideSelection: Boolean default false</syntaxhighlight>
 +
 
 +
Read/Write свойство. Если True, то выделение RichMemo скрыто, пока элемент управления не в фокусе.
 +
Если False, выделение отображается постоянно.
  
Read/Write property. If True RichMemo selection is hidden if the control is not focused.
 
If False, the selection is shown all the time.
 
 
===CanRedo===
 
===CanRedo===
  
<syntaxhighlight>property CanRedo: Boolean</syntaxhighlight>
+
<syntaxhighlight lang=pascal>property CanRedo: Boolean</syntaxhighlight>
  
If True, there're actions in Undo queue that can be redone.  
+
Если [возвращаемое значение] True, в очереди отмены есть действия, которые можно повторить.
If False, there are no actions in Undo queue that can be redone. Calling to Redo won't have any effect.
+
Если [возвращаемое] значение False, в очереди отмены нет действий, которые можно повторить. Вызов Redo не будет иметь никакого эффекта.
 +
 
 +
=== RTF ===
 +
<syntaxhighlight lang=pascal>property Rtf: String</syntaxhighlight>
 +
 
 +
Read/Write свойство, которое позволяет читать или записывать текст в формате RTF для всего элемента управления. Назначение свойства - иметь возможность устанавливать Rich-Text во время разработки, однако свойство также будет работать во время выполнения.
  
=== Rtf ===
 
<syntaxhighlight>property Rtf: String</syntaxhighlight>
 
 
[[Image:RtfEditor.PNG|right|400px]]
 
[[Image:RtfEditor.PNG|right|400px]]
  
Read/Write property that allows to read or write Rich-Text Formatted (RTF) text to the whole control. The intent of the property is to have an ability to set Rich-Text in design time, however the property would work in run-time as well.  
+
Если значение свойства является пустой строкой, то свойство Lines используется как простой текст для инициализации значения элемента управления во время загрузки.
  
If then property value is an empty string then Lines property is used as a plain text to initialize control value in load-time.
+
{{Note| Свойство доступно только в классе TRichMemo, оно недоступно (или вообще не реализовано) в классе TCustomRichMemo. Рекомендуется использовать LoadRichText/SaveRichText для изменения содержимого страницы только потому, что они могут занимать меньше памяти, чем копирование всего расширенного текста в память.}}
  
'''Note:''' The property is available in TRichMemo class only, it's not available (or even implemented in anyway) in TCustomRichMemo class. It is recommended to use LoadRichText/SaveRichText in order to modify the content of the page, just because they could consume less memory, than copying the whole rich-text into the memory.
+
{{Note| '''для кроссплатформенной и прямой совместимости''' - в настоящее время свойство реализовано на основе набора виджетов, обеспечивающего чтение/запись в формате Rich-text. Весьма вероятно, что в ближайшем будущем оно будет изменено на использование кода чтения/записи RichMemo только RTF-stream. Проблема в том, что старые системы могут не поддерживать последнюю версию RTF.}}
  
'''Cross-platform and Forward Compatibility Note:''' - currently the property is implemented based on the widgetset providede Rich-text read/write routines. It is very likely that in near future it would be changed to used RichMemo read/write RTF stream code only. The issue is with older systems might not support the latest version of RTF.  
+
Так что прямо сейчас вы можете столкнуться с проблемой, когда вы создадите проект в Gtk2 и сохраните richmemo время разработки, содержащее символы Unicode. Затем, если вы попытаетесь загрузить его на компьютер с XP и использовать собственный загрузчик widgetset, вы можете увидеть символы, отсутствующие или неправильно отображенные. Переход на использование [механизмов] RichMemo загрузки/сохранения RTF предотвратит эту проблему. В настоящее время вы также можете избежать этого, зарегистрировав загрузчики RichMemo (вызовите процедуры RegisterRTFLoader, RegisterRTFSaver при инициализации проекта перед загрузкой любого RichMemo)
  
So right now, you might run into an issue, If you create a project in Gtk2 and save the richmemo is design time containing Unicode characters. Then if you try to load it on the XP machine and would use widgetset native loader, you might see characters missing or rendered improperly. Changing to the usage of RichMemo RTF loader/saver will prevent this issue from happening. Currently you can also avoid it by registering RichMemo loaders (call RegisterRTFLoader, RegisterRTFSaver procedures in project initialization, before any RichMemo is loaded)
+
==События==
==events==
 
 
===OnSelectionChange===
 
===OnSelectionChange===
<syntaxhighlight>property OnSelectionChange: TNotifyEvent
+
<syntaxhighlight lang=pascal>property OnSelectionChange: TNotifyEvent
 
TNotifyEvent = procedure (Sender: TObject) of object;
 
TNotifyEvent = procedure (Sender: TObject) of object;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
The event is fired whenever, selection is changed within RichMemo, either programmatically or due to the user action.
+
Событие запускается всякий раз, когда в RichMemo изменяется выделение: либо программно, либо из-за действий пользователя.
  
 
== TRichEditForMemo  ==
 
== TRichEditForMemo  ==
The class helper that implements RichEdit programmatic interface.
+
Помощник класса, который реализует программный интерфейс RichEdit.
The helper is declared at RichEditHelpers unit, so you have to add it to the uses section.
+
Помощник объявлен в модуле RichEditHelpers, поэтому вы должны добавить его в раздел использования.
Helpers are available in FPC 2.6.0 or later.  
+
Помощники доступны в FPC 2.6.0 или старше.
===methods===
+
===Методы===
 
====FindText====
 
====FindText====
Searches a given range in the text for a target string
+
Поиск заданного диапазона в тексте для целевой строки
===properties===
+
===Свойства===
 
====SelAttributes====
 
====SelAttributes====
Reads/Modifies character attributes of the current selection.
+
Читает/Изменяет атрибуты символа текущего выделения
 
===Paragraph===
 
===Paragraph===
Reads/Modifies paragraph attributes of the current selection.
+
Читает/Изменяет атрибуты абзаца текущего выделения.
  
 
===RichMemoUtils===
 
===RichMemoUtils===
The unit is introduced to add some useful OS-specific features for handling working with RichMemo
+
Представлен модуль, добавляющий некоторые полезные функции, специфичные для ОС, для работы с RichMemo.
  
 
====InsertImageFromFile====
 
====InsertImageFromFile====
Line 394: Line 406:
 
     const AImgSize: TSize
 
     const AImgSize: TSize
 
  ): Boolean = nil;
 
  ): Boolean = nil;
''Disclaimer: the function would insert an image file into RichMemo (if implemented by the widgetset) But in a very inefficient way. The image would be read again and the memory would be re-allocated for the image every time. So please, don't use it for smileys in your chat instant messaging.  A better API (with data caching) is considered. (That's why this method is not part of TCustomRichMemo class). ''
 
* APos - position in the text
 
* AImgSize - size to be inserted in POINTS, not pixels!. If both cx and cy are 0, the image would not be resized at all. If only one cx, cy is zero results are undefined.
 
  
There's also an utility function '''InsertImageFromFileNoResize''' that calls InsertImageFromFile, passing size as 0.
+
''<u>Отказ от ответственности</u>: функция будет вставлять файл изображения в RichMemo (если он реализован набором виджетов), но очень неэффективным способом. Изображение будет прочитано снова, и память будет перераспределяться для изображения каждый раз. Поэтому, пожалуйста, не используйте его для смайликов в чате. Наилучшим [выбором будет] API (с кэшированием данных). (Вот почему этот метод не является частью класса TCustomRichMemo).''
  
An example of use
+
* <tt>APos</tt> - позиция в тексте
<source lang="delphi">
+
* <tt>AImgSize</tt> - размер, который нужно выставлять в '''ТОЧКАХ''', а не в пикселях! Если и <tt>cx</tt>, и <tt>cy</tt> равны 0, размер изображения не будет изменен вообще. Если только один [из размеров] - <tt>cx, cy</tt>  - равен нулю, результаты [будут] неопределенными.
 +
 
 +
Есть также служебная функция '''InsertImageFromFileNoResize''', которая вызывает InsertImageFromFile, передавая размер как 0.
 +
 
 +
Пример использования
 +
<source lang="pascal">
 
  procedure TForm1.Button1Click(Sender: TObject);
 
  procedure TForm1.Button1Click(Sender: TObject);
 
  begin
 
  begin
   // running a dialog to select a picture to insert
+
   // вызов диалога для выбора картинки для вставки
 
   if OpenDialog1.Execute then  
 
   if OpenDialog1.Execute then  
     // inserting the picture at the current RichMemo cursor position
+
     // вставка картинки в текущую позицию курсора RichMemo
 
     InsertImageFromFileNoResize(RichMemo1, RichMemo1.SelStart, OpenDialog1.FileName);
 
     InsertImageFromFileNoResize(RichMemo1, RichMemo1.SelStart, OpenDialog1.FileName);
 
  end;
 
  end;
 
</source>
 
</source>
  
===InsertStyledText,InsertColorStyledText,InsertFontText===
+
===InsertStyledText, InsertColorStyledText, InsertFontText===
The set of functions that simplify appending and replacing of styled text. The specified style of the text is applied on the insertion. The common rule for all functions, if InsPos (insertion position) is negative - the text is appended to the end. In order to insert the text in the beginning of the test InsPos should set to 0.
+
Набор функций, которые упрощают добавление и замену стилизованного текста. Указанный стиль текста применяется к вставке. Общее правило для всех функций, если <tt>InsPos</tt> (позиция вставки) отрицательна - текст добавляется в конец. Для вставки текста в начало теста <tt>InsPos</tt> должна быть установлена в 0.
 +
 
 +
Вставленный текст не обязательно должен находиться на новой строке или добавлять новую строку. Возможно, вы захотите добавить символ <tt>LineFeed</tt> в параметр <tt>TextUTF8</tt>, чтобы вставленный текст был новой строкой.
  
The inserted text is not forced to be on a new line or add a new line. You might want to add LineFeed character to TestUTF8 parameter, if you want the inserted text to cause a new line to be started.
+
<syntaxhighlight lang=pascal>procedure InsertStyledText(
<syntaxhighlight>procedure InsertStyledText(
 
 
   const ARichMemo: TCustomRichMemo;  
 
   const ARichMemo: TCustomRichMemo;  
 
   const TextUTF8: String;  
 
   const TextUTF8: String;  
 
   AStyle: TFontStyles;
 
   AStyle: TFontStyles;
 
   InsPos : Integer = -1 )</syntaxhighlight>
 
   InsPos : Integer = -1 )</syntaxhighlight>
InsertStyledText inserts the styled text at the specified position.  
+
<tt>InsertStyledText</tt> вставляет стилизованный текст в указанную позицию.  
  
<syntaxhighlight>procedure InsertColorStyledText(
+
<syntaxhighlight lang=pascal>procedure InsertColorStyledText(
 
   const ARichMemo: TCustomRichMemo;  
 
   const ARichMemo: TCustomRichMemo;  
 
   const TextUTF8: String;  
 
   const TextUTF8: String;  
Line 428: Line 443:
 
   AStyle: TFontStyles;
 
   AStyle: TFontStyles;
 
   InsPos : Integer = -1 )</syntaxhighlight>
 
   InsPos : Integer = -1 )</syntaxhighlight>
InsertColorStyledText inserts the text with specified style and color at the specified position. to the end of the RichMemo
+
<tt>InsertColorStyledText</tt> вставляет текст с указанным стилем и цветом в указанной позиции (по умолчанию в конец RichMemo).
  
<syntaxhighlight>procedure InsertFontText(
+
<syntaxhighlight lang=pascal>procedure InsertFontText(
 
   const ARichMemo: TCustomRichMemo;  
 
   const ARichMemo: TCustomRichMemo;  
 
   const TextUTF8: String;  
 
   const TextUTF8: String;  
 
   const prms: TFontParams;     
 
   const prms: TFontParams;     
 
   InsPos : Integer = -1 )</syntaxhighlight>
 
   InsPos : Integer = -1 )</syntaxhighlight>
InsertFontText inserts the text and applies specified FontParams to it.
+
<tt>InsertFontText</tt> вставляет текст и применяет к нему указанные FontParams.
 +
 
 +
Возможно, вы захотите создать помощник класса для реализации этих функций в качестве методов для RichMemo. Осторожно, если вы используете [[RichMemo/ru#(Delphi) RichEdit-подобный интерфейс| Delphi-совместимый помощник]] - вы можете [попасть] в конфликт.
  
You might want to create a class helper to implement these functions as methods for RichMemo. Beware, if you're using [[#(Delphi) RichEdit like interface|Delphi-compatibility helper]] - you might right into a conflict.
+
== Установка ==
 +
* Получить последнюю версию из SVN
 +
* Откройте пакет и установите его, пересоберите IDE
 +
* TRichMemo будет добавлен на вкладку 'Common Controls'
  
== Installation ==
+
== Часто задаваемые вопросы ==
* Get the latest version from SVN
+
=== Использование RichMemo в общих библиотеках ===
* Open the package, and install it, rebuilding the IDE
+
[http://bugs.freepascal.org/view.php?id=17412 Issue #17412] Если вам нужно использовать компонент в разделяемой библиотеке, вам может понадобиться добавить ключ -fPIC к опции компилятора «пакета» и «проекта».
* TRichMemo is added to 'Common Controls' component page.
 
  
== Frequently Asked Questions ==
 
=== Using RichMemo in Shared Libraries ===
 
[http://bugs.freepascal.org/view.php?id=17412 Issue #17412] If you need to use the component in a shared library, you might need to add -fPIC key to the compiler option of "the package" and the "project".
 
 
== (Delphi) RichEdit-подобный интерфейс ==
 
== (Delphi) RichEdit-подобный интерфейс ==
[http://bugs.freepascal.org/view.php?id=14632 Issue #14632] A typical problem is porting an existing code that's using RichEdit from Delphi. RichMemo interface doesn't match RichEdit in many ways. But there're two ways to handle that:
+
[http://bugs.freepascal.org/view.php?id=14632 Issue #14632] Типичная проблема - портирование существующего кода, использующего RichEdit из Delphi. Интерфейс RichMemo не совпадает с RichEdit во многих отношениях. Но есть два способа справиться с этим:
* you can either create a sub-class from TCustomRichMemo (or RichMemo) and implement Delphi RichEdit methods;
+
* вы можете создать подкласс из TCustomRichMemo (или RichMemo) и реализовать методы Delphi RichEdit;
* you can use RichMemoHelpers unit (fpc 2.6.0 or later required) and use methods provided by class Helpers that should; Currently SelAttributes and Paragraph properties are implemented.
+
* вы можете использовать модуль RichMemoHelpers (требуется fpc 2.6.0 или более поздняя версия) и использовать методы, предоставляемые классом Helpers; в настоящее время реализованы свойства SelAttributes и Paragraph.
 +
 
 +
<syntaxhighlight lang=pascal>
 
  uses ... RichMemo, RichMemoHelpers;
 
  uses ... RichMemo, RichMemoHelpers;
 
   
 
   
Line 456: Line 474:
 
   RichMemo1 : TRichMemo;
 
   RichMemo1 : TRichMemo;
 
      
 
      
   // SelAttributes property is not available in the base class
+
   // Свойство SelAttributes недоступно в базовом классе,
   // but added by a helper defined at RichMemoHelpers unit
+
   // но добавлено помощником, определенным в модуле RichMemoHelpers
 
  RichMemo1.SelAttributes.Name := 'Courier New';
 
  RichMemo1.SelAttributes.Name := 'Courier New';
 +
</syntaxhighlight>
 +
 +
== Добавление смешанного цветного текста в конец RichMemo ==
 +
Если вам просто нужна простая раскраска, то вот пример, который будет каждый раз добавлять новую строку со случайным цветом (протестировано в Windows):
  
== Append mixed color text at the end of the RichMemo ==
+
<syntaxhighlight lang=pascal>
If you just need simple coloring then here is an example that will each time add a new line with random color (tested on Windows):
 
<syntaxhighlight>
 
 
   procedure TForm1.Button1Click(Sender: TObject);
 
   procedure TForm1.Button1Click(Sender: TObject);
 
   var
 
   var
Line 471: Line 491:
 
     begin
 
     begin
 
       str := 'Newline text';
 
       str := 'Newline text';
       i := Length(Lines.Text) - Lines.Count; // cr as #10#13 is counted only once so subtract it once
+
       i := Length(Lines.Text) - Lines.Count; // CR(перевод каретки) как #10#13 считается только один раз, так что вычтите его один раз
       j := Length(str) + 1;                  // +1 to make the cr the same format
+
       j := Length(str) + 1;                  // +1 сделать CR в том же формате
 
       Lines.Add(str);
 
       Lines.Add(str);
 
       SetRangeColor(i, j, Round(random * $FFFFFF));
 
       SetRangeColor(i, j, Round(random * $FFFFFF));
Line 481: Line 501:
 
   <span style="color:#C04A90">NewLine text</span>
 
   <span style="color:#C04A90">NewLine text</span>
  
Alternative example for simple coloring (tested on Windows):
+
Альтернативный пример простой раскраски (протестировано на Windows):
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   procedure TForm1.Button2Click(Sender: TObject);
 
   procedure TForm1.Button2Click(Sender: TObject);
 
   begin
 
   begin
Line 507: Line 527:
 
   <span style="color:#008000">Line in green</span>
 
   <span style="color:#008000">Line in green</span>
  
If you need mixed coloring then this is an example that will add a new line with several different colored words (tested on Windows):
+
Если вам нужна смешанная раскраска, то это пример, который добавит новую строку с несколькими разноцветными словами (протестировано в Windows):
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
procedure TForm1.Button3Click(Sender: TObject);
 
procedure TForm1.Button3Click(Sender: TObject);
 
     procedure AddColorStr(s: string; const col: TColor = clBlack; const NewLine: boolean = true);
 
     procedure AddColorStr(s: string; const col: TColor = clBlack; const NewLine: boolean = true);
Line 517: Line 537:
 
         begin
 
         begin
 
           Lines.Add('');
 
           Lines.Add('');
           Lines.Delete(Lines.Count - 1); // avoid double line spacing
+
           Lines.Delete(Lines.Count - 1); // избегаем двойного межстрочного интервала
 
         end;
 
         end;
  
Line 525: Line 545:
 
         SetRangeColor(SelStart, SelLength, col);
 
         SetRangeColor(SelStart, SelLength, col);
  
         // deselect inserted string and position cursor at the end of the text
+
         // отменяем выделение вставленной строки и помещаем курсор в конец текста
 
         SelStart  := Length(Text);
 
         SelStart  := Length(Text);
 
         SelText  := '';
 
         SelText  := '';
Line 540: Line 560:
 
   <span style="color:#000000">Black, </span><span style="color:#008000">Green, </span><span style="color:#0000FF">Blue, </span><span style="color:#FF0000">Red</span>
 
   <span style="color:#000000">Black, </span><span style="color:#008000">Green, </span><span style="color:#0000FF">Blue, </span><span style="color:#FF0000">Red</span>
 
   <span style="color:#000000">Black, </span><span style="color:#008000">Green, </span><span style="color:#0000FF">Blue, </span><span style="color:#FF0000">Red</span>
 
   <span style="color:#000000">Black, </span><span style="color:#008000">Green, </span><span style="color:#0000FF">Blue, </span><span style="color:#FF0000">Red</span>
== Markup Language Parsing ==
+
 
 +
== Разбор языка разметки ==
 
[[Image:mlparse.png|right|thumb|mlparse example]]
 
[[Image:mlparse.png|right|thumb|mlparse example]]
The native rich-edit controls do not support a markup-language parsing.
+
Нативные элементы управления rich-edit не поддерживают синтаксический анализ языка разметки.
  
You'll need to write it yourself as shown in mlparse example
+
Вам нужно написать эту [функциональность] самостоятельно, как показано в примере с mlparse.
  
 
==Что внутри==
 
==Что внутри==
 
===Матрица поддержки платформы===
 
===Матрица поддержки платформы===
Values in the matrix are not expected to be static (except for "carbon" column), each system is planned to support all features declared by RichMemo.
+
Ожидается, что значения в матрице не будут статическими (за исключением столбца "carbon"), каждая система должна поддерживать все функции, объявленные RichMemo.
  
Note that the table contains more features than published above. That means that the APIs are already available in RichMemo, but since they're unstable (on some platforms) it's considered "experimental" rather than promised.
+
Обратите внимание, что таблица содержит больше функций, чем опубликовано выше. Это означает, что API-интерфейсы уже доступны в RichMemo, но, поскольку они нестабильны (на некоторых платформах), они считаются «экспериментальными», а не обещанными.
 
{| class="wikitable" width="100%"
 
{| class="wikitable" width="100%"
! Feature
+
! Особенность
 
! Win32
 
! Win32
 
! Gtk2
 
! Gtk2
Line 559: Line 580:
 
! Carbon
 
! Carbon
 
|-  
 
|-  
| Font color and style selection
+
| Выбор цвета и стиля шрифта
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
 
|-
 
|-
| Font background color
+
| Цвет фона шрифта
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{No}}
+
| {{Нет}}
 
|-
 
|-
| Subscript,Superscript
+
| Подстрочный, надстрочный [текст]
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{No}}
+
| {{Нет}}
| {{No}}
+
| {{Нет}}
| {{No}}
+
| {{Нет}}
 
|-
 
|-
| GetStyleRange
+
| [функция] GetStyleRange
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{No}}
+
| {{Нет}}
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
 
|-
 
|-
| Paragraph Alignment
+
| Выравнивание абзаца
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{No|Almost Impossible}}
+
| {{Нет|Почти невозможно}}
 
|-
 
|-
| Paragraph Metrics
+
| Метрика абзаца
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{No}}
+
| {{Нет}}
| {{Yes}}
+
| {{Да}}
| {{No|Almost Impossible}}
+
| {{Нет|Почти невозможно}}
 
|-
 
|-
| Paragraph Tabs
+
| Отступы абзаца
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{No}}
+
| {{Нет}}
| {{Yes}}
+
| {{Да}}
| {{No}}
+
| {{Нет}}
 
|-
 
|-
|Zoom
+
|Масштабирование
| {{Yes}}
+
| {{Да}}
| {{No|Incomplete}}
+
| {{Нет|не завершено}}
| {{No}}
+
| {{Нет}}
| {{Yes}}
+
| {{Да}}
| {{No}}
+
| {{Нет}}
 
|-
 
|-
|Printing
+
|Печать
| {{Yes}}
+
| {{Да}}
| {{No}}
+
| {{Нет}}
| {{No}}
+
| {{Нет}}
| {{No}}
+
| {{Нет}}
| {{No}}
+
| {{Нет}}
 
|-
 
|-
| RTF Load/Save
+
| Загрузка/сохранение RTF
| {{Yes|OS}}
+
| {{Да|OS}}
| {{Yes|RichMemo}}
+
| {{Да|RichMemo}}
| {{No}}
+
| {{Нет}}
| {{Yes|OS}}
+
| {{Да|OS}}
| {{Yes|OS}}
+
| {{Да|OS}}
 
|-
 
|-
|Insertables
+
|Возможность вставки
| {{Yes}}
+
| {{Да}}
| {{Yes}}
+
| {{Да}}
| {{No}}
+
| {{Нет}}
| {{No}}
+
| {{Нет}}
| {{No}}
+
| {{Нет}}
 
|}
 
|}
  
Line 640: Line 661:
 
[[Image:rm_win32_notheme.PNG|thumb|RichMemo without Theme patch]]
 
[[Image:rm_win32_notheme.PNG|thumb|RichMemo without Theme patch]]
 
[[Image:rm_win32_theme.PNG|thumb|RichMemo with Theme]]
 
[[Image:rm_win32_theme.PNG|thumb|RichMemo with Theme]]
* [https://msdn.microsoft.com/en-us/library/windows/desktop/bb787605%28v=vs.85%29.aspx RichEdit] is used as system widgetset. The latest known .dll is loaded and initialized on start. Please note that RichEdit 1.0 would not support most of the features.  
+
* [https://msdn.microsoft.com/en-us/library/windows/desktop/bb787605%28v=vs.85%29.aspx RichEdit] используется в качестве системного виджета. Последний известный .dll загружается и инициализируется при запуске. Обратите внимание, что RichEdit 1.0 не поддерживает большинство функций.
* The internal wrapper of RichEditManager is provided in order to be compatible with Win 9x. However, it was never tried or tested. It's also expected that TOM object could be wrapped as one of the RichEditManager implementation. However, having the "manager" in place could be removed completely.
+
* Внутренняя оболочка RichEditManager предоставляется для совместимости с Win 9x. Однако это никогда не испытывалось и не проверялось. Также ожидается, что объект TOM может быть упакован как одна из реализаций RichEditManager. Однако имеющийся на месте «менеджер» может быть полностью удален.
* According to the internet, RichEdit control was not updated by Microsoft to support Theme drawing (since XP and up to Windows 8.1). Thus, RichEdit might always look like an old Win9x 3d-framed control. Based on the patch provided at the [http://bugs.freepascal.org/view.php?id=25111|reported issue] a way to override [https://msdn.microsoft.com/en-us/library/windows/desktop/dd145212%28v=vs.85%29.aspx WM_NCPAINT] method was introduced in r4153.
+
* Согласно Интернету, элемент управления RichEdit не был обновлен Microsoft для поддержки рисования тем (начиная с XP и до Windows 8.1). Таким образом, RichEdit всегда может выглядеть как старый Win9x в 3D-элементе управления. На основе патча, предоставленного в [http://bugs.freepascal.org/view.php?id=25111 опубликованной проблеме] способ переопределить [https://msdn.microsoft.com/en-us/library/windows/desktop/dd145212%28v=vs.85%29.aspx WM_NCPAINT] был представлен в r4153.
 +
 
 +
Win32RichMemo предоставляет глобальную переменную NCPaint. Это обработчик рисования не-клиентской области. По умолчанию он пытается нарисовать тематическую границу (см. Win32RichMemo.ThemedNCPaint для реализации). Он обеспечивает хорошие результаты по темам Windows XP, но в более поздних темах (где используются анимация) результаты не так хороши и должны быть обновлены.
  
Win32RichMemo provides a global variable NCPaint. It's a handler of non-client area drawing. By default, it attempts to draw themed border (see Win32RichMemo.ThemedNCPaint for implementation). It provides good results on Windows XP themes, but later themes (where animations are used), the results are not so great and should be updated.
+
Чтобы система могла выполнять только NCPaint .е. реализация LCL вызывает проблемы или новые окна обновляли RichEdit для правильного рисования границ), вы можете изменить значение NCPaint во время выполнения, сбросив его в nil:
  
In order to let system do NCPaint only (i.e. LCL implementation is causing issues or new windows updated RichEdit to draw borders properly), you can change NCPaint value at runtime, resetting it to nil
+
<syntaxhighlight lang=pascal>
 
  uses
 
  uses
   RichMemo, ..{$ifdef WINDOWS}Win32RichMemo{$endif}
+
   RichMemo, ..
 +
  {$ifdef WINDOWS}
 +
  Win32RichMemo
 +
  {$endif}
 
   
 
   
 
  initialization
 
  initialization
Line 654: Line 680:
 
   Win32RichMemo.NCPaint:=nil;
 
   Win32RichMemo.NCPaint:=nil;
 
   {$endif}
 
   {$endif}
+
</syntaxhighlight>
You can also provide your own implementation of NCPaint. However, if you implement proper animated theme drawing, please provide patch.
+
 
 +
Вы также можете предоставить собственную реализацию NCPaint. Однако, если вы реализуете правильную анимацию рисунка темы, пожалуйста, предоставьте патч.
  
The behavior is Windows implementation specific and should not (and will not be) part of RichMemo interface.
+
Поведение зависит от реализации Windows и не должно (и не будет) частью интерфейса RichMemo.
  
 
===Gtk2===
 
===Gtk2===
* [https://developer.gnome.org/gtk2/stable/GtkTextView.html GtkTextView] is used as system widgetset
+
* В качестве системного виджета используется [https://developer.gnome.org/gtk2/stable/GtkTextView.html GtkTextView].
* Sub and Superscript are not supported natively, an extra code is implemented in gtk2richmemo in order to implement them.
+
* Subscript и Superscript изначально не поддерживаются, в gtk2richmemo реализован дополнительный код для их реализации.
* Bulletin and numbered lists are emulated.
+
* Маркированные и нумерованные списки эмулируются.
  
 
===Gtk3===
 
===Gtk3===
The APIs between Gtk2 and [https://developer.gnome.org/gtk3/stable/GtkTextView.html Gtk3] are not really different. The major difference is in painting. For Gtk3 Cairo canvas is heavily used. The only area it affects is "Internals". IF any one wants to contribute Gtk2 implementation - please create separate gtk3richmemoXXX units. No {$ifdefs} should be created in gtk2 units.
+
API между Gtk2 и [https://developer.gnome.org/gtk3/stable/GtkTextView.html Gtk3] на самом деле не отличаются. Основное отличие в отрисовке. Для Gtk3 активно используется Cairo Canvas. Единственная область, на которую это влияет - "внутренности". Если кто-то хочет внести свой вклад в реализацию Gtk2 - пожалуйста, создайте отдельные модули gtk3richmemoXXX. Не нужно создавать {$ ifdefs} в модулях gtk2.
  
 
===Cocoa===
 
===Cocoa===
* [https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTextView_Class/index.html NSTextView] is used for Cocoa as system widgetset
+
* Для Cocoa в качестве системного виджета используется [https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTextView_Class/index.html NSTextView].
* Not every font-family provides ''italic'' font. Thus even if you pass fsItalic as part of Style for a font, it might be ignored.
+
* Не каждое семейство шрифтов предоставляет «курсивный» шрифт. Таким образом, даже если вы передадите fsItalic как часть Style для шрифта, он может быть проигнорирован.
  
 
===Qt===
 
===Qt===
* [http://doc.qt.io/qt-4.8/qtextedit.html QTextEdit] widget is used. Current C-mappings for Qt are missing a lot of RichText APIs, thus full implementation is currently impossible.  
+
* Используется [http://doc.qt.io/qt-4.8/qtextedit.html QTextEdit] виджет. В современных C-отображениях для Qt отсутствует множество API-интерфейсов RichText, поэтому полная реализация в настоящее время невозможна.  
* The following classes need to be mapped to C-functions:
+
* Следующие классы должны быть сопоставлены с C-функциями:
** [http://doc.qt.io/qt-4.8/qtextblockformat.html QTextBlockFormatH] needed for paragraphs alignments (such as paragraph indents, line spacing and tabs). QTextEdit only exposes paragraph alignment.
+
** [http://doc.qt.io/qt-4.8/qtextblockformat.html QTextBlockFormatH] необходим для выравнивания абзацев (например, отступы абзаца, межстрочный интервал и табуляции). QTextEdit предоставляет только выравнивание абзаца.
** [http://doc.qt.io/qt-4.8/qtextcharformat.html QTextCharFormatH] needed for additional character formatting (i.e. vertical alignment, links support). QTextEdit only exposes font styles.
+
** [http://doc.qt.io/qt-4.8/qtextcharformat.html QTextCharFormatH] необходим для дополнительного форматирования символов (то есть вертикальное выравнивание, поддержка ссылок). QTextEdit предоставляет только стили шрифтов.
  
==See also==
+
==См. также==
* [[RichMemo/Features]] - comments on some features in progress
+
* [[RichMemo/Features]] - комментирует некоторые функции в процессе.
* [[RichMemo/WorkArounds]] - some notes about features not yet complete.
+
* [[RichMemo/WorkArounds]] - некоторые заметки о функциях еще не завершены.
* [[RichMemo/Defines]] - additional package switches that allow to resolve compiling/runtime issues
+
* [[RichMemo/Defines]] - дополнительные переключатели пакетов, которые позволяют решить проблемы компиляции/времени выполнения
* [https://sites.google.com/site/mynotex/ MyNotex] application which uses modified by Massimo Nardello RichMemo package on Linux-Gtk2
+
* [[RichMemo/Samples]] - еще примеры
 +
* [https://sites.google.com/site/mynotex MyNotex] приложение, которое использует модифицированный пакет Massimo Nardello RichMemo для Linux-Gtk2
 
* [[TMemo]]
 
* [[TMemo]]
 
* [[KControls#KMemo_control|KMemo control]]
 
* [[KControls#KMemo_control|KMemo control]]
 
[[Category:Packages]]
 
[[Category:Lazarus-CCR]]
 
[[Category:RichMemo]]
 

Latest revision as of 21:19, 28 February 2022

English (en) polski (pl) русский (ru)

RichMemo macosx screenshot. Thanks to Dominique Louis

RichMemo - это пакет, который включает компонент для замены компонента Delphi TRichEdit. Он разработан кросс-платформенным способом, поэтому его реализация возможна для следующих платформ: Win32, MacOSX и Linux. Поскольку кроссплатформенность является основной целью, нативный API RichMemo может быть расширен, чтобы сделать его совместимым с Delphi RichEdit.

Его основными характеристиками являются:

  • Подсветка текста
  • Системная поддержка редактирования Юникода

Планируется: (исправления приветствуются)

  • Добавление изображений в текст
  • Встраивание элементов управления LCL?

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

Пожалуйста, добавляйте ваши багрепорты/функции на Github.


Лицензия

Автор: Дмитрий 'скалогрыз' Бояринцев

modified LGPL (так же, как FPC RTL и Lazarus LCL). Вы можете связаться с автором, если измененный LGPL не работает с вашим проектом лицензирования.

Загрузка

Последняя версия доступна здесь:

https://github.com/skalogryz/richmemo


Прим.перев.: Существует также форк данного компонента на гитхабе от Andreas Toth aka mrandreastoth.

Change Log

  • Version 1.0.0 22th Jun 2009
  • Version 0.8.0 Jun 2009

Зависимости / Системные требования

  • Lazarus 1.0.0

Статус: выпущен.

Установка

  • Скачайте исходники пакета
  • Установите пакет в Lazarus и пересоберите его
  • TRichMemo добавится в закладку 'Common Controls'.

RichMemoPalette.PNG

TRichMemo

Параметры шрифта

Параметры шрифта обычно представлены записью TFontParams. Тип используется для описания атрибутов шрифта rich. Некоторые атрибуты выходят за рамки класса TFont, поэтому необходим дополнительный тип. Однако большинство типов данных, связанных с TFont, используются повторно (т.е. TFontStyles).

  • Name - название шрифта (семейство).
  • Size - размер шрифта в пунктах (передача отрицательного значения может привести к неожиданным результатам).
  • Color - цвет шрифта.
  • Style - стили шрифта, включая полужирный, курсив, зачеркнутый, подчеркивание.
  • HasBkClr - логический флаг, если текст для должен иметь цвет фона (если true, поле BkColor используется, в противном случае BkColor игнорируется). Прозрачность не поддерживается.
  • BkColor - цвет фона (или подсветка) для текста.
  • VScriptPos - вертикальная настройка текста
    richmemo Subsuper.png
    .
    • vpNormal - нет особой позиции.
    • vpSubscript - текст - нижний индекс.
    • vpSuperscript - текст - верхний индекс.
Фактическое вертикальное смещение индексов верх/низ зависит от реализации ОС и в настоящее время не может контролироваться.

Вы можете присвоить FontParams из структуры TFont. Для этого вам нужно использовать функцию GetFontParams(afont: TFont). Обратите внимание, что для большинства элементов управления LCL для TFont установлены значения по умолчанию. Это не фактические значения, а скорее указание на то, что следует использовать шрифт по умолчанию для элемента управления (аналогично crDefault для TColor).

Функция GetFontParams разрешает имя шрифта по умолчанию и возвращает фактическое имя семейства шрифтов.

Методы

SetTextAttributes

procedure SetTextAttributes(TextStart, TextLen: Integer; AFont: TFont);
  • TextStart : Integer - первый символ, который будет изменен
  • TextLen : Integer - количество символов для изменения
  • AFont : TFont - шрифт, который должен быть применен к части текста
procedure SetTextAttributes(TextStart, TextLen: Integer; const TextParams: TFontParams);
  • TextStart : Integer - первый символ, который будет изменен
  • TextLen : Integer - количество символов для изменения
  • TextParams : TFontParams - параметры шрифта, которые будут установлены

Методы SetTextureAttributes изменяют указанный стиль текстового диапазона. Параметры шрифта передаются в обоих методах, параметром AFont (объект LCL TFont) или TFontParams (объявлено в RichMemo)

Установка атрибутов текста не меняет текущий выбор. Если необходимо изменить стиль выделенного в данный момент текста, вам следует выбрать SelStart и SelLength в качестве значений текстового диапазона:

RichMemo1.SetTextAttributes(RichMemo1.SelStart, RichMemo1.SelLength, FontDialog1.Font);

GetTextAttributes

function GetTextAttributes(TextStart: Integer; var TextParams: TFontParams): Boolean; virtual;
  • TextStart : Integer - позиция символа для запроса параметров шрифта
  • var TextParams : TFontParams - выходное значение, заполненное атрибутами символа шрифта. Если метод завершается неудачно и возвращает false, значения поля записи будут неопределенными.

Заполняет параметры шрифта символа в позиции TextStart. Метод возвращает True, если TextStart является действительной позицией символа, и False в противном случае.

GetStyleRange

function GetStyleRange(CharPos: Integer; var RangeStart, RangeLen: Integer): Boolean; virtual;

Возвращает диапазон символов с одинаковыми параметрами шрифта, т.е. все символы в диапазоне имеют одинаковые имя, размер, цвет и стили шрифта.

  • CharPos : Integer - символ, который принадлежит диапазону стилей. Позиция не обязательно быть в начале диапазона стилей. Она может быть в середине конца диапазона стилей. Первая позиция символа возвращается параметром RangeStart.
  • var RangeStart : Integer - первый символ в диапазоне
  • var RangeLen : Integer - количество символов в диапазоне

Метод возвращает true в случае успеха. Метод возвращает false, если CharPos имеет неправильное значение - больше доступных символов или какая-либо другая ошибка.

CharAtPos

function CharAtPos(x,y: Integer): Integer; virtual;

Возвращает смещение символа от нулевой позиции (не позиция UTF8). Возвращает -1 в случае неудачи.

  • x, y - точка в клиентской области элемента управления RichMemo.

Метод знает о состоянии прокрутки элемента управления. Таким образом, два вызова CharAtPos(0,0) могут возвращать разные значения, если между вызовами изменяется позиция прокрутки. Смотрите "examples/hittest" для [получения] примера использования.

Если указанные x,y будут вне содержимого RichMemo, возвращаемое значение [будет] неопределенным. [Поведение] остается [на усмотрение] набора виджетов, который либо возвращает -1, либо закрывает доступный символ.

SetRangeColor

procedure SetRangeColor(TextStart, TextLength: Integer; FontColor: TColor);

Метод устанавливает цвет символов в указанном диапазоне для FontColor. Другие параметры шрифта (имя, размер, стили) остаются без изменений.

  • TextStart: Integer - первый символ в диапазоне
  • TextLength: Integer - количество символов в диапазоне
  • FontColor: TColor - цвет, который должен быть установлен

SetRangeParams

    procedure SetRangeParams(TextStart, TextLength: Integer; ModifyMask: TTextModifyMask;
      const fnt: TFontParams; AddFontStyle, RemoveFontStyle: TFontStyles); overload;

Метод изменяет параметры шрифта в указанном диапазоне.

  • TextStart - первый символ в диапазоне
  • TextLength - количество символов в диапазоне
  • ModifyMask - показывает, какие именно атрибуты шрифта должны быть обновлены. Маска принимает любую комбинацию из следующих значений:
    • tmm_Color - Цвет шрифта будет изменен (поле fnt.Color должно быть заполнено)
    • tmm_Name - имя шрифта будет изменено (поле fnt.Name должно быть заполнено)
    • tmm_Size - размер шрифта будет изменен (поле fnt.Size должно быть заполнено)
    • tmm_Styles - стили шрифта будут изменены в соответствии с параметрами AddFontStyle, RemoveFontStyle
    • tmm_BackColor - Цвет подсветки текста (фона) будет изменен. (поля fnt.HasBkClr и fnt.BkColor должны быть заполнены)
    • Отправка пустой маски приведет к возврату метода без внесения каких-либо изменений.
  • fnt - Параметры шрифта, которые будут использоваться, в зависимости от значений ModifyMask.
  • AddFontStyle - набор стилей, которые должны применяться к диапазону (используется только если tmm_Styles в ModifyMask, в противном случае игнорируется)
  • RemoveFontStyle - набор стилей шрифта должен быть удален из диапазона (используется только если tmm_Styles в ModifyMask, в противном случае игнорируется)


procedure SetRangeParams(TextStart, TextLength: Integer;
    ModifyMask: TTextModifyMask; const FontName: String; 
    FontSize: Integer; FontColor: TColor; 
    AddFontStyle, RemoveFontStyle: TFontStyles);

Перегруженная версия метода. Это просто оболочка вокруг параметра, использующая структуру TFontParams. Метод не поддерживает изменение цвета фона, вы должны использовать версию TFontParams

  • FontName - имя шрифта, которое должно быть установлено (используется только если tmm_Name в ModifyMask, в противном случае игнорируется)
  • FontColor - Цвет шрифта, который должен быть установлен (используется только если tmm_Color в ModifyMask, в противном случае игнорируется)

Например, если используется следующий код

  RichMemo1.SetRangeParams ( 
     RichMemo1.SelStart, RichMemo1.SelLength,
     [tmm_Styles, tmm_Color], // только изменение цвета и стиля
     '',  // имя шрифта - оно не используется, поэтому мы можем оставить его пустым
     0,  // размер шрифта - это размер шрифта, мы можем оставить его пустым
     clGreen, // сделать весь текст в выбранной области зеленым цветом
     [fsBold, fsItalic],  // добавление жирного и курсивного стилей
     []
  );

GetParaAlignment

Получает выравнивание абзаца

function GetParaAlignment(TextStart: Integer; var AAlign: TParaAlignment): Boolean;
  • TextStart - позиция символа, который принадлежит абзацу
  • AAlign - получение выравнивания абзаца.

Примечание:

  • Win32 - выравнивание по ширине не работает в Windows XP и более ранних версиях.
  • OSX - из-за ограничений Carbon, это не работает в Carbon, но работает для виджетов Cocoa.

SetParaAlignment

Устанавливает выравнивание абзаца

procedure SetParaAlignment(TextStart, TextLen: Integer; AAlign: TParaAlignment);

Примечание:

  • Win32 - выравнивание по ширине не работает в Windows XP и более ранних версиях.
  • OSX - из-за ограничений Carbon, это не работает в Carbon, но работает для виджетов Cocoa. Также необходимо, чтобы правильное выравнивание было загружено из файла RTF.

GetParaMetric

Возвращает отступ метрики абзаца для данного абзаца

richmemo parametric.PNG
  • FirstLine - смещение для первой строки (в пунктах) абзаца от начала элемента управления [(т.н. "красная строка")]
  • TailIndent - смещение для каждой строки (в пунктах), за исключением первой строки, абзаца от конца элемента управления
  • HeadIndent - смещение для каждой строки (в пунктах) абзаца от начала элемента управления
  • SpaceBefore - дополнительное место перед абзацем (в пунктах)
  • SpaceAfter - дополнительное место после абзаца (в пунктах)
  • LineSpacing - коэффициент, используемый для расчета межстрочного интервала между строками в абзаце. Коэффициент применяется к размеру шрифта (самый высокий в строке), а не к высоте строки. Таким образом, это соответствует свойству CSS line-height. Обратите внимание, что нормальный межстрочный интервал равен 1,2. То есть шрифт размером 12 пт, фактический межстрочный интервал (равный 1,2) приведет к высоте строки 14 пт.
    • не поддерживается в WinXP или более ранних версиях
    • в большинстве систем не будет разрешено, если для межстрочного интервала установлено значение меньше 1,2. Значение будет проигнорировано, и оно по умолчанию будет равно 1,2

Примечание

  • Параметры абзаца RichEdit указываются в пикселях, а не в точках, поэтому вам нужно либо преобразовать эти размеры самостоятельно, либо использовать метод RichMemoHelper.
  • обозначение смещений «влево»/«вправо» исключено, чтобы избежать путаницы для RTL.
function GetParaMetric(TextStart: Integer; var AMetric: TParaMetric): Boolean;

SetParaMetric

Устанавливает метрики абзаца

procedure SetParaMetric(TextStart, TextLen: Integer; const AMetric: TParaMetric);

Рекомендуется использовать функцию InitParaMetric для инициализации структуры TParaMetric. В противном случае обнуление структуры равно ее размеру (т.е. достаточно FillChar(m, sizeof(TParaMetric), 0). Если значения TParaMetric получены из вызова GetParaMetric, то структура считается правильно инициализированной).

GetParaRange

Возвращает диапазон символов для абзаца. Абзац идентифицируется символом.

  function GetParaRange(CharOfs: Integer; var ParaRange: TParaRange): Boolean; 
  function GetParaRange(CharOfs: Integer; var TextStart, TextLength: Integer): Boolean;

CharOfs - символ, который принадлежит абзацу, диапазон которого возвращается. TParaRange - это структура, которая возвращает 3 поля

  • start - первый символ в абзаце
  • lengthNoBr - длина абзаца, за исключением символа разрыва строки
  • length - длина абзаца, включая разрыв строки, если присутствующая последняя строка в элементе управления не содержит символа перевода строки, следовательно, длина = lengthNoBr.

SetParaTabs

Устанавливает набор табуляций для абзацев указанной длины.

  procedure SetParaTabs(TextStart, TextLen: Integer; const AStopList: TTabStopList);
  • TextStart
  • TextLen
  • AStopList - структура, которая содержит массив табуляций.
    • Count - указывает количество инициализированных элементов.
    • Tabs - массив содержит описание каждой позиции табуляции, состоящее из Offset и Alignment.
      • Offset - смещение точки табуляции в пунктах (с левой стороны элемента управления)
      • Align - выравнивание позиции табуляции (tabLeft - по умолчанию, tabCenter, tabRight, tabDecimal).

Примечание

Renamefest
до r4140 перечисляемыми значениями TTabAlignment были taLeft, taCenter, taRight, taDecimal, но они вступали в противоречие с объявлениями Classes.TAlignment. Таким образом суффикс был изменен.
win32
позволяет не более 32 табуляций
gtk2
поддерживается только выравнивание tabLeft
carbon
не реализовано

GetParaTabs

Получает массив табуляции. Если конкретные вкладки не указаны (по умолчанию виджет табуляции), счетчик AStopList будет установлен в 0.

 function GetParaTabs(CharOfs: Integer; var AStopList: TTabStopList): Boolean;

SetRangeParaParams

Выборочно устанавливает метрики абзаца

 procedure SetRangeParaParams(TextStart, TextLength: Integer; ModifyMask: TParaModifyMask; const ParaMetric: TParaMetric);
  • TextStart - символ первого абзаца, чтобы тоже применить стиль
  • TextLength - количество символов, которые должны изменить свойства абзаца
  • ModifyMask - Маска определяет, какой показатель должен быть установлен для каждого абзаца в блоке TextStart..TextLength.Другие символы останутся без изменений. Являются членами набора
    • pmm_FirstLine - изменяет отступ первой строки. Поле FirstLine константы ParaMetric должно быть инициализировано
    • pmm_HeadIndent - изменяет отступ абзаца с головы. Поле HeadIndent константы ParaMetric должно быть инициализировано
    • pmm_TailIndent - изменяет отступ абзаца с хвоста. Поле TailIndent константы ParaMetric должно быть инициализировано
    • pmm_SpaceBefore - меняет пробел до абзаца. Поле SpaceBefore константы ParaMetric должно быть инициализировано
    • pmm_SpaceAfter - меняет пробел после (ниже) абзаца. Поле SpaceAfter константы ParaMetric должно быть инициализировано
    • pmm_LineSpacing - межстрочный интервал внутри абзаца. Поле LineSpace константы ParaMetric должно быть инициализировано
  • ParaMetric - структура, содержащая значения, которые будут установлены. Только поля, указанные [структурой] ModifyMask должны быть инициализированы

LoadRichText

function LoadRichText(Source: TStream): Boolean; virtual;
  • Source: TStream - поток для чтения данных из форматированного текста

Метод загружает данные в формате RTF из указанного потока. Возвращает true в случае успеха и false в противном случае. Если source равно nil, метод возвращает false.

Содержимое TRichMemo полностью заменяется содержимым в исходном потоке. Текущий выбор текста сбрасывается.

SaveRichText

function SaveRichText(Dest: TStream): Boolean; virtual;
  • Source: TStream - поток для записи данных форматированного текста

Метод сохраняет RTF-кодированные данные в указанном потоке. Возвращает true в случае успеха и false в противном случае. Если source равно nil, метод возвращает false.

Текущее состояние TRichMemo не меняется после возврата метода.

Search

function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions): Integer;
  • ANiddle: string - текст для поиска.
  • Start: Integer - позиция символа, с которой начинается поиск, если -1 или 0 - поиск сначала.
  • Len: Integer - длина (в символах, а не в байтах) текста для поиска посередине.
  • SearchOpt: TSearchOptions
    • soMatchCase - поиск с учетом регистра.
    • soBackward - поиск от конца документа до символа, обозначенного параметром "Start".
    • soWholeWord - поиск всего слова.

Метод возвращает положение символа найденной подстроки. Позиция подходит для использования в свойстве SelStart. Тем не менее, может быть невозможно использовать для операции прямого копирования, если в коде присутствуют символы Unicode. Вместо этого следует использовать UTF8Copy.

Если ANiddle не был найден в тексте, возвращается -1

function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions;
  var TextStart, TextLength: Integer): Boolean;

(Метод введен с r5115)

  • ANiddle: string - текст для поиска.
  • Start: Integer - позиция символа, с которой начинается поиск, если -1 или 0 - поиск сначала.
  • Len: Integer - длина (в символах, а не в байтах) текста для поиска посередине.
  • SearchOpt: TSearchOptions
    • soMatchCase - поиск с учетом регистра
    • soBackward - поиск от конца документа до символа, обозначенного параметром "Start".
    • soWholeWord - поиск всего слова.
  • (output) ATextStart - позиция найденного текста (в символах)
  • (output) ATextLength - длина найденного текста (в символах (позиции курсора!))

Метод возвращает значение true, если искомая подстрока найдена, в противном случае - значение false.

Возвращенные значения ATextStart и ATextLength подходят для использования в свойствах SelStart и SelLength.

Light bulb  Примечание: для сложных сценариев найденный текст может совпадать с искомой подстрокой. Поведение поиска (в сложных сценариях) зависит от набора виджетов. Таким образом, поиск одной и той же строки в разных наборах виджетов (например, win32 или gtk2) может привести к разным результатам. Если вам нужны одинаковые результаты и вы их не получили, создайте отчет об ошибке.


Если вам нужно извлечь найденный текст, вы должны использовать метод GetText() (передавая значения ATextStart и ATextLength).

GetText, GetUText

    function GetText(TextStart, TextLength: Integer): String;
    function GetUText(TextStart, TextLength: Integer): UnicodeString;
  • TextStart: Integer -позиция символа для начала извлечения (0 - это первый символ в тексте).
  • TextLength: Integer - длина (в символах, а не в байтах) текста для извлечения

GetText() возвращает подстроку UTF8

GetUText() возвращает подстроку UTF16

Текущее выделение не будет зависеть от операции. (Если вы видите, что выделение пострадало, пожалуйста, сообщите о проблеме).

Вы не должны учитывать [абстрактную] эффективность любого метода. Например, WinAPI внутренне работает с символами UTF16, поэтому GetUText() может быть более эффективным для него. В то время как Gtk2 работает с UTF8 и вызов GetText() может быть более эффективным для него. Вместо того, чтобы думать о базовой системе, вы должны учитывать потребности вашей задачи.

Redo

    procedure Redo;

Метод восстанавливает последнее предыдущее изменение undone.

Вы всегда можете вызвать для проверки CanRedo, если есть какие-либо действия[, которые] могут быть переделаны.

Свойства

ZoomFactor

property ZoomFactor: double

Read/Write свойство. Управляет масштабированием содержимого RichMemo. 1.0 - без увеличения. Менее < 1,0 - уменьшить масштаб, более 1,0 - увеличить масштаб. Если установлено 0 - [приводится к] значению по умолчанию равным 1,0 коэффициенту масштабирования (без увеличения).

HideSelection

property HideSelection: Boolean default false

Read/Write свойство. Если True, то выделение RichMemo скрыто, пока элемент управления не в фокусе. Если False, выделение отображается постоянно.

CanRedo

property CanRedo: Boolean

Если [возвращаемое значение] True, в очереди отмены есть действия, которые можно повторить. Если [возвращаемое] значение False, в очереди отмены нет действий, которые можно повторить. Вызов Redo не будет иметь никакого эффекта.

RTF

property Rtf: String

Read/Write свойство, которое позволяет читать или записывать текст в формате RTF для всего элемента управления. Назначение свойства - иметь возможность устанавливать Rich-Text во время разработки, однако свойство также будет работать во время выполнения.

RtfEditor.PNG

Если значение свойства является пустой строкой, то свойство Lines используется как простой текст для инициализации значения элемента управления во время загрузки.

Light bulb  Примечание: Свойство доступно только в классе TRichMemo, оно недоступно (или вообще не реализовано) в классе TCustomRichMemo. Рекомендуется использовать LoadRichText/SaveRichText для изменения содержимого страницы только потому, что они могут занимать меньше памяти, чем копирование всего расширенного текста в память.
Light bulb  Примечание: для кроссплатформенной и прямой совместимости - в настоящее время свойство реализовано на основе набора виджетов, обеспечивающего чтение/запись в формате Rich-text. Весьма вероятно, что в ближайшем будущем оно будет изменено на использование кода чтения/записи RichMemo только RTF-stream. Проблема в том, что старые системы могут не поддерживать последнюю версию RTF.

Так что прямо сейчас вы можете столкнуться с проблемой, когда вы создадите проект в Gtk2 и сохраните richmemo время разработки, содержащее символы Unicode. Затем, если вы попытаетесь загрузить его на компьютер с XP и использовать собственный загрузчик widgetset, вы можете увидеть символы, отсутствующие или неправильно отображенные. Переход на использование [механизмов] RichMemo загрузки/сохранения RTF предотвратит эту проблему. В настоящее время вы также можете избежать этого, зарегистрировав загрузчики RichMemo (вызовите процедуры RegisterRTFLoader, RegisterRTFSaver при инициализации проекта перед загрузкой любого RichMemo)

События

OnSelectionChange

property OnSelectionChange: TNotifyEvent
TNotifyEvent = procedure (Sender: TObject) of object;

Событие запускается всякий раз, когда в RichMemo изменяется выделение: либо программно, либо из-за действий пользователя.

TRichEditForMemo

Помощник класса, который реализует программный интерфейс RichEdit. Помощник объявлен в модуле RichEditHelpers, поэтому вы должны добавить его в раздел использования. Помощники доступны в FPC 2.6.0 или старше.

Методы

FindText

Поиск заданного диапазона в тексте для целевой строки

Свойства

SelAttributes

Читает/Изменяет атрибуты символа текущего выделения

Paragraph

Читает/Изменяет атрибуты абзаца текущего выделения.

RichMemoUtils

Представлен модуль, добавляющий некоторые полезные функции, специфичные для ОС, для работы с RichMemo.

InsertImageFromFile

function InsertImageFromFile (const ARichMemo: TCustomRichMemo; APos: Integer;
    const FileNameUTF8: string;
    const AImgSize: TSize
): Boolean = nil;

Отказ от ответственности: функция будет вставлять файл изображения в RichMemo (если он реализован набором виджетов), но очень неэффективным способом. Изображение будет прочитано снова, и память будет перераспределяться для изображения каждый раз. Поэтому, пожалуйста, не используйте его для смайликов в чате. Наилучшим [выбором будет] API (с кэшированием данных). (Вот почему этот метод не является частью класса TCustomRichMemo).

  • APos - позиция в тексте
  • AImgSize - размер, который нужно выставлять в ТОЧКАХ, а не в пикселях! Если и cx, и cy равны 0, размер изображения не будет изменен вообще. Если только один [из размеров] - cx, cy - равен нулю, результаты [будут] неопределенными.

Есть также служебная функция InsertImageFromFileNoResize, которая вызывает InsertImageFromFile, передавая размер как 0.

Пример использования

 procedure TForm1.Button1Click(Sender: TObject);
 begin
  // вызов диалога для выбора картинки для вставки
  if OpenDialog1.Execute then 
    // вставка картинки в текущую позицию курсора RichMemo
    InsertImageFromFileNoResize(RichMemo1, RichMemo1.SelStart, OpenDialog1.FileName);
 end;

InsertStyledText, InsertColorStyledText, InsertFontText

Набор функций, которые упрощают добавление и замену стилизованного текста. Указанный стиль текста применяется к вставке. Общее правило для всех функций, если InsPos (позиция вставки) отрицательна - текст добавляется в конец. Для вставки текста в начало теста InsPos должна быть установлена в 0.

Вставленный текст не обязательно должен находиться на новой строке или добавлять новую строку. Возможно, вы захотите добавить символ LineFeed в параметр TextUTF8, чтобы вставленный текст был новой строкой.

procedure InsertStyledText(
  const ARichMemo: TCustomRichMemo; 
  const TextUTF8: String; 
  AStyle: TFontStyles;
  InsPos : Integer = -1 )

InsertStyledText вставляет стилизованный текст в указанную позицию.

procedure InsertColorStyledText(
  const ARichMemo: TCustomRichMemo; 
  const TextUTF8: String; 
  AColor: TColor; 
  AStyle: TFontStyles;
  InsPos : Integer = -1 )

InsertColorStyledText вставляет текст с указанным стилем и цветом в указанной позиции (по умолчанию в конец RichMemo).

procedure InsertFontText(
  const ARichMemo: TCustomRichMemo; 
  const TextUTF8: String; 
  const prms: TFontParams;     
  InsPos : Integer = -1 )

InsertFontText вставляет текст и применяет к нему указанные FontParams.

Возможно, вы захотите создать помощник класса для реализации этих функций в качестве методов для RichMemo. Осторожно, если вы используете Delphi-совместимый помощник - вы можете [попасть] в конфликт.

Установка

  • Получить последнюю версию из SVN
  • Откройте пакет и установите его, пересоберите IDE
  • TRichMemo будет добавлен на вкладку 'Common Controls'

Часто задаваемые вопросы

Использование RichMemo в общих библиотеках

Issue #17412 Если вам нужно использовать компонент в разделяемой библиотеке, вам может понадобиться добавить ключ -fPIC к опции компилятора «пакета» и «проекта».

(Delphi) RichEdit-подобный интерфейс

Issue #14632 Типичная проблема - портирование существующего кода, использующего RichEdit из Delphi. Интерфейс RichMemo не совпадает с RichEdit во многих отношениях. Но есть два способа справиться с этим:

  • вы можете создать подкласс из TCustomRichMemo (или RichMemo) и реализовать методы Delphi RichEdit;
  • вы можете использовать модуль RichMemoHelpers (требуется fpc 2.6.0 или более поздняя версия) и использовать методы, предоставляемые классом Helpers; в настоящее время реализованы свойства SelAttributes и Paragraph.
 uses ... RichMemo, RichMemoHelpers;
 
 TForm = class
   RichMemo1 : TRichMemo;
    
   // Свойство SelAttributes недоступно в базовом классе,
   // но добавлено помощником, определенным в модуле RichMemoHelpers
 RichMemo1.SelAttributes.Name := 'Courier New';

Добавление смешанного цветного текста в конец RichMemo

Если вам просто нужна простая раскраска, то вот пример, который будет каждый раз добавлять новую строку со случайным цветом (протестировано в Windows):

  procedure TForm1.Button1Click(Sender: TObject);
  var
    i, j: integer;
    str: string;
  begin
    with Richmemo1 do
    begin
      str := 'Newline text';
      i := Length(Lines.Text) - Lines.Count; // CR(перевод каретки) как #10#13 считается только один раз, так что вычтите его один раз
      j := Length(str) + 1;                  // +1 сделать CR в том же формате
      Lines.Add(str);
      SetRangeColor(i, j, Round(random * $FFFFFF));
    end;
  end;
 Newline text
 NewLine text
 NewLine text

Альтернативный пример простой раскраски (протестировано на Windows):

  procedure TForm1.Button2Click(Sender: TObject);
  begin
    with RichMemo1 do
    begin
      Lines.Add('Line in red');
      SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clRed);
  
      Lines.Add('Line in blue');
      SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clBlue);
  
      Lines.Add('Normal line.');
      Lines.Add('Normal line.');
  
      Lines.Add('Line in green ');
      SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clGreen);
    end;
  end;
 Line in red
 Line in blue
 Normal line.
 Normal line.
 Line in green

Если вам нужна смешанная раскраска, то это пример, который добавит новую строку с несколькими разноцветными словами (протестировано в Windows):

procedure TForm1.Button3Click(Sender: TObject);
    procedure AddColorStr(s: string; const col: TColor = clBlack; const NewLine: boolean = true);
    begin
      with RichMemo1 do
      begin
        if NewLine then
        begin
          Lines.Add('');
          Lines.Delete(Lines.Count - 1); // избегаем двойного межстрочного интервала
        end;

        SelStart  := Length(Text);
        SelText   := s;
        SelLength := Length(s);
        SetRangeColor(SelStart, SelLength, col);

        // отменяем выделение вставленной строки и помещаем курсор в конец текста
        SelStart  := Length(Text);
        SelText   := '';
      end;
    end;
  begin
    AddColorStr('Black, ');
    AddColorStr('Green, ', clGReen, false);
    AddColorStr('Blue, ', clBlue, false);
    AddColorStr('Red', clRed, false);
  end;
 Black, Green, Blue, Red
 Black, Green, Blue, Red
 Black, Green, Blue, Red

Разбор языка разметки

mlparse example

Нативные элементы управления rich-edit не поддерживают синтаксический анализ языка разметки.

Вам нужно написать эту [функциональность] самостоятельно, как показано в примере с mlparse.

Что внутри

Матрица поддержки платформы

Ожидается, что значения в матрице не будут статическими (за исключением столбца "carbon"), каждая система должна поддерживать все функции, объявленные RichMemo.

Обратите внимание, что таблица содержит больше функций, чем опубликовано выше. Это означает, что API-интерфейсы уже доступны в RichMemo, но, поскольку они нестабильны (на некоторых платформах), они считаются «экспериментальными», а не обещанными.

Особенность Win32 Gtk2 Qt Cocoa Carbon
Выбор цвета и стиля шрифта Да Да Да Да Да
Цвет фона шрифта Да Да Да Да Нет
Подстрочный, надстрочный [текст] Да Да Нет Нет Нет
[функция] GetStyleRange Да Да Нет Да Да
Выравнивание абзаца Да Да Да Да Почти невозможно
Метрика абзаца Да Да Нет Да Почти невозможно
Отступы абзаца Да Да Нет Да Нет
Масштабирование Да не завершено Нет Да Нет
Печать Да Нет Нет Нет Нет
Загрузка/сохранение RTF OS RichMemo Нет OS OS
Возможность вставки Да Да Нет Нет Нет

Win32

RichMemo without Theme patch
RichMemo with Theme
  • RichEdit используется в качестве системного виджета. Последний известный .dll загружается и инициализируется при запуске. Обратите внимание, что RichEdit 1.0 не поддерживает большинство функций.
  • Внутренняя оболочка RichEditManager предоставляется для совместимости с Win 9x. Однако это никогда не испытывалось и не проверялось. Также ожидается, что объект TOM может быть упакован как одна из реализаций RichEditManager. Однако имеющийся на месте «менеджер» может быть полностью удален.
  • Согласно Интернету, элемент управления RichEdit не был обновлен Microsoft для поддержки рисования тем (начиная с XP и до Windows 8.1). Таким образом, RichEdit всегда может выглядеть как старый Win9x в 3D-элементе управления. На основе патча, предоставленного в опубликованной проблеме способ переопределить WM_NCPAINT был представлен в r4153.

Win32RichMemo предоставляет глобальную переменную NCPaint. Это обработчик рисования не-клиентской области. По умолчанию он пытается нарисовать тематическую границу (см. Win32RichMemo.ThemedNCPaint для реализации). Он обеспечивает хорошие результаты по темам Windows XP, но в более поздних темах (где используются анимация) результаты не так хороши и должны быть обновлены.

Чтобы система могла выполнять только NCPaint (т.е. реализация LCL вызывает проблемы или новые окна обновляли RichEdit для правильного рисования границ), вы можете изменить значение NCPaint во время выполнения, сбросив его в nil:

 uses
   RichMemo, ..
   {$ifdef WINDOWS}
   Win32RichMemo
   {$endif}
 
 initialization
   {$ifdef WINDOWS}
   Win32RichMemo.NCPaint:=nil;
   {$endif}

Вы также можете предоставить собственную реализацию NCPaint. Однако, если вы реализуете правильную анимацию рисунка темы, пожалуйста, предоставьте патч.

Поведение зависит от реализации Windows и не должно (и не будет) частью интерфейса RichMemo.

Gtk2

  • В качестве системного виджета используется GtkTextView.
  • Subscript и Superscript изначально не поддерживаются, в gtk2richmemo реализован дополнительный код для их реализации.
  • Маркированные и нумерованные списки эмулируются.

Gtk3

API между Gtk2 и Gtk3 на самом деле не отличаются. Основное отличие в отрисовке. Для Gtk3 активно используется Cairo Canvas. Единственная область, на которую это влияет - "внутренности". Если кто-то хочет внести свой вклад в реализацию Gtk2 - пожалуйста, создайте отдельные модули gtk3richmemoXXX. Не нужно создавать {$ ifdefs} в модулях gtk2.

Cocoa

  • Для Cocoa в качестве системного виджета используется NSTextView.
  • Не каждое семейство шрифтов предоставляет «курсивный» шрифт. Таким образом, даже если вы передадите fsItalic как часть Style для шрифта, он может быть проигнорирован.

Qt

  • Используется QTextEdit виджет. В современных C-отображениях для Qt отсутствует множество API-интерфейсов RichText, поэтому полная реализация в настоящее время невозможна.
  • Следующие классы должны быть сопоставлены с C-функциями:
    • QTextBlockFormatH необходим для выравнивания абзацев (например, отступы абзаца, межстрочный интервал и табуляции). QTextEdit предоставляет только выравнивание абзаца.
    • QTextCharFormatH необходим для дополнительного форматирования символов (то есть вертикальное выравнивание, поддержка ссылок). QTextEdit предоставляет только стили шрифтов.

См. также

  • RichMemo/Features - комментирует некоторые функции в процессе.
  • RichMemo/WorkArounds - некоторые заметки о функциях еще не завершены.
  • RichMemo/Defines - дополнительные переключатели пакетов, которые позволяют решить проблемы компиляции/времени выполнения
  • RichMemo/Samples - еще примеры
  • MyNotex приложение, которое использует модифицированный пакет Massimo Nardello RichMemo для Linux-Gtk2
  • TMemo
  • KMemo control