Sign in Join
Wiki copytemporary

RichMemo/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: RichMemo/ru

OldNewLine
1+<figure>
2+<img src="richmemosample.png" title="RichMemo macosx screenshot. Thanks to Dominique Louis" />
3+<figcaption>RichMemo macosx screenshot. Thanks to Dominique Louis</figcaption>
4+</figure>
5+
6+**RichMemo** - это пакет, который включает компонент для замены компонента Delphi TRichEdit. Он разработан кросс-платформенным способом, поэтому его реализация возможна для следующих платформ: Win32, MacOSX и Linux. Поскольку [[RichMemo/ru|кроссплатформенность]] является основной целью, нативный API RichMemo может быть [[RichMemo/ru|расширен]], чтобы сделать его совместимым с Delphi RichEdit.
7+
8+Его основными характеристиками являются:
9+
10+- Подсветка текста
11+- Системная поддержка редактирования Юникода
12+
13+Планируется: (исправления приветствуются)
14+
15+- Добавление изображений в текст
16+- Встраивание элементов управления LCL?
17+
18+Загружаемый файл содержит компонент, установочный пакет и демонстрационное приложение, которое иллюстрирует возможности компонента, а также некоторые инструменты для оценки диаграммы в данной системе.
19+
20+Пожалуйста, добавляйте ваши багрепорты/функции на [Github](https://github.com/skalogryz/richmemo/issues).
21+
22+## Лицензия
23+
24+Автор: Дмитрий 'скалогрыз' Бояринцев
25+
26+[modified](http://svn.freepascal.org/svn/lazarus/trunk/COPYING.modifiedLGPL) [LGPL](http://svn.freepascal.org/svn/lazarus/trunk/COPYING.LGPL) (так же, как FPC RTL и Lazarus LCL). Вы можете связаться с автором, если измененный LGPL не работает с вашим проектом лицензирования.
27+
28+## Загрузка
29+
30+Последняя версия доступна здесь:
31+
32+[`https://github.com/skalogryz/richmemo`](https://github.com/skalogryz/richmemo)
33+
34+Прим.перев.: Существует также [форк](https://github.com/mrandreastoth/richmemo) данного компонента на гитхабе от [Andreas Toth](https://github.com/mrandreastoth) aka mrandreastoth.
35+
36+## Change Log
37+
38+- Version 1.0.0 22th Jun 2009
39+- Version 0.8.0 Jun 2009
40+
41+## Зависимости / Системные требования
42+
43+- Lazarus 1.0.0
44+
45+Статус: выпущен.
46+
47+## Установка
48+
49+- Скачайте исходники пакета
50+- Установите пакет в Lazarus и пересоберите его
51+- TRichMemo добавится в закладку 'Common Controls'.
52+
53+<figure>
54+<img src="RichMemoPalette.PNG" title="RichMemoPalette.PNG" />
55+<figcaption>RichMemoPalette.PNG</figcaption>
56+</figure>
57+
58+## TRichMemo
59+
60+### Параметры шрифта
61+
62+Параметры шрифта обычно представлены записью `TFontParams`. Тип используется для описания атрибутов шрифта **rich**. Некоторые атрибуты выходят за рамки класса `TFont`, поэтому необходим дополнительный тип. Однако большинство типов данных, связанных с `TFont`, используются повторно (т.е. `TFontStyles`).
63+
64+- `Name` - название шрифта (семейство).
65+- `Size` - размер шрифта в пунктах (передача отрицательного значения может привести к неожиданным результатам).
66+- `Color` - цвет шрифта.
67+- `Style` - стили шрифта, включая полужирный, курсив, зачеркнутый, подчеркивание.
68+- `HasBkClr` - логический флаг, если текст для должен иметь цвет фона (если true, поле BkColor используется, в противном случае BkColor игнорируется). Прозрачность не поддерживается.
69+- `BkColor` - цвет фона (или подсветка) для текста.
70+- `VScriptPos` - вертикальная настройка текста ![](/wiki-images/c/c1/Richmemo_Subsuper.png).
71+ - `vpNormal` - нет особой позиции.
72+ - `vpSubscript` - текст - нижний индекс.
73+ - `vpSuperscript` - текст - верхний индекс.
74+
75+
76+Фактическое вертикальное смещение индексов верх/низ зависит от реализации ОС и в настоящее время не может контролироваться.
77+
78+Вы можете присвоить `FontParams` из структуры `TFont`. Для этого вам нужно использовать функцию `GetFontParams(afont: TFont)`. Обратите внимание, что для большинства элементов управления LCL для `TFont` установлены значения по умолчанию. Это не фактические значения, а скорее указание на то, что следует использовать шрифт по умолчанию для элемента управления (аналогично `crDefault` для `TColor`).
79+
80+Функция `GetFontParams` разрешает имя шрифта по умолчанию и возвращает фактическое имя семейства шрифтов.
81+
82+## Методы
83+
84+### SetTextAttributes
85+
86+``` pascal
87+procedure SetTextAttributes(TextStart, TextLen: Integer; AFont: TFont);
88+```
89+
90+- `TextStart : Integer` - первый символ, который будет изменен
91+- `TextLen : Integer` - количество символов для изменения
92+- `AFont : TFont` - шрифт, который должен быть применен к части текста
93+
94+``` pascal
95+procedure SetTextAttributes(TextStart, TextLen: Integer; const TextParams: TFontParams);
96+```
97+
98+- `TextStart : Integer` - первый символ, который будет изменен
99+- `TextLen : Integer` - количество символов для изменения
100+- `TextParams : TFontParams` - параметры шрифта, которые будут установлены
101+
102+Методы `SetTextureAttributes` изменяют указанный стиль текстового диапазона. Параметры шрифта передаются в обоих методах, параметром `AFont` (объект LCL `TFont`) или `TFontParams` (объявлено в RichMemo)
103+
104+Установка атрибутов текста не меняет текущий выбор. Если необходимо изменить стиль выделенного в данный момент текста, вам следует выбрать `SelStart` и `SelLength` в качестве значений текстового диапазона:
105+
106+``` pascal
107+RichMemo1.SetTextAttributes(RichMemo1.SelStart, RichMemo1.SelLength, FontDialog1.Font);
108+```
109+
110+### GetTextAttributes
111+
112+``` pascal
113+function GetTextAttributes(TextStart: Integer; var TextParams: TFontParams): Boolean; virtual;
114+```
115+
116+- `TextStart : Integer` - позиция символа для запроса параметров шрифта
117+- `var TextParams : TFontParams` - выходное значение, заполненное атрибутами символа шрифта. Если метод завершается неудачно и возвращает `false`, значения поля записи будут неопределенными.
118+
119+Заполняет параметры шрифта символа в позиции `TextStart`. Метод возвращает `True`, если `TextStart` является действительной позицией символа, и `False` в противном случае.
120+
121+### GetStyleRange
122+
123+``` pascal
124+function GetStyleRange(CharPos: Integer; var RangeStart, RangeLen: Integer): Boolean; virtual;
125+```
126+
127+Возвращает диапазон символов с одинаковыми параметрами шрифта, т.е. все символы в диапазоне имеют одинаковые имя, размер, цвет и стили шрифта.
128+
129+- `CharPos : Integer` - символ, который принадлежит диапазону стилей. Позиция не обязательно быть в начале диапазона стилей. Она может быть в середине конца диапазона стилей. Первая позиция символа возвращается параметром `RangeStart`.
130+- `var RangeStart : Integer` - первый символ в диапазоне
131+- `var RangeLen : Integer` - количество символов в диапазоне
132+
133+Метод возвращает `true` в случае успеха. Метод возвращает `false`, если `CharPos` имеет неправильное значение - больше доступных символов или какая-либо другая ошибка.
134+
135+### CharAtPos
136+
137+``` pascal
138+function CharAtPos(x,y: Integer): Integer; virtual;
139+```
140+
141+Возвращает смещение символа от нулевой позиции (не позиция UTF8). Возвращает -1 в случае неудачи.
142+
143+- `x, y` - точка в клиентской области элемента управления RichMemo.
144+
145+Метод знает о состоянии прокрутки элемента управления. Таким образом, два вызова `CharAtPos(0,0)` могут возвращать разные значения, если между вызовами изменяется позиция прокрутки. Смотрите "examples/hittest" для \[получения\] примера использования.
146+
147+Если указанные `x,y` будут вне содержимого RichMemo, возвращаемое значение \[будет\] неопределенным. \[Поведение\] остается \[на усмотрение\] набора виджетов, который либо возвращает -1, либо закрывает доступный символ.
148+
149+### SetRangeColor
150+
151+``` pascal
152+procedure SetRangeColor(TextStart, TextLength: Integer; FontColor: TColor);
153+```
154+
155+Метод устанавливает цвет символов в указанном диапазоне для FontColor. Другие параметры шрифта (имя, размер, стили) остаются без изменений.
156+
157+- `TextStart: Integer` - первый символ в диапазоне
158+- `TextLength: Integer` - количество символов в диапазоне
159+- `FontColor: TColor` - цвет, который должен быть установлен
160+
161+### SetRangeParams
162+
163+``` pascal
164+ procedure SetRangeParams(TextStart, TextLength: Integer; ModifyMask: TTextModifyMask;
165+ const fnt: TFontParams; AddFontStyle, RemoveFontStyle: TFontStyles); overload;
166+```
167+
168+Метод изменяет параметры шрифта в указанном диапазоне.
169+
170+- `TextStart` - первый символ в диапазоне
171+- `TextLength` - количество символов в диапазоне
172+- `ModifyMask` - показывает, какие именно атрибуты шрифта должны быть обновлены. Маска принимает любую комбинацию из следующих значений:
173+ - `tmm_Color` - Цвет шрифта будет изменен (поле `fnt.Color` должно быть заполнено)
174+ - `tmm_Name` - имя шрифта будет изменено (поле `fnt.Name` должно быть заполнено)
175+ - `tmm_Size` - размер шрифта будет изменен (поле `fnt.Size` должно быть заполнено)
176+ - `tmm_Styles` - стили шрифта будут изменены в соответствии с параметрами `AddFontStyle, RemoveFontStyle`
177+ - `tmm_BackColor` - Цвет подсветки текста (фона) будет изменен. (поля `fnt.HasBkClr` и `fnt.BkColor` должны быть заполнены)
178+ - Отправка пустой маски приведет к возврату метода без внесения каких-либо изменений.
179+- `fnt` - Параметры шрифта, которые будут использоваться, в зависимости от значений `ModifyMask`.
180+- `AddFontStyle` - набор стилей, которые должны применяться к диапазону (используется только если `tmm_Style`s в `ModifyMask`, в противном случае игнорируется)
181+- `RemoveFontStyle` - набор стилей шрифта должен быть удален из диапазона (используется только если `tmm_Styles` в `ModifyMask`, в противном случае игнорируется)
182+
183+``` pascal
184+procedure SetRangeParams(TextStart, TextLength: Integer;
185+ ModifyMask: TTextModifyMask; const FontName: String;
186+ FontSize: Integer; FontColor: TColor;
187+ AddFontStyle, RemoveFontStyle: TFontStyles);
188+```
189+
190+Перегруженная версия метода. Это просто оболочка вокруг параметра, использующая структуру `TFontParams`. Метод не поддерживает изменение цвета фона, вы должны использовать версию `TFontParams`
191+
192+- `FontName` - имя шрифта, которое должно быть установлено (используется только если `tmm_Name` в `ModifyMask`, в противном случае игнорируется)
193+- `FontColor` - Цвет шрифта, который должен быть установлен (используется только если `tmm_Color` в `ModifyMask`, в противном случае игнорируется)
194+
195+Например, если используется следующий код
196+
197+```delphi
198+ RichMemo1.SetRangeParams (
199+ RichMemo1.SelStart, RichMemo1.SelLength,
200+ [tmm_Styles, tmm_Color], // только изменение цвета и стиля
201+ '', // имя шрифта - оно не используется, поэтому мы можем оставить его пустым
202+ 0, // размер шрифта - это размер шрифта, мы можем оставить его пустым
203+ clGreen, // сделать весь текст в выбранной области зеленым цветом
204+ [fsBold, fsItalic], // добавление жирного и курсивного стилей
205+ []
206+ );
207+```
208+
209+### GetParaAlignment
210+
211+Получает выравнивание абзаца
212+
213+``` pascal
214+function GetParaAlignment(TextStart: Integer; var AAlign: TParaAlignment): Boolean;
215+```
216+
217+- `TextStart` - позиция символа, который принадлежит абзацу
218+- `AAlign` - получение выравнивания абзаца.
219+
220+**Примечание**:
221+
222+- Win32 - выравнивание по ширине не работает в Windows XP и более ранних версиях.
223+- OSX - из-за ограничений Carbon, это не работает в Carbon, но работает для виджетов Cocoa.
224+
225+### SetParaAlignment
226+
227+Устанавливает выравнивание абзаца
228+
229+``` pascal
230+procedure SetParaAlignment(TextStart, TextLen: Integer; AAlign: TParaAlignment);
231+```
232+
233+**Примечание**:
234+
235+- Win32 - выравнивание по ширине не работает в Windows XP и более ранних версиях.
236+- OSX - из-за ограничений Carbon, это не работает в Carbon, но работает для виджетов Cocoa. Также необходимо, чтобы правильное выравнивание было загружено из файла RTF.
237+
238+### GetParaMetric
239+
240+Возвращает отступ метрики абзаца для данного абзаца ![](/wiki-images/b/be/Richmemo_parametric.PNG)
241+
242+- `FirstLine` - смещение для первой строки (в пунктах) абзаца от начала элемента управления \[(т.н. "красная строка")\]
243+- `TailIndent` - смещение для каждой строки (в пунктах), за исключением первой строки, абзаца от конца элемента управления
244+- `HeadIndent` - смещение для каждой строки (в пунктах) абзаца от начала элемента управления
245+- `SpaceBefore` - дополнительное место перед абзацем (в пунктах)
246+- `SpaceAfter` - дополнительное место после абзаца (в пунктах)
247+- `LineSpacing` - коэффициент, используемый для расчета межстрочного интервала между строками в абзаце. Коэффициент применяется к размеру шрифта (самый высокий в строке), а не к высоте строки. Таким образом, это соответствует свойству CSS line-height. Обратите внимание, что нормальный межстрочный интервал равен 1,2. То есть шрифт размером 12 пт, фактический межстрочный интервал (равный 1,2) приведет к высоте строки 14 пт.
248+ - не поддерживается в WinXP или более ранних версиях
249+ - в большинстве систем не будет разрешено, если для межстрочного интервала установлено значение меньше 1,2. Значение будет проигнорировано, и оно по умолчанию будет равно 1,2
250+
251+**Примечание**
252+
253+- Параметры абзаца RichEdit указываются в пикселях, а не в точках, поэтому вам нужно либо преобразовать эти размеры самостоятельно, либо использовать метод RichMemoHelper.
254+- обозначение смещений «влево»/«вправо» исключено, чтобы избежать путаницы для RTL.
255+
256+``` pascal
257+function GetParaMetric(TextStart: Integer; var AMetric: TParaMetric): Boolean;
258+```
259+
260+### SetParaMetric
261+
262+Устанавливает метрики абзаца
263+
264+``` pascal
265+procedure SetParaMetric(TextStart, TextLen: Integer; const AMetric: TParaMetric);
266+```
267+
268+Рекомендуется использовать функцию `InitParaMetric` для инициализации структуры `TParaMetric`. В противном случае обнуление структуры равно ее размеру (т.е. достаточно `FillChar(m, sizeof(TParaMetric), 0)`. Если значения `TParaMetric` получены из вызова `GetParaMetric`, то структура считается правильно инициализированной).
269+
270+### GetParaRange
271+
272+Возвращает диапазон символов для абзаца. Абзац идентифицируется символом.
273+
274+``` pascal
275+ function GetParaRange(CharOfs: Integer; var ParaRange: TParaRange): Boolean;
276+ function GetParaRange(CharOfs: Integer; var TextStart, TextLength: Integer): Boolean;
277+```
278+
279+`CharOfs` - символ, который принадлежит абзацу, диапазон которого возвращается. `TParaRange` - это структура, которая возвращает 3 поля
280+
281+- `start` - первый символ в абзаце
282+- `lengthNoBr` - длина абзаца, за исключением символа разрыва строки
283+- `length` - длина абзаца, включая разрыв строки, если присутствующая последняя строка в элементе управления не содержит символа перевода строки, следовательно, `длина = lengthNoBr`.
284+
285+### SetParaTabs
286+
287+Устанавливает набор табуляций для абзацев указанной длины.
288+
289+``` pascal
290+ procedure SetParaTabs(TextStart, TextLen: Integer; const AStopList: TTabStopList);
291+```
292+
293+- `TextStart`
294+- `TextLen`
295+- `AStopList` - структура, которая содержит массив табуляций.
296+ - `Count` - указывает количество инициализированных элементов.
297+ - `Tabs` - массив содержит описание каждой позиции табуляции, состоящее из `Offset` и `Alignment`.
298+ - `Offset` - смещение точки табуляции в пунктах (с левой стороны элемента управления)
299+ - `Align` - выравнивание позиции табуляции (`tabLeft` - по умолчанию, `tabCenter, tabRight, tabDecimal`).
300+
301+**Примечание**
302+
303+Renamefest
304+до r4140 перечисляемыми значениями `TTabAlignment` были `taLeft, taCenter, taRight, taDecimal`, но они вступали в противоречие с объявлениями `Classes.TAlignment`. Таким образом суффикс был изменен.
305+
306+win32
307+позволяет не более 32 табуляций
308+
309+gtk2
310+поддерживается только выравнивание `tabLeft`
311+
312+carbon
313+не реализовано
314+
315+### GetParaTabs
316+
317+Получает массив табуляции. Если конкретные вкладки не указаны (по умолчанию виджет табуляции), счетчик AStopList будет установлен в 0.
318+
319+``` pascal
320+ function GetParaTabs(CharOfs: Integer; var AStopList: TTabStopList): Boolean;
321+```
322+
323+### SetRangeParaParams
324+
325+Выборочно устанавливает метрики абзаца
326+
327+``` pascal
328+ procedure SetRangeParaParams(TextStart, TextLength: Integer; ModifyMask: TParaModifyMask; const ParaMetric: TParaMetric);
329+```
330+
331+- `TextStart` - символ первого абзаца, чтобы тоже применить стиль
332+- `TextLength` - количество символов, которые должны изменить свойства абзаца
333+- `ModifyMask` - Маска определяет, какой показатель должен быть установлен для каждого абзаца в блоке `TextStart..TextLength`.Другие символы останутся без изменений. Являются членами набора
334+ - `pmm_FirstLine` - изменяет отступ первой строки. Поле `FirstLine` константы `ParaMetric` должно быть инициализировано
335+ - `pmm_HeadIndent` - изменяет отступ абзаца с головы. Поле `HeadIndent` константы `ParaMetric` должно быть инициализировано
336+ - `pmm_TailIndent` - изменяет отступ абзаца с хвоста. Поле `TailIndent` константы `ParaMetric` должно быть инициализировано
337+ - `pmm_SpaceBefore` - меняет пробел до абзаца. Поле `SpaceBefore` константы `ParaMetric` должно быть инициализировано
338+ - `pmm_SpaceAfter` - меняет пробел после (ниже) абзаца. Поле `SpaceAfter` константы `ParaMetric` должно быть инициализировано
339+ - `pmm_LineSpacing` - межстрочный интервал внутри абзаца. Поле `LineSpace` константы `ParaMetric` должно быть инициализировано
340+- `ParaMetric` - структура, содержащая значения, которые будут установлены. Только поля, указанные \[структурой\] `ModifyMask` должны быть инициализированы
341+
342+### LoadRichText
343+
344+``` pascal
345+function LoadRichText(Source: TStream): Boolean; virtual;
346+```
347+
348+- `Source: TStream` - поток для чтения данных из форматированного текста
349+
350+Метод загружает данные в формате RTF из указанного потока. Возвращает true в случае успеха и false в противном случае. Если source равно nil, метод возвращает false.
351+
352+Содержимое TRichMemo полностью заменяется содержимым в исходном потоке. Текущий выбор текста сбрасывается.
353+
354+### SaveRichText
355+
356+``` pascal
357+function SaveRichText(Dest: TStream): Boolean; virtual;
358+```
359+
360+- `Source: TStream` - поток для записи данных форматированного текста
361+
362+Метод сохраняет RTF-кодированные данные в указанном потоке. Возвращает true в случае успеха и false в противном случае. Если source равно nil, метод возвращает false.
363+
364+Текущее состояние TRichMemo не меняется после возврата метода.
365+
366+### Search
367+
368+``` pascal
369+function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions): Integer;
370+```
371+
372+- `ANiddle: string` - текст для поиска.
373+- `Start: Integer` - позиция символа, с которой начинается поиск, если -1 или 0 - поиск сначала.
374+- `Len: Integer` - длина (в символах, а не в байтах) текста для поиска посередине.
375+- `SearchOpt: TSearchOptions`
376+ - `soMatchCase` - поиск с учетом регистра.
377+ - `soBackward` - поиск от конца документа до символа, обозначенного параметром "Start".
378+ - `soWholeWord` - поиск всего слова.
379+
380+Метод возвращает положение символа найденной подстроки. Позиция подходит для использования в свойстве `SelStart`. Тем не менее, может быть невозможно использовать для операции прямого копирования, если в коде присутствуют символы Unicode. Вместо этого следует использовать UTF8Copy.
381+
382+Если `ANiddle` не был найден в тексте, возвращается -1
383+
384+``` pascal
385+function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions;
386+ var TextStart, TextLength: Integer): Boolean;
387+```
388+
389+(Метод введен с r5115)
390+
391+- `ANiddle: string` - текст для поиска.
392+- `Start: Integer` - позиция символа, с которой начинается поиск, если -1 или 0 - поиск сначала.
393+- `Len: Integer` - длина (в символах, а не в байтах) текста для поиска посередине.
394+- `SearchOpt: TSearchOptions`
395+ - `soMatchCase` - поиск с учетом регистра
396+ - `soBackward` - поиск от конца документа до символа, обозначенного параметром "Start".
397+ - `soWholeWord` - поиск всего слова.
398+- `(output) ATextStart` - позиция найденного текста (в символах)
399+- `(output) ATextLength` - длина найденного текста (в символах (позиции курсора!))
400+
401+Метод возвращает значение true, если искомая подстрока найдена, в противном случае - значение false.
402+
403+Возвращенные значения `ATextStart` и `ATextLength` подходят для использования в свойствах `SelStart` и `SelLength`.
404+
405+> **Note:** для сложных сценариев найденный текст может совпадать с искомой подстрокой. Поведение поиска (в сложных сценариях) зависит от набора виджетов. Таким образом, поиск одной и той же строки в разных наборах виджетов (например, win32 или gtk2) может привести к разным результатам. Если вам нужны одинаковые результаты и вы их не получили, создайте отчет об ошибке.
406+
407+Если вам нужно извлечь найденный текст, вы должны использовать метод `GetText()` (передавая значения `ATextStart` и `ATextLength`).
408+
409+### GetText, GetUText
410+
411+``` pascal
412+ function GetText(TextStart, TextLength: Integer): String;
413+ function GetUText(TextStart, TextLength: Integer): UnicodeString;
414+```
415+
416+- `TextStart: Integer` -позиция символа для начала извлечения (0 - это первый символ в тексте).
417+- `TextLength: Integer` - длина (в символах, а не в байтах) текста для извлечения
418+
419+`GetText()` возвращает подстроку UTF8
420+
421+`GetUText()` возвращает подстроку UTF16
422+
423+Текущее выделение не будет зависеть от операции. (Если вы видите, что выделение пострадало, пожалуйста, сообщите о проблеме).
424+
425+Вы не должны учитывать \[абстрактную\] эффективность любого метода. Например, WinAPI внутренне работает с символами UTF16, поэтому `GetUText()` **может** быть более эффективным для него. В то время как Gtk2 работает с UTF8 и вызов `GetText()` **может** быть более эффективным для него. Вместо того, чтобы думать о базовой системе, вы должны учитывать потребности вашей задачи.
426+
427+### Redo
428+
429+``` pascal
430+ procedure Redo;
431+```
432+
433+Метод восстанавливает последнее предыдущее изменение [undone](http://lazarus-ccr.sourceforge.net/docs/lcl/stdctrls/tcustomedit.undo.html).
434+
435+Вы всегда можете вызвать для проверки [[RichMemo/ru|CanRedo]], если есть какие-либо действия\[, которые\] могут быть переделаны.
436+
437+## Свойства
438+
439+### ZoomFactor
440+
441+``` pascal
442+property ZoomFactor: double
443+```
444+
445+Read/Write свойство. Управляет масштабированием содержимого RichMemo. 1.0 - без увеличения. Менее \< 1,0 - уменьшить масштаб, более 1,0 - увеличить масштаб. Если установлено 0 - \[приводится к\] значению по умолчанию равным 1,0 коэффициенту масштабирования (без увеличения).
446+
447+### HideSelection
448+
449+``` pascal
450+property HideSelection: Boolean default false
451+```
452+
453+Read/Write свойство. Если True, то выделение RichMemo скрыто, пока элемент управления не в фокусе. Если False, выделение отображается постоянно.
454+
455+### CanRedo
456+
457+``` pascal
458+property CanRedo: Boolean
459+```
460+
461+Если \[возвращаемое значение\] True, в очереди отмены есть действия, которые можно повторить. Если \[возвращаемое\] значение False, в очереди отмены нет действий, которые можно повторить. Вызов Redo не будет иметь никакого эффекта.
462+
463+### RTF
464+
465+``` pascal
466+property Rtf: String
467+```
468+
469+Read/Write свойство, которое позволяет читать или записывать текст в формате RTF для всего элемента управления. Назначение свойства - иметь возможность устанавливать Rich-Text во время разработки, однако свойство также будет работать во время выполнения.
470+
471+<figure>
472+<img src="RtfEditor.PNG" title="RtfEditor.PNG" width="400" />
473+<figcaption>RtfEditor.PNG</figcaption>
474+</figure>
475+
476+Если значение свойства является пустой строкой, то свойство Lines используется как простой текст для инициализации значения элемента управления во время загрузки.
477+
478+> **Note:** Свойство доступно только в классе TRichMemo, оно недоступно (или вообще не реализовано) в классе TCustomRichMemo. Рекомендуется использовать LoadRichText/SaveRichText для изменения содержимого страницы только потому, что они могут занимать меньше памяти, чем копирование всего расширенного текста в память.
479+
480+> **Note:** **для кроссплатформенной и прямой совместимости** - в настоящее время свойство реализовано на основе набора виджетов, обеспечивающего чтение/запись в формате Rich-text. Весьма вероятно, что в ближайшем будущем оно будет изменено на использование кода чтения/записи RichMemo только RTF-stream. Проблема в том, что старые системы могут не поддерживать последнюю версию RTF.
481+
482+Так что прямо сейчас вы можете столкнуться с проблемой, когда вы создадите проект в Gtk2 и сохраните richmemo время разработки, содержащее символы Unicode. Затем, если вы попытаетесь загрузить его на компьютер с XP и использовать собственный загрузчик widgetset, вы можете увидеть символы, отсутствующие или неправильно отображенные. Переход на использование \[механизмов\] RichMemo загрузки/сохранения RTF предотвратит эту проблему. В настоящее время вы также можете избежать этого, зарегистрировав загрузчики RichMemo (вызовите процедуры RegisterRTFLoader, RegisterRTFSaver при инициализации проекта перед загрузкой любого RichMemo)
483+
484+## События
485+
486+### OnSelectionChange
487+
488+``` pascal
489+property OnSelectionChange: TNotifyEvent
490+TNotifyEvent = procedure (Sender: TObject) of object;
491+```
492+
493+Событие запускается всякий раз, когда в RichMemo изменяется выделение: либо программно, либо из-за действий пользователя.
494+
495+## TRichEditForMemo
496+
497+Помощник класса, который реализует программный интерфейс RichEdit. Помощник объявлен в модуле RichEditHelpers, поэтому вы должны добавить его в раздел использования. Помощники доступны в FPC 2.6.0 или старше.
498+
499+### Методы
500+
501+#### FindText
502+
503+Поиск заданного диапазона в тексте для целевой строки
504+
505+### Свойства
506+
507+#### SelAttributes
508+
509+Читает/Изменяет атрибуты символа текущего выделения
510+
511+### Paragraph
512+
513+Читает/Изменяет атрибуты абзаца текущего выделения.
514+
515+### RichMemoUtils
516+
517+Представлен модуль, добавляющий некоторые полезные функции, специфичные для ОС, для работы с RichMemo.
518+
519+#### InsertImageFromFile
520+
521+`function InsertImageFromFile (const ARichMemo: TCustomRichMemo; APos: Integer;`\
522+`    const FileNameUTF8: string;`\
523+`    const AImgSize: TSize`\
524+`): Boolean = nil;`
525+
526+*<u>Отказ от ответственности</u>: функция будет вставлять файл изображения в RichMemo (если он реализован набором виджетов), но очень неэффективным способом. Изображение будет прочитано снова, и память будет перераспределяться для изображения каждый раз. Поэтому, пожалуйста, не используйте его для смайликов в чате. Наилучшим \[выбором будет\] API (с кэшированием данных). (Вот почему этот метод не является частью класса TCustomRichMemo).*
527+
528+- `APos` - позиция в тексте
529+- `AImgSize` - размер, который нужно выставлять в **ТОЧКАХ**, а не в пикселях! Если и `cx`, и `cy` равны 0, размер изображения не будет изменен вообще. Если только один \[из размеров\] - `cx, cy` - равен нулю, результаты \[будут\] неопределенными.
530+
531+Есть также служебная функция **InsertImageFromFileNoResize**, которая вызывает InsertImageFromFile, передавая размер как 0.
532+
533+Пример использования
534+
535+``` pascal
536+ procedure TForm1.Button1Click(Sender: TObject);
537+ begin
538+ // вызов диалога для выбора картинки для вставки
539+ if OpenDialog1.Execute then
540+ // вставка картинки в текущую позицию курсора RichMemo
541+ InsertImageFromFileNoResize(RichMemo1, RichMemo1.SelStart, OpenDialog1.FileName);
542+ end;
543+```
544+
545+### InsertStyledText, InsertColorStyledText, InsertFontText
546+
547+Набор функций, которые упрощают добавление и замену стилизованного текста. Указанный стиль текста применяется к вставке. Общее правило для всех функций, если `InsPos` (позиция вставки) отрицательна - текст добавляется в конец. Для вставки текста в начало теста `InsPos` должна быть установлена в 0.
548+
549+Вставленный текст не обязательно должен находиться на новой строке или добавлять новую строку. Возможно, вы захотите добавить символ `LineFeed` в параметр `TextUTF8`, чтобы вставленный текст был новой строкой.
550+
551+``` pascal
552+procedure InsertStyledText(
553+ const ARichMemo: TCustomRichMemo;
554+ const TextUTF8: String;
555+ AStyle: TFontStyles;
556+ InsPos : Integer = -1 )
557+```
558+
559+`InsertStyledText` вставляет стилизованный текст в указанную позицию.
560+
561+``` pascal
562+procedure InsertColorStyledText(
563+ const ARichMemo: TCustomRichMemo;
564+ const TextUTF8: String;
565+ AColor: TColor;
566+ AStyle: TFontStyles;
567+ InsPos : Integer = -1 )
568+```
569+
570+`InsertColorStyledText` вставляет текст с указанным стилем и цветом в указанной позиции (по умолчанию в конец RichMemo).
571+
572+``` pascal
573+procedure InsertFontText(
574+ const ARichMemo: TCustomRichMemo;
575+ const TextUTF8: String;
576+ const prms: TFontParams;
577+ InsPos : Integer = -1 )
578+```
579+
580+`InsertFontText` вставляет текст и применяет к нему указанные FontParams.
581+
582+Возможно, вы захотите создать помощник класса для реализации этих функций в качестве методов для RichMemo. Осторожно, если вы используете [[RichMemo/ru|Delphi-совместимый помощник]] - вы можете \[попасть\] в конфликт.
583+
584+## Установка
585+
586+- Получить последнюю версию из SVN
587+- Откройте пакет и установите его, пересоберите IDE
588+- TRichMemo будет добавлен на вкладку 'Common Controls'
589+
590+## Часто задаваемые вопросы
591+
592+### Использование RichMemo в общих библиотеках
593+
594+[Issue \#17412](http://bugs.freepascal.org/view.php?id=17412) Если вам нужно использовать компонент в разделяемой библиотеке, вам может понадобиться добавить ключ -fPIC к опции компилятора «пакета» и «проекта».
595+
596+## (Delphi) RichEdit-подобный интерфейс
597+
598+[Issue \#14632](http://bugs.freepascal.org/view.php?id=14632) Типичная проблема - портирование существующего кода, использующего RichEdit из Delphi. Интерфейс RichMemo не совпадает с RichEdit во многих отношениях. Но есть два способа справиться с этим:
599+
600+- вы можете создать подкласс из TCustomRichMemo (или RichMemo) и реализовать методы Delphi RichEdit;
601+- вы можете использовать модуль RichMemoHelpers (требуется fpc 2.6.0 или более поздняя версия) и использовать методы, предоставляемые классом Helpers; в настоящее время реализованы свойства SelAttributes и Paragraph.
602+
603+``` pascal
604+ uses ... RichMemo, RichMemoHelpers;
605+
606+ TForm = class
607+ RichMemo1 : TRichMemo;
608+
609+ // Свойство SelAttributes недоступно в базовом классе,
610+ // но добавлено помощником, определенным в модуле RichMemoHelpers
611+ RichMemo1.SelAttributes.Name := 'Courier New';
612+```
613+
614+## Добавление смешанного цветного текста в конец RichMemo
615+
616+Если вам просто нужна простая раскраска, то вот пример, который будет каждый раз добавлять новую строку со случайным цветом (протестировано в Windows):
617+
618+``` pascal
619+ procedure TForm1.Button1Click(Sender: TObject);
620+ var
621+ i, j: integer;
622+ str: string;
623+ begin
624+ with Richmemo1 do
625+ begin
626+ str := 'Newline text';
627+ i := Length(Lines.Text) - Lines.Count; // CR(перевод каретки) как #10#13 считается только один раз, так что вычтите его один раз
628+ j := Length(str) + 1; // +1 сделать CR в том же формате
629+ Lines.Add(str);
630+ SetRangeColor(i, j, Round(random * $FFFFFF));
631+ end;
632+ end;
633+```
634+
635+` `<span style="color:#0140FF">`Newline text`</span>\
636+` `<span style="color:#507FAF">`NewLine text`</span>\
637+` `<span style="color:#C04A90">`NewLine text`</span>
638+
639+Альтернативный пример простой раскраски (протестировано на Windows):
640+
641+``` pascal
642+ procedure TForm1.Button2Click(Sender: TObject);
643+ begin
644+ with RichMemo1 do
645+ begin
646+ Lines.Add('Line in red');
647+ SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clRed);
648+
649+ Lines.Add('Line in blue');
650+ SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clBlue);
651+
652+ Lines.Add('Normal line.');
653+ Lines.Add('Normal line.');
654+
655+ Lines.Add('Line in green ');
656+ SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clGreen);
657+ end;
658+ end;
659+```
660+
661+` `<span style="color:#FF0000">`Line in red`</span>\
662+` `<span style="color:#0000FF">`Line in blue`</span>\
663+` `<span style="color:#000000">`Normal line.`</span>\
664+` `<span style="color:#000000">`Normal line.`</span>\
665+` `<span style="color:#008000">`Line in green`</span>
666+
667+Если вам нужна смешанная раскраска, то это пример, который добавит новую строку с несколькими разноцветными словами (протестировано в Windows):
668+
669+``` pascal
670+procedure TForm1.Button3Click(Sender: TObject);
671+ procedure AddColorStr(s: string; const col: TColor = clBlack; const NewLine: boolean = true);
672+ begin
673+ with RichMemo1 do
674+ begin
675+ if NewLine then
676+ begin
677+ Lines.Add('');
678+ Lines.Delete(Lines.Count - 1); // избегаем двойного межстрочного интервала
679+ end;
680+
681+ SelStart := Length(Text);
682+ SelText := s;
683+ SelLength := Length(s);
684+ SetRangeColor(SelStart, SelLength, col);
685+
686+ // отменяем выделение вставленной строки и помещаем курсор в конец текста
687+ SelStart := Length(Text);
688+ SelText := '';
689+ end;
690+ end;
691+ begin
692+ AddColorStr('Black, ');
693+ AddColorStr('Green, ', clGReen, false);
694+ AddColorStr('Blue, ', clBlue, false);
695+ AddColorStr('Red', clRed, false);
696+ end;
697+```
698+
699+` `<span style="color:#000000">`Black, `</span><span style="color:#008000">`Green, `</span><span style="color:#0000FF">`Blue, `</span><span style="color:#FF0000">`Red`</span>\
700+` `<span style="color:#000000">`Black, `</span><span style="color:#008000">`Green, `</span><span style="color:#0000FF">`Blue, `</span><span style="color:#FF0000">`Red`</span>\
701+` `<span style="color:#000000">`Black, `</span><span style="color:#008000">`Green, `</span><span style="color:#0000FF">`Blue, `</span><span style="color:#FF0000">`Red`</span>
702+
703+## Разбор языка разметки
704+
705+![mlparse example](/wiki-images/8/8c/Mlparse.png) Нативные элементы управления rich-edit не поддерживают синтаксический анализ языка разметки.
706+
707+Вам нужно написать эту \[функциональность\] самостоятельно, как показано в примере с mlparse.
708+
709+## Что внутри
710+
711+### Матрица поддержки платформы
712+
713+Ожидается, что значения в матрице не будут статическими (за исключением столбца "carbon"), каждая система должна поддерживать все функции, объявленные RichMemo.
714+
715+Обратите внимание, что таблица содержит больше функций, чем опубликовано выше. Это означает, что API-интерфейсы уже доступны в RichMemo, но, поскольку они нестабильны (на некоторых платформах), они считаются «экспериментальными», а не обещанными.
716+
717+| Особенность | Win32 | Gtk2 | Qt | Cocoa | Carbon |
718+|------------------------------------|-------|------|-----|-------|--------|
719+| Выбор цвета и стиля шрифта | | | | | |
720+| Цвет фона шрифта | | | | | |
721+| Подстрочный, надстрочный \[текст\] | | | | | |
722+| \[функция\] GetStyleRange | | | | | |
723+| Выравнивание абзаца | | | | | |
724+| Метрика абзаца | | | | | |
725+| Отступы абзаца | | | | | |
726+| Масштабирование | | | | | |
727+| Печать | | | | | |
728+| Загрузка/сохранение RTF | | | | | |
729+| Возможность вставки | | | | | |
730+
731+### Win32
732+
733+![RichMemo without Theme patch](/wiki-images/e/e9/Rm_win32_notheme.PNG) ![RichMemo with Theme](/wiki-images/1/19/Rm_win32_theme.PNG)
734+
735+- [RichEdit](https://msdn.microsoft.com/en-us/library/windows/desktop/bb787605%28v=vs.85%29.aspx) используется в качестве системного виджета. Последний известный .dll загружается и инициализируется при запуске. Обратите внимание, что RichEdit 1.0 не поддерживает большинство функций.
736+- Внутренняя оболочка RichEditManager предоставляется для совместимости с Win 9x. Однако это никогда не испытывалось и не проверялось. Также ожидается, что объект TOM может быть упакован как одна из реализаций RichEditManager. Однако имеющийся на месте «менеджер» может быть полностью удален.
737+- Согласно Интернету, элемент управления RichEdit не был обновлен Microsoft для поддержки рисования тем (начиная с XP и до Windows 8.1). Таким образом, RichEdit всегда может выглядеть как старый Win9x в 3D-элементе управления. На основе патча, предоставленного в [опубликованной проблеме](http://bugs.freepascal.org/view.php?id=25111) способ переопределить [WM_NCPAINT](https://msdn.microsoft.com/en-us/library/windows/desktop/dd145212%28v=vs.85%29.aspx) был представлен в r4153.
738+
739+Win32RichMemo предоставляет глобальную переменную NCPaint. Это обработчик рисования не-клиентской области. По умолчанию он пытается нарисовать тематическую границу (см. Win32RichMemo.ThemedNCPaint для реализации). Он обеспечивает хорошие результаты по темам Windows XP, но в более поздних темах (где используются анимация) результаты не так хороши и должны быть обновлены.
740+
741+Чтобы система могла выполнять только NCPaint (т.е. реализация LCL вызывает проблемы или новые окна обновляли RichEdit для правильного рисования границ), вы можете изменить значение NCPaint во время выполнения, сбросив его в nil:
742+
743+``` pascal
744+ uses
745+ RichMemo, ..
746+ {$ifdef WINDOWS}
747+ Win32RichMemo
748+ {$endif}
749+
750+ initialization
751+ {$ifdef WINDOWS}
752+ Win32RichMemo.NCPaint:=nil;
753+ {$endif}
754+```
755+
756+Вы также можете предоставить собственную реализацию NCPaint. Однако, если вы реализуете правильную анимацию рисунка темы, пожалуйста, предоставьте патч.
757+
758+Поведение зависит от реализации Windows и не должно (и не будет) частью интерфейса RichMemo.
759+
760+### Gtk2
761+
762+- В качестве системного виджета используется [GtkTextView](https://developer.gnome.org/gtk2/stable/GtkTextView.html).
763+- Subscript и Superscript изначально не поддерживаются, в gtk2richmemo реализован дополнительный код для их реализации.
764+- Маркированные и нумерованные списки эмулируются.
765+
766+### Gtk3
767+
768+API между Gtk2 и [Gtk3](https://developer.gnome.org/gtk3/stable/GtkTextView.html) на самом деле не отличаются. Основное отличие в отрисовке. Для Gtk3 активно используется Cairo Canvas. Единственная область, на которую это влияет - "внутренности". Если кто-то хочет внести свой вклад в реализацию Gtk2 - пожалуйста, создайте отдельные модули gtk3richmemoXXX. Не нужно создавать {\$ ifdefs} в модулях gtk2.
769+
770+### Cocoa
771+
772+- Для Cocoa в качестве системного виджета используется [NSTextView](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTextView_Class/index.html).
773+- Не каждое семейство шрифтов предоставляет «курсивный» шрифт. Таким образом, даже если вы передадите fsItalic как часть Style для шрифта, он может быть проигнорирован.
774+
775+### Qt
776+
777+- Используется [QTextEdit](http://doc.qt.io/qt-4.8/qtextedit.html) виджет. В современных C-отображениях для Qt отсутствует множество API-интерфейсов RichText, поэтому полная реализация в настоящее время невозможна.
778+- Следующие классы должны быть сопоставлены с C-функциями:
779+ - [QTextBlockFormatH](http://doc.qt.io/qt-4.8/qtextblockformat.html) необходим для выравнивания абзацев (например, отступы абзаца, межстрочный интервал и табуляции). QTextEdit предоставляет только выравнивание абзаца.
780+ - [QTextCharFormatH](http://doc.qt.io/qt-4.8/qtextcharformat.html) необходим для дополнительного форматирования символов (то есть вертикальное выравнивание, поддержка ссылок). QTextEdit предоставляет только стили шрифтов.
781+
782+## См. также
783+
784+- [[RichMemo/Features]] - комментирует некоторые функции в процессе.
785+- [[RichMemo/WorkArounds]] - некоторые заметки о функциях еще не завершены.
786+- [[RichMemo/Defines]] - дополнительные переключатели пакетов, которые позволяют решить проблемы компиляции/времени выполнения
787+- [[RichMemo/Samples]] - еще примеры
788+- [MyNotex](https://sites.google.com/site/mynotex) приложение, которое использует модифицированный пакет Massimo Nardello RichMemo для Linux-Gtk2
789+- [[TMemo]]
790+- [[KControls|KMemo control]]
791+
792+---
793+*From the Free Pascal wiki, page "RichMemo/ru", as it stood on 2022-02-28 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history