Sign in Join
Wiki copytemporary

RichMemo/ru: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11![](/wiki-images/5/54/Richmemosample.png)
22
33**RichMemo** - это пакет, который включает компонент для замены компонента Delphi TRichEdit. Он разработан кросс-платформенным способом, поэтому его реализация возможна для следующих платформ: Win32, MacOSX и Linux. Поскольку [[RichMemo/ru|кроссплатформенность]] является основной целью, нативный API RichMemo может быть [[RichMemo/ru|расширен]], чтобы сделать его совместимым с Delphi RichEdit.
44
55Его основными характеристиками являются:
66
77- Подсветка текста
88- Системная поддержка редактирования Юникода
99
1010Планируется: (исправления приветствуются)
1111
1212- Добавление изображений в текст
1313- Встраивание элементов управления LCL?
1414
1515Загружаемый файл содержит компонент, установочный пакет и демонстрационное приложение, которое иллюстрирует возможности компонента, а также некоторые инструменты для оценки диаграммы в данной системе.
1616
1717Пожалуйста, добавляйте ваши багрепорты/функции на [Github](https://github.com/skalogryz/richmemo/issues).
1818
1919## Лицензия
2020
2121Автор: Дмитрий 'скалогрыз' Бояринцев
2222
2323[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 не работает с вашим проектом лицензирования.
2424
2525## Загрузка
2626
2727Последняя версия доступна здесь:
2828
2929[`https://github.com/skalogryz/richmemo`](https://github.com/skalogryz/richmemo)
3030
3131Прим.перев.: Существует также [форк](https://github.com/mrandreastoth/richmemo) данного компонента на гитхабе от [Andreas Toth](https://github.com/mrandreastoth) aka mrandreastoth.
3232
3333## Change Log
3434
3535- Version 1.0.0 22th Jun 2009
3636- Version 0.8.0 Jun 2009
3737
3838## Зависимости / Системные требования
3939
4040- Lazarus 1.0.0
4141
4242Статус: выпущен.
4343
4444## Установка
4545
4646- Скачайте исходники пакета
4747- Установите пакет в Lazarus и пересоберите его
4848- TRichMemo добавится в закладку 'Common Controls'.
4949
5050![](/wiki-images/8/80/RichMemoPalette.PNG)
5151
5252## TRichMemo
5353
5454### Параметры шрифта
5555
5656Параметры шрифта обычно представлены записью `TFontParams`. Тип используется для описания атрибутов шрифта **rich**. Некоторые атрибуты выходят за рамки класса `TFont`, поэтому необходим дополнительный тип. Однако большинство типов данных, связанных с `TFont`, используются повторно (т.е. `TFontStyles`).
5757
5858- `Name` - название шрифта (семейство).
5959- `Size` - размер шрифта в пунктах (передача отрицательного значения может привести к неожиданным результатам).
6060- `Color` - цвет шрифта.
6161- `Style` - стили шрифта, включая полужирный, курсив, зачеркнутый, подчеркивание.
6262- `HasBkClr` - логический флаг, если текст для должен иметь цвет фона (если true, поле BkColor используется, в противном случае BkColor игнорируется). Прозрачность не поддерживается.
6363- `BkColor` - цвет фона (или подсветка) для текста.
6464- `VScriptPos` - вертикальная настройка текста ![](/wiki-images/c/c1/Richmemo_Subsuper.png).
6565 - `vpNormal` - нет особой позиции.
6666 - `vpSubscript` - текст - нижний индекс.
6767 - `vpSuperscript` - текст - верхний индекс.
6868
6969
7070Фактическое вертикальное смещение индексов верх/низ зависит от реализации ОС и в настоящее время не может контролироваться.
7171
7272Вы можете присвоить `FontParams` из структуры `TFont`. Для этого вам нужно использовать функцию `GetFontParams(afont: TFont)`. Обратите внимание, что для большинства элементов управления LCL для `TFont` установлены значения по умолчанию. Это не фактические значения, а скорее указание на то, что следует использовать шрифт по умолчанию для элемента управления (аналогично `crDefault` для `TColor`).
7373
7474Функция `GetFontParams` разрешает имя шрифта по умолчанию и возвращает фактическое имя семейства шрифтов.
7575
7676## Методы
7777
7878### SetTextAttributes
7979
8080``` pascal
8181procedure SetTextAttributes(TextStart, TextLen: Integer; AFont: TFont);
8282```
8383
8484- `TextStart : Integer` - первый символ, который будет изменен
8585- `TextLen : Integer` - количество символов для изменения
8686- `AFont : TFont` - шрифт, который должен быть применен к части текста
8787
8888``` pascal
8989procedure SetTextAttributes(TextStart, TextLen: Integer; const TextParams: TFontParams);
9090```
9191
9292- `TextStart : Integer` - первый символ, который будет изменен
9393- `TextLen : Integer` - количество символов для изменения
9494- `TextParams : TFontParams` - параметры шрифта, которые будут установлены
9595
9696Методы `SetTextureAttributes` изменяют указанный стиль текстового диапазона. Параметры шрифта передаются в обоих методах, параметром `AFont` (объект LCL `TFont`) или `TFontParams` (объявлено в RichMemo)
9797
9898Установка атрибутов текста не меняет текущий выбор. Если необходимо изменить стиль выделенного в данный момент текста, вам следует выбрать `SelStart` и `SelLength` в качестве значений текстового диапазона:
9999
100100``` pascal
101101RichMemo1.SetTextAttributes(RichMemo1.SelStart, RichMemo1.SelLength, FontDialog1.Font);
102102```
103103
104104### GetTextAttributes
105105
106106``` pascal
107107function GetTextAttributes(TextStart: Integer; var TextParams: TFontParams): Boolean; virtual;
108108```
109109
110110- `TextStart : Integer` - позиция символа для запроса параметров шрифта
111111- `var TextParams : TFontParams` - выходное значение, заполненное атрибутами символа шрифта. Если метод завершается неудачно и возвращает `false`, значения поля записи будут неопределенными.
112112
113113Заполняет параметры шрифта символа в позиции `TextStart`. Метод возвращает `True`, если `TextStart` является действительной позицией символа, и `False` в противном случае.
114114
115115### GetStyleRange
116116
117117``` pascal
118118function GetStyleRange(CharPos: Integer; var RangeStart, RangeLen: Integer): Boolean; virtual;
119119```
120120
121121Возвращает диапазон символов с одинаковыми параметрами шрифта, т.е. все символы в диапазоне имеют одинаковые имя, размер, цвет и стили шрифта.
122122
123123- `CharPos : Integer` - символ, который принадлежит диапазону стилей. Позиция не обязательно быть в начале диапазона стилей. Она может быть в середине конца диапазона стилей. Первая позиция символа возвращается параметром `RangeStart`.
124124- `var RangeStart : Integer` - первый символ в диапазоне
125125- `var RangeLen : Integer` - количество символов в диапазоне
126126
127127Метод возвращает `true` в случае успеха. Метод возвращает `false`, если `CharPos` имеет неправильное значение - больше доступных символов или какая-либо другая ошибка.
128128
129129### CharAtPos
130130
131131``` pascal
132132function CharAtPos(x,y: Integer): Integer; virtual;
133133```
134134
135135Возвращает смещение символа от нулевой позиции (не позиция UTF8). Возвращает -1 в случае неудачи.
136136
137137- `x, y` - точка в клиентской области элемента управления RichMemo.
138138
139139Метод знает о состоянии прокрутки элемента управления. Таким образом, два вызова `CharAtPos(0,0)` могут возвращать разные значения, если между вызовами изменяется позиция прокрутки. Смотрите "examples/hittest" для \[получения\] примера использования.
140140
141141Если указанные `x,y` будут вне содержимого RichMemo, возвращаемое значение \[будет\] неопределенным. \[Поведение\] остается \[на усмотрение\] набора виджетов, который либо возвращает -1, либо закрывает доступный символ.
142142
143143### SetRangeColor
144144
145145``` pascal
146146procedure SetRangeColor(TextStart, TextLength: Integer; FontColor: TColor);
147147```
148148
149149Метод устанавливает цвет символов в указанном диапазоне для FontColor. Другие параметры шрифта (имя, размер, стили) остаются без изменений.
150150
151151- `TextStart: Integer` - первый символ в диапазоне
152152- `TextLength: Integer` - количество символов в диапазоне
153153- `FontColor: TColor` - цвет, который должен быть установлен
154154
155155### SetRangeParams
156156
157157``` pascal
158158 procedure SetRangeParams(TextStart, TextLength: Integer; ModifyMask: TTextModifyMask;
159159 const fnt: TFontParams; AddFontStyle, RemoveFontStyle: TFontStyles); overload;
160160```
161161
162162Метод изменяет параметры шрифта в указанном диапазоне.
163163
164164- `TextStart` - первый символ в диапазоне
165165- `TextLength` - количество символов в диапазоне
166166- `ModifyMask` - показывает, какие именно атрибуты шрифта должны быть обновлены. Маска принимает любую комбинацию из следующих значений:
167167 - `tmm_Color` - Цвет шрифта будет изменен (поле `fnt.Color` должно быть заполнено)
168168 - `tmm_Name` - имя шрифта будет изменено (поле `fnt.Name` должно быть заполнено)
169169 - `tmm_Size` - размер шрифта будет изменен (поле `fnt.Size` должно быть заполнено)
170170 - `tmm_Styles` - стили шрифта будут изменены в соответствии с параметрами `AddFontStyle, RemoveFontStyle`
171171 - `tmm_BackColor` - Цвет подсветки текста (фона) будет изменен. (поля `fnt.HasBkClr` и `fnt.BkColor` должны быть заполнены)
172172 - Отправка пустой маски приведет к возврату метода без внесения каких-либо изменений.
173173- `fnt` - Параметры шрифта, которые будут использоваться, в зависимости от значений `ModifyMask`.
174174- `AddFontStyle` - набор стилей, которые должны применяться к диапазону (используется только если `tmm_Style`s в `ModifyMask`, в противном случае игнорируется)
175175- `RemoveFontStyle` - набор стилей шрифта должен быть удален из диапазона (используется только если `tmm_Styles` в `ModifyMask`, в противном случае игнорируется)
176176
177177``` pascal
178178procedure SetRangeParams(TextStart, TextLength: Integer;
179179 ModifyMask: TTextModifyMask; const FontName: String;
180180 FontSize: Integer; FontColor: TColor;
181181 AddFontStyle, RemoveFontStyle: TFontStyles);
182182```
183183
184184Перегруженная версия метода. Это просто оболочка вокруг параметра, использующая структуру `TFontParams`. Метод не поддерживает изменение цвета фона, вы должны использовать версию `TFontParams`
185185
186186- `FontName` - имя шрифта, которое должно быть установлено (используется только если `tmm_Name` в `ModifyMask`, в противном случае игнорируется)
187187- `FontColor` - Цвет шрифта, который должен быть установлен (используется только если `tmm_Color` в `ModifyMask`, в противном случае игнорируется)
188188
189189Например, если используется следующий код
190190
191191```delphi
192192 RichMemo1.SetRangeParams (
193193 RichMemo1.SelStart, RichMemo1.SelLength,
194194 [tmm_Styles, tmm_Color], // только изменение цвета и стиля
195195 '', // имя шрифта - оно не используется, поэтому мы можем оставить его пустым
196196 0, // размер шрифта - это размер шрифта, мы можем оставить его пустым
197197 clGreen, // сделать весь текст в выбранной области зеленым цветом
198198 [fsBold, fsItalic], // добавление жирного и курсивного стилей
199199 []
200200 );
201201```
202202
203203### GetParaAlignment
204204
205205Получает выравнивание абзаца
206206
207207``` pascal
208208function GetParaAlignment(TextStart: Integer; var AAlign: TParaAlignment): Boolean;
209209```
210210
211211- `TextStart` - позиция символа, который принадлежит абзацу
212212- `AAlign` - получение выравнивания абзаца.
213213
214214**Примечание**:
215215
216216- Win32 - выравнивание по ширине не работает в Windows XP и более ранних версиях.
217217- OSX - из-за ограничений Carbon, это не работает в Carbon, но работает для виджетов Cocoa.
218218
219219### SetParaAlignment
220220
221221Устанавливает выравнивание абзаца
222222
223223``` pascal
224224procedure SetParaAlignment(TextStart, TextLen: Integer; AAlign: TParaAlignment);
225225```
226226
227227**Примечание**:
228228
229229- Win32 - выравнивание по ширине не работает в Windows XP и более ранних версиях.
230230- OSX - из-за ограничений Carbon, это не работает в Carbon, но работает для виджетов Cocoa. Также необходимо, чтобы правильное выравнивание было загружено из файла RTF.
231231
232232### GetParaMetric
233233
234234Возвращает отступ метрики абзаца для данного абзаца ![](/wiki-images/b/be/Richmemo_parametric.PNG)
235235
236236- `FirstLine` - смещение для первой строки (в пунктах) абзаца от начала элемента управления \[(т.н. "красная строка")\]
237237- `TailIndent` - смещение для каждой строки (в пунктах), за исключением первой строки, абзаца от конца элемента управления
238238- `HeadIndent` - смещение для каждой строки (в пунктах) абзаца от начала элемента управления
239239- `SpaceBefore` - дополнительное место перед абзацем (в пунктах)
240240- `SpaceAfter` - дополнительное место после абзаца (в пунктах)
241241- `LineSpacing` - коэффициент, используемый для расчета межстрочного интервала между строками в абзаце. Коэффициент применяется к размеру шрифта (самый высокий в строке), а не к высоте строки. Таким образом, это соответствует свойству CSS line-height. Обратите внимание, что нормальный межстрочный интервал равен 1,2. То есть шрифт размером 12 пт, фактический межстрочный интервал (равный 1,2) приведет к высоте строки 14 пт.
242242 - не поддерживается в WinXP или более ранних версиях
243243 - в большинстве систем не будет разрешено, если для межстрочного интервала установлено значение меньше 1,2. Значение будет проигнорировано, и оно по умолчанию будет равно 1,2
244244
245245**Примечание**
246246
247247- Параметры абзаца RichEdit указываются в пикселях, а не в точках, поэтому вам нужно либо преобразовать эти размеры самостоятельно, либо использовать метод RichMemoHelper.
248248- обозначение смещений «влево»/«вправо» исключено, чтобы избежать путаницы для RTL.
249249
250250``` pascal
251251function GetParaMetric(TextStart: Integer; var AMetric: TParaMetric): Boolean;
252252```
253253
254254### SetParaMetric
255255
256256Устанавливает метрики абзаца
257257
258258``` pascal
259259procedure SetParaMetric(TextStart, TextLen: Integer; const AMetric: TParaMetric);
260260```
261261
262262Рекомендуется использовать функцию `InitParaMetric` для инициализации структуры `TParaMetric`. В противном случае обнуление структуры равно ее размеру (т.е. достаточно `FillChar(m, sizeof(TParaMetric), 0)`. Если значения `TParaMetric` получены из вызова `GetParaMetric`, то структура считается правильно инициализированной).
263263
264264### GetParaRange
265265
266266Возвращает диапазон символов для абзаца. Абзац идентифицируется символом.
267267
268268``` pascal
269269 function GetParaRange(CharOfs: Integer; var ParaRange: TParaRange): Boolean;
270270 function GetParaRange(CharOfs: Integer; var TextStart, TextLength: Integer): Boolean;
271271```
272272
273273`CharOfs` - символ, который принадлежит абзацу, диапазон которого возвращается. `TParaRange` - это структура, которая возвращает 3 поля
274274
275275- `start` - первый символ в абзаце
276276- `lengthNoBr` - длина абзаца, за исключением символа разрыва строки
277277- `length` - длина абзаца, включая разрыв строки, если присутствующая последняя строка в элементе управления не содержит символа перевода строки, следовательно, `длина = lengthNoBr`.
278278
279279### SetParaTabs
280280
281281Устанавливает набор табуляций для абзацев указанной длины.
282282
283283``` pascal
284284 procedure SetParaTabs(TextStart, TextLen: Integer; const AStopList: TTabStopList);
285285```
286286
287287- `TextStart`
288288- `TextLen`
289289- `AStopList` - структура, которая содержит массив табуляций.
290290 - `Count` - указывает количество инициализированных элементов.
291291 - `Tabs` - массив содержит описание каждой позиции табуляции, состоящее из `Offset` и `Alignment`.
292292 - `Offset` - смещение точки табуляции в пунктах (с левой стороны элемента управления)
293293 - `Align` - выравнивание позиции табуляции (`tabLeft` - по умолчанию, `tabCenter, tabRight, tabDecimal`).
294294
295295**Примечание**
296296
297297Renamefest
298298до r4140 перечисляемыми значениями `TTabAlignment` были `taLeft, taCenter, taRight, taDecimal`, но они вступали в противоречие с объявлениями `Classes.TAlignment`. Таким образом суффикс был изменен.
299299
300300win32
301301позволяет не более 32 табуляций
302302
303303gtk2
304304поддерживается только выравнивание `tabLeft`
305305
306306carbon
307307не реализовано
308308
309309### GetParaTabs
310310
311311Получает массив табуляции. Если конкретные вкладки не указаны (по умолчанию виджет табуляции), счетчик AStopList будет установлен в 0.
312312
313313``` pascal
314314 function GetParaTabs(CharOfs: Integer; var AStopList: TTabStopList): Boolean;
315315```
316316
317317### SetRangeParaParams
318318
319319Выборочно устанавливает метрики абзаца
320320
321321``` pascal
322322 procedure SetRangeParaParams(TextStart, TextLength: Integer; ModifyMask: TParaModifyMask; const ParaMetric: TParaMetric);
323323```
324324
325325- `TextStart` - символ первого абзаца, чтобы тоже применить стиль
326326- `TextLength` - количество символов, которые должны изменить свойства абзаца
327327- `ModifyMask` - Маска определяет, какой показатель должен быть установлен для каждого абзаца в блоке `TextStart..TextLength`.Другие символы останутся без изменений. Являются членами набора
328328 - `pmm_FirstLine` - изменяет отступ первой строки. Поле `FirstLine` константы `ParaMetric` должно быть инициализировано
329329 - `pmm_HeadIndent` - изменяет отступ абзаца с головы. Поле `HeadIndent` константы `ParaMetric` должно быть инициализировано
330330 - `pmm_TailIndent` - изменяет отступ абзаца с хвоста. Поле `TailIndent` константы `ParaMetric` должно быть инициализировано
331331 - `pmm_SpaceBefore` - меняет пробел до абзаца. Поле `SpaceBefore` константы `ParaMetric` должно быть инициализировано
332332 - `pmm_SpaceAfter` - меняет пробел после (ниже) абзаца. Поле `SpaceAfter` константы `ParaMetric` должно быть инициализировано
333333 - `pmm_LineSpacing` - межстрочный интервал внутри абзаца. Поле `LineSpace` константы `ParaMetric` должно быть инициализировано
334334- `ParaMetric` - структура, содержащая значения, которые будут установлены. Только поля, указанные \[структурой\] `ModifyMask` должны быть инициализированы
335335
336336### LoadRichText
337337
338338``` pascal
339339function LoadRichText(Source: TStream): Boolean; virtual;
340340```
341341
342342- `Source: TStream` - поток для чтения данных из форматированного текста
343343
344344Метод загружает данные в формате RTF из указанного потока. Возвращает true в случае успеха и false в противном случае. Если source равно nil, метод возвращает false.
345345
346346Содержимое TRichMemo полностью заменяется содержимым в исходном потоке. Текущий выбор текста сбрасывается.
347347
348348### SaveRichText
349349
350350``` pascal
351351function SaveRichText(Dest: TStream): Boolean; virtual;
352352```
353353
354354- `Source: TStream` - поток для записи данных форматированного текста
355355
356356Метод сохраняет RTF-кодированные данные в указанном потоке. Возвращает true в случае успеха и false в противном случае. Если source равно nil, метод возвращает false.
357357
358358Текущее состояние TRichMemo не меняется после возврата метода.
359359
360360### Search
361361
362362``` pascal
363363function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions): Integer;
364364```
365365
366366- `ANiddle: string` - текст для поиска.
367367- `Start: Integer` - позиция символа, с которой начинается поиск, если -1 или 0 - поиск сначала.
368368- `Len: Integer` - длина (в символах, а не в байтах) текста для поиска посередине.
369369- `SearchOpt: TSearchOptions`
370370 - `soMatchCase` - поиск с учетом регистра.
371371 - `soBackward` - поиск от конца документа до символа, обозначенного параметром "Start".
372372 - `soWholeWord` - поиск всего слова.
373373
374374Метод возвращает положение символа найденной подстроки. Позиция подходит для использования в свойстве `SelStart`. Тем не менее, может быть невозможно использовать для операции прямого копирования, если в коде присутствуют символы Unicode. Вместо этого следует использовать UTF8Copy.
375375
376376Если `ANiddle` не был найден в тексте, возвращается -1
377377
378378``` pascal
379379function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions;
380380 var TextStart, TextLength: Integer): Boolean;
381381```
382382
383383(Метод введен с r5115)
384384
385385- `ANiddle: string` - текст для поиска.
386386- `Start: Integer` - позиция символа, с которой начинается поиск, если -1 или 0 - поиск сначала.
387387- `Len: Integer` - длина (в символах, а не в байтах) текста для поиска посередине.
388388- `SearchOpt: TSearchOptions`
389389 - `soMatchCase` - поиск с учетом регистра
390390 - `soBackward` - поиск от конца документа до символа, обозначенного параметром "Start".
391391 - `soWholeWord` - поиск всего слова.
392392- `(output) ATextStart` - позиция найденного текста (в символах)
393393- `(output) ATextLength` - длина найденного текста (в символах (позиции курсора!))
394394
395395Метод возвращает значение true, если искомая подстрока найдена, в противном случае - значение false.
396396
397397Возвращенные значения `ATextStart` и `ATextLength` подходят для использования в свойствах `SelStart` и `SelLength`.
398398
399399> **Note:** для сложных сценариев найденный текст может совпадать с искомой подстрокой. Поведение поиска (в сложных сценариях) зависит от набора виджетов. Таким образом, поиск одной и той же строки в разных наборах виджетов (например, win32 или gtk2) может привести к разным результатам. Если вам нужны одинаковые результаты и вы их не получили, создайте отчет об ошибке.
400400
401401Если вам нужно извлечь найденный текст, вы должны использовать метод `GetText()` (передавая значения `ATextStart` и `ATextLength`).
402402
403403### GetText, GetUText
404404
405405``` pascal
406406 function GetText(TextStart, TextLength: Integer): String;
407407 function GetUText(TextStart, TextLength: Integer): UnicodeString;
408408```
409409
410410- `TextStart: Integer` -позиция символа для начала извлечения (0 - это первый символ в тексте).
411411- `TextLength: Integer` - длина (в символах, а не в байтах) текста для извлечения
412412
413413`GetText()` возвращает подстроку UTF8
414414
415415`GetUText()` возвращает подстроку UTF16
416416
417417Текущее выделение не будет зависеть от операции. (Если вы видите, что выделение пострадало, пожалуйста, сообщите о проблеме).
418418
419419Вы не должны учитывать \[абстрактную\] эффективность любого метода. Например, WinAPI внутренне работает с символами UTF16, поэтому `GetUText()` **может** быть более эффективным для него. В то время как Gtk2 работает с UTF8 и вызов `GetText()` **может** быть более эффективным для него. Вместо того, чтобы думать о базовой системе, вы должны учитывать потребности вашей задачи.
420420
421421### Redo
422422
423423``` pascal
424424 procedure Redo;
425425```
426426
427427Метод восстанавливает последнее предыдущее изменение [undone](http://lazarus-ccr.sourceforge.net/docs/lcl/stdctrls/tcustomedit.undo.html).
428428
429429Вы всегда можете вызвать для проверки [[RichMemo/ru|CanRedo]], если есть какие-либо действия\[, которые\] могут быть переделаны.
430430
431431## Свойства
432432
433433### ZoomFactor
434434
435435``` pascal
436436property ZoomFactor: double
437437```
438438
439439Read/Write свойство. Управляет масштабированием содержимого RichMemo. 1.0 - без увеличения. Менее \< 1,0 - уменьшить масштаб, более 1,0 - увеличить масштаб. Если установлено 0 - \[приводится к\] значению по умолчанию равным 1,0 коэффициенту масштабирования (без увеличения).
440440
441441### HideSelection
442442
443443``` pascal
444444property HideSelection: Boolean default false
445445```
446446
447447Read/Write свойство. Если True, то выделение RichMemo скрыто, пока элемент управления не в фокусе. Если False, выделение отображается постоянно.
448448
449449### CanRedo
450450
451451``` pascal
452452property CanRedo: Boolean
453453```
454454
455455Если \[возвращаемое значение\] True, в очереди отмены есть действия, которые можно повторить. Если \[возвращаемое\] значение False, в очереди отмены нет действий, которые можно повторить. Вызов Redo не будет иметь никакого эффекта.
456456
457457### RTF
458458
459459``` pascal
460460property Rtf: String
461461```
462462
463463Read/Write свойство, которое позволяет читать или записывать текст в формате RTF для всего элемента управления. Назначение свойства - иметь возможность устанавливать Rich-Text во время разработки, однако свойство также будет работать во время выполнения.
464464
465-<img src="RtfEditor.PNG" title="RtfEditor.PNG" width="400" />
465+![](/wiki-images/b/b8/RtfEditor.PNG)
466466
467467Если значение свойства является пустой строкой, то свойство Lines используется как простой текст для инициализации значения элемента управления во время загрузки.
468468
469469> **Note:** Свойство доступно только в классе TRichMemo, оно недоступно (или вообще не реализовано) в классе TCustomRichMemo. Рекомендуется использовать LoadRichText/SaveRichText для изменения содержимого страницы только потому, что они могут занимать меньше памяти, чем копирование всего расширенного текста в память.
470470
471471> **Note:** **для кроссплатформенной и прямой совместимости** - в настоящее время свойство реализовано на основе набора виджетов, обеспечивающего чтение/запись в формате Rich-text. Весьма вероятно, что в ближайшем будущем оно будет изменено на использование кода чтения/записи RichMemo только RTF-stream. Проблема в том, что старые системы могут не поддерживать последнюю версию RTF.
472472
473473Так что прямо сейчас вы можете столкнуться с проблемой, когда вы создадите проект в Gtk2 и сохраните richmemo время разработки, содержащее символы Unicode. Затем, если вы попытаетесь загрузить его на компьютер с XP и использовать собственный загрузчик widgetset, вы можете увидеть символы, отсутствующие или неправильно отображенные. Переход на использование \[механизмов\] RichMemo загрузки/сохранения RTF предотвратит эту проблему. В настоящее время вы также можете избежать этого, зарегистрировав загрузчики RichMemo (вызовите процедуры RegisterRTFLoader, RegisterRTFSaver при инициализации проекта перед загрузкой любого RichMemo)
474474
475475## События
476476
477477### OnSelectionChange
478478
479479``` pascal
480480property OnSelectionChange: TNotifyEvent
481481TNotifyEvent = procedure (Sender: TObject) of object;
482482```
483483
484484Событие запускается всякий раз, когда в RichMemo изменяется выделение: либо программно, либо из-за действий пользователя.
485485
486486## TRichEditForMemo
487487
488488Помощник класса, который реализует программный интерфейс RichEdit. Помощник объявлен в модуле RichEditHelpers, поэтому вы должны добавить его в раздел использования. Помощники доступны в FPC 2.6.0 или старше.
489489
490490### Методы
491491
492492#### FindText
493493
494494Поиск заданного диапазона в тексте для целевой строки
495495
496496### Свойства
497497
498498#### SelAttributes
499499
500500Читает/Изменяет атрибуты символа текущего выделения
501501
502502### Paragraph
503503
504504Читает/Изменяет атрибуты абзаца текущего выделения.
505505
506506### RichMemoUtils
507507
508508Представлен модуль, добавляющий некоторые полезные функции, специфичные для ОС, для работы с RichMemo.
509509
510510#### InsertImageFromFile
511511
512512`function InsertImageFromFile (const ARichMemo: TCustomRichMemo; APos: Integer;`\
513513`    const FileNameUTF8: string;`\
514514`    const AImgSize: TSize`\
515515`): Boolean = nil;`
516516
517517*Отказ от ответственности: функция будет вставлять файл изображения в RichMemo (если он реализован набором виджетов), но очень неэффективным способом. Изображение будет прочитано снова, и память будет перераспределяться для изображения каждый раз. Поэтому, пожалуйста, не используйте его для смайликов в чате. Наилучшим \[выбором будет\] API (с кэшированием данных). (Вот почему этот метод не является частью класса TCustomRichMemo).*
518518
519519- `APos` - позиция в тексте
520520- `AImgSize` - размер, который нужно выставлять в **ТОЧКАХ**, а не в пикселях! Если и `cx`, и `cy` равны 0, размер изображения не будет изменен вообще. Если только один \[из размеров\] - `cx, cy` - равен нулю, результаты \[будут\] неопределенными.
521521
522522Есть также служебная функция **InsertImageFromFileNoResize**, которая вызывает InsertImageFromFile, передавая размер как 0.
523523
524524Пример использования
525525
526526``` pascal
527527 procedure TForm1.Button1Click(Sender: TObject);
528528 begin
529529 // вызов диалога для выбора картинки для вставки
530530 if OpenDialog1.Execute then
531531 // вставка картинки в текущую позицию курсора RichMemo
532532 InsertImageFromFileNoResize(RichMemo1, RichMemo1.SelStart, OpenDialog1.FileName);
533533 end;
534534```
535535
536536### InsertStyledText, InsertColorStyledText, InsertFontText
537537
538538Набор функций, которые упрощают добавление и замену стилизованного текста. Указанный стиль текста применяется к вставке. Общее правило для всех функций, если `InsPos` (позиция вставки) отрицательна - текст добавляется в конец. Для вставки текста в начало теста `InsPos` должна быть установлена в 0.
539539
540540Вставленный текст не обязательно должен находиться на новой строке или добавлять новую строку. Возможно, вы захотите добавить символ `LineFeed` в параметр `TextUTF8`, чтобы вставленный текст был новой строкой.
541541
542542``` pascal
543543procedure InsertStyledText(
544544 const ARichMemo: TCustomRichMemo;
545545 const TextUTF8: String;
546546 AStyle: TFontStyles;
547547 InsPos : Integer = -1 )
548548```
549549
550550`InsertStyledText` вставляет стилизованный текст в указанную позицию.
551551
552552``` pascal
553553procedure InsertColorStyledText(
554554 const ARichMemo: TCustomRichMemo;
555555 const TextUTF8: String;
556556 AColor: TColor;
557557 AStyle: TFontStyles;
558558 InsPos : Integer = -1 )
559559```
560560
561561`InsertColorStyledText` вставляет текст с указанным стилем и цветом в указанной позиции (по умолчанию в конец RichMemo).
562562
563563``` pascal
564564procedure InsertFontText(
565565 const ARichMemo: TCustomRichMemo;
566566 const TextUTF8: String;
567567 const prms: TFontParams;
568568 InsPos : Integer = -1 )
569569```
570570
571571`InsertFontText` вставляет текст и применяет к нему указанные FontParams.
572572
573573Возможно, вы захотите создать помощник класса для реализации этих функций в качестве методов для RichMemo. Осторожно, если вы используете [[RichMemo/ru|Delphi-совместимый помощник]] - вы можете \[попасть\] в конфликт.
574574
575575## Установка
576576
577577- Получить последнюю версию из SVN
578578- Откройте пакет и установите его, пересоберите IDE
579579- TRichMemo будет добавлен на вкладку 'Common Controls'
580580
581581## Часто задаваемые вопросы
582582
583583### Использование RichMemo в общих библиотеках
584584
585585[Issue \#17412](http://bugs.freepascal.org/view.php?id=17412) Если вам нужно использовать компонент в разделяемой библиотеке, вам может понадобиться добавить ключ -fPIC к опции компилятора «пакета» и «проекта».
586586
587587## (Delphi) RichEdit-подобный интерфейс
588588
589589[Issue \#14632](http://bugs.freepascal.org/view.php?id=14632) Типичная проблема - портирование существующего кода, использующего RichEdit из Delphi. Интерфейс RichMemo не совпадает с RichEdit во многих отношениях. Но есть два способа справиться с этим:
590590
591591- вы можете создать подкласс из TCustomRichMemo (или RichMemo) и реализовать методы Delphi RichEdit;
592592- вы можете использовать модуль RichMemoHelpers (требуется fpc 2.6.0 или более поздняя версия) и использовать методы, предоставляемые классом Helpers; в настоящее время реализованы свойства SelAttributes и Paragraph.
593593
594594``` pascal
595595 uses ... RichMemo, RichMemoHelpers;
596596
597597 TForm = class
598598 RichMemo1 : TRichMemo;
599599
600600 // Свойство SelAttributes недоступно в базовом классе,
601601 // но добавлено помощником, определенным в модуле RichMemoHelpers
602602 RichMemo1.SelAttributes.Name := 'Courier New';
603603```
604604
605605## Добавление смешанного цветного текста в конец RichMemo
606606
607607Если вам просто нужна простая раскраска, то вот пример, который будет каждый раз добавлять новую строку со случайным цветом (протестировано в Windows):
608608
609609``` pascal
610610 procedure TForm1.Button1Click(Sender: TObject);
611611 var
612612 i, j: integer;
613613 str: string;
614614 begin
615615 with Richmemo1 do
616616 begin
617617 str := 'Newline text';
618618 i := Length(Lines.Text) - Lines.Count; // CR(перевод каретки) как #10#13 считается только один раз, так что вычтите его один раз
619619 j := Length(str) + 1; // +1 сделать CR в том же формате
620620 Lines.Add(str);
621621 SetRangeColor(i, j, Round(random * $FFFFFF));
622622 end;
623623 end;
624624```
625625
626626` ``Newline text`\
627627` ``NewLine text`\
628628` ``NewLine text`
629629
630630Альтернативный пример простой раскраски (протестировано на Windows):
631631
632632``` pascal
633633 procedure TForm1.Button2Click(Sender: TObject);
634634 begin
635635 with RichMemo1 do
636636 begin
637637 Lines.Add('Line in red');
638638 SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clRed);
639639
640640 Lines.Add('Line in blue');
641641 SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clBlue);
642642
643643 Lines.Add('Normal line.');
644644 Lines.Add('Normal line.');
645645
646646 Lines.Add('Line in green ');
647647 SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clGreen);
648648 end;
649649 end;
650650```
651651
652652` ``Line in red`\
653653` ``Line in blue`\
654654` ``Normal line.`\
655655` ``Normal line.`\
656656` ``Line in green`
657657
658658Если вам нужна смешанная раскраска, то это пример, который добавит новую строку с несколькими разноцветными словами (протестировано в Windows):
659659
660660``` pascal
661661procedure TForm1.Button3Click(Sender: TObject);
662662 procedure AddColorStr(s: string; const col: TColor = clBlack; const NewLine: boolean = true);
663663 begin
664664 with RichMemo1 do
665665 begin
666666 if NewLine then
667667 begin
668668 Lines.Add('');
669669 Lines.Delete(Lines.Count - 1); // избегаем двойного межстрочного интервала
670670 end;
671671
672672 SelStart := Length(Text);
673673 SelText := s;
674674 SelLength := Length(s);
675675 SetRangeColor(SelStart, SelLength, col);
676676
677677 // отменяем выделение вставленной строки и помещаем курсор в конец текста
678678 SelStart := Length(Text);
679679 SelText := '';
680680 end;
681681 end;
682682 begin
683683 AddColorStr('Black, ');
684684 AddColorStr('Green, ', clGReen, false);
685685 AddColorStr('Blue, ', clBlue, false);
686686 AddColorStr('Red', clRed, false);
687687 end;
688688```
689689
690690` ``Black, ``Green, ``Blue, ``Red`\
691691` ``Black, ``Green, ``Blue, ``Red`\
692692` ``Black, ``Green, ``Blue, ``Red`
693693
694694## Разбор языка разметки
695695
696696![mlparse example](/wiki-images/8/8c/Mlparse.png) Нативные элементы управления rich-edit не поддерживают синтаксический анализ языка разметки.
697697
698698Вам нужно написать эту \[функциональность\] самостоятельно, как показано в примере с mlparse.
699699
700700## Что внутри
701701
702702### Матрица поддержки платформы
703703
704704Ожидается, что значения в матрице не будут статическими (за исключением столбца "carbon"), каждая система должна поддерживать все функции, объявленные RichMemo.
705705
706706Обратите внимание, что таблица содержит больше функций, чем опубликовано выше. Это означает, что API-интерфейсы уже доступны в RichMemo, но, поскольку они нестабильны (на некоторых платформах), они считаются «экспериментальными», а не обещанными.
707707
708708| Особенность | Win32 | Gtk2 | Qt | Cocoa | Carbon |
709709|------------------------------------|-------|------|-----|-------|--------|
710710| Выбор цвета и стиля шрифта | | | | | |
711711| Цвет фона шрифта | | | | | |
712712| Подстрочный, надстрочный \[текст\] | | | | | |
713713| \[функция\] GetStyleRange | | | | | |
714714| Выравнивание абзаца | | | | | |
715715| Метрика абзаца | | | | | |
716716| Отступы абзаца | | | | | |
717717| Масштабирование | | | | | |
718718| Печать | | | | | |
719719| Загрузка/сохранение RTF | | | | | |
720720| Возможность вставки | | | | | |
721721
722722### Win32
723723
724724![RichMemo without Theme patch](/wiki-images/e/e9/Rm_win32_notheme.PNG) ![RichMemo with Theme](/wiki-images/1/19/Rm_win32_theme.PNG)
725725
726726- [RichEdit](https://msdn.microsoft.com/en-us/library/windows/desktop/bb787605%28v=vs.85%29.aspx) используется в качестве системного виджета. Последний известный .dll загружается и инициализируется при запуске. Обратите внимание, что RichEdit 1.0 не поддерживает большинство функций.
727727- Внутренняя оболочка RichEditManager предоставляется для совместимости с Win 9x. Однако это никогда не испытывалось и не проверялось. Также ожидается, что объект TOM может быть упакован как одна из реализаций RichEditManager. Однако имеющийся на месте «менеджер» может быть полностью удален.
728728- Согласно Интернету, элемент управления 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.
729729
730730Win32RichMemo предоставляет глобальную переменную NCPaint. Это обработчик рисования не-клиентской области. По умолчанию он пытается нарисовать тематическую границу (см. Win32RichMemo.ThemedNCPaint для реализации). Он обеспечивает хорошие результаты по темам Windows XP, но в более поздних темах (где используются анимация) результаты не так хороши и должны быть обновлены.
731731
732732Чтобы система могла выполнять только NCPaint (т.е. реализация LCL вызывает проблемы или новые окна обновляли RichEdit для правильного рисования границ), вы можете изменить значение NCPaint во время выполнения, сбросив его в nil:
733733
734734``` pascal
735735 uses
736736 RichMemo, ..
737737 {$ifdef WINDOWS}
738738 Win32RichMemo
739739 {$endif}
740740
741741 initialization
742742 {$ifdef WINDOWS}
743743 Win32RichMemo.NCPaint:=nil;
744744 {$endif}
745745```
746746
747747Вы также можете предоставить собственную реализацию NCPaint. Однако, если вы реализуете правильную анимацию рисунка темы, пожалуйста, предоставьте патч.
748748
749749Поведение зависит от реализации Windows и не должно (и не будет) частью интерфейса RichMemo.
750750
751751### Gtk2
752752
753753- В качестве системного виджета используется [GtkTextView](https://developer.gnome.org/gtk2/stable/GtkTextView.html).
754754- Subscript и Superscript изначально не поддерживаются, в gtk2richmemo реализован дополнительный код для их реализации.
755755- Маркированные и нумерованные списки эмулируются.
756756
757757### Gtk3
758758
759759API между Gtk2 и [Gtk3](https://developer.gnome.org/gtk3/stable/GtkTextView.html) на самом деле не отличаются. Основное отличие в отрисовке. Для Gtk3 активно используется Cairo Canvas. Единственная область, на которую это влияет - "внутренности". Если кто-то хочет внести свой вклад в реализацию Gtk2 - пожалуйста, создайте отдельные модули gtk3richmemoXXX. Не нужно создавать {\$ ifdefs} в модулях gtk2.
760760
761761### Cocoa
762762
763763- Для Cocoa в качестве системного виджета используется [NSTextView](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTextView_Class/index.html).
764764- Не каждое семейство шрифтов предоставляет «курсивный» шрифт. Таким образом, даже если вы передадите fsItalic как часть Style для шрифта, он может быть проигнорирован.
765765
766766### Qt
767767
768768- Используется [QTextEdit](http://doc.qt.io/qt-4.8/qtextedit.html) виджет. В современных C-отображениях для Qt отсутствует множество API-интерфейсов RichText, поэтому полная реализация в настоящее время невозможна.
769769- Следующие классы должны быть сопоставлены с C-функциями:
770770 - [QTextBlockFormatH](http://doc.qt.io/qt-4.8/qtextblockformat.html) необходим для выравнивания абзацев (например, отступы абзаца, межстрочный интервал и табуляции). QTextEdit предоставляет только выравнивание абзаца.
771771 - [QTextCharFormatH](http://doc.qt.io/qt-4.8/qtextcharformat.html) необходим для дополнительного форматирования символов (то есть вертикальное выравнивание, поддержка ссылок). QTextEdit предоставляет только стили шрифтов.
772772
773773## См. также
774774
775775- [[RichMemo/Features]] - комментирует некоторые функции в процессе.
776776- [[RichMemo/WorkArounds]] - некоторые заметки о функциях еще не завершены.
777777- [[RichMemo/Defines]] - дополнительные переключатели пакетов, которые позволяют решить проблемы компиляции/времени выполнения
778778- [[RichMemo/Samples]] - еще примеры
779779- [MyNotex](https://sites.google.com/site/mynotex) приложение, которое использует модифицированный пакет Massimo Nardello RichMemo для Linux-Gtk2
780780- [[TMemo]]
781781- [[KControls|KMemo control]]
782782
783783---
784784*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