Sign in Join
Wiki copytemporary

RichMemo/ru: what changed

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

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>
1+![](/wiki-images/5/54/Richmemosample.png)
52
63**RichMemo** - это пакет, который включает компонент для замены компонента Delphi TRichEdit. Он разработан кросс-платформенным способом, поэтому его реализация возможна для следующих платформ: Win32, MacOSX и Linux. Поскольку [[RichMemo/ru|кроссплатформенность]] является основной целью, нативный API RichMemo может быть [[RichMemo/ru|расширен]], чтобы сделать его совместимым с Delphi RichEdit.
74
85Его основными характеристиками являются:
96
107- Подсветка текста
118- Системная поддержка редактирования Юникода
129
1310Планируется: (исправления приветствуются)
1411
1512- Добавление изображений в текст
1613- Встраивание элементов управления LCL?
1714
1815Загружаемый файл содержит компонент, установочный пакет и демонстрационное приложение, которое иллюстрирует возможности компонента, а также некоторые инструменты для оценки диаграммы в данной системе.
1916
2017Пожалуйста, добавляйте ваши багрепорты/функции на [Github](https://github.com/skalogryz/richmemo/issues).
2118
2219## Лицензия
2320
2421Автор: Дмитрий 'скалогрыз' Бояринцев
2522
2623[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 не работает с вашим проектом лицензирования.
2724
2825## Загрузка
2926
3027Последняя версия доступна здесь:
3128
3229[`https://github.com/skalogryz/richmemo`](https://github.com/skalogryz/richmemo)
3330
3431Прим.перев.: Существует также [форк](https://github.com/mrandreastoth/richmemo) данного компонента на гитхабе от [Andreas Toth](https://github.com/mrandreastoth) aka mrandreastoth.
3532
3633## Change Log
3734
3835- Version 1.0.0 22th Jun 2009
3936- Version 0.8.0 Jun 2009
4037
4138## Зависимости / Системные требования
4239
4340- Lazarus 1.0.0
4441
4542Статус: выпущен.
4643
4744## Установка
4845
4946- Скачайте исходники пакета
5047- Установите пакет в Lazarus и пересоберите его
5148- TRichMemo добавится в закладку 'Common Controls'.
5249
53-<figure>
54-<img src="RichMemoPalette.PNG" title="RichMemoPalette.PNG" />
55-<figcaption>RichMemoPalette.PNG</figcaption>
56-</figure>
50+![](/wiki-images/8/80/RichMemoPalette.PNG)
5751
5852## TRichMemo
5953
6054### Параметры шрифта
6155
6256Параметры шрифта обычно представлены записью `TFontParams`. Тип используется для описания атрибутов шрифта **rich**. Некоторые атрибуты выходят за рамки класса `TFont`, поэтому необходим дополнительный тип. Однако большинство типов данных, связанных с `TFont`, используются повторно (т.е. `TFontStyles`).
6357
6458- `Name` - название шрифта (семейство).
6559- `Size` - размер шрифта в пунктах (передача отрицательного значения может привести к неожиданным результатам).
6660- `Color` - цвет шрифта.
6761- `Style` - стили шрифта, включая полужирный, курсив, зачеркнутый, подчеркивание.
6862- `HasBkClr` - логический флаг, если текст для должен иметь цвет фона (если true, поле BkColor используется, в противном случае BkColor игнорируется). Прозрачность не поддерживается.
6963- `BkColor` - цвет фона (или подсветка) для текста.
7064- `VScriptPos` - вертикальная настройка текста ![](/wiki-images/c/c1/Richmemo_Subsuper.png).
7165 - `vpNormal` - нет особой позиции.
7266 - `vpSubscript` - текст - нижний индекс.
7367 - `vpSuperscript` - текст - верхний индекс.
7468
7569
7670Фактическое вертикальное смещение индексов верх/низ зависит от реализации ОС и в настоящее время не может контролироваться.
7771
7872Вы можете присвоить `FontParams` из структуры `TFont`. Для этого вам нужно использовать функцию `GetFontParams(afont: TFont)`. Обратите внимание, что для большинства элементов управления LCL для `TFont` установлены значения по умолчанию. Это не фактические значения, а скорее указание на то, что следует использовать шрифт по умолчанию для элемента управления (аналогично `crDefault` для `TColor`).
7973
8074Функция `GetFontParams` разрешает имя шрифта по умолчанию и возвращает фактическое имя семейства шрифтов.
8175
8276## Методы
8377
8478### SetTextAttributes
8579
8680``` pascal
8781procedure SetTextAttributes(TextStart, TextLen: Integer; AFont: TFont);
8882```
8983
9084- `TextStart : Integer` - первый символ, который будет изменен
9185- `TextLen : Integer` - количество символов для изменения
9286- `AFont : TFont` - шрифт, который должен быть применен к части текста
9387
9488``` pascal
9589procedure SetTextAttributes(TextStart, TextLen: Integer; const TextParams: TFontParams);
9690```
9791
9892- `TextStart : Integer` - первый символ, который будет изменен
9993- `TextLen : Integer` - количество символов для изменения
10094- `TextParams : TFontParams` - параметры шрифта, которые будут установлены
10195
10296Методы `SetTextureAttributes` изменяют указанный стиль текстового диапазона. Параметры шрифта передаются в обоих методах, параметром `AFont` (объект LCL `TFont`) или `TFontParams` (объявлено в RichMemo)
10397
10498Установка атрибутов текста не меняет текущий выбор. Если необходимо изменить стиль выделенного в данный момент текста, вам следует выбрать `SelStart` и `SelLength` в качестве значений текстового диапазона:
10599
106100``` pascal
107101RichMemo1.SetTextAttributes(RichMemo1.SelStart, RichMemo1.SelLength, FontDialog1.Font);
108102```
109103
110104### GetTextAttributes
111105
112106``` pascal
113107function GetTextAttributes(TextStart: Integer; var TextParams: TFontParams): Boolean; virtual;
114108```
115109
116110- `TextStart : Integer` - позиция символа для запроса параметров шрифта
117111- `var TextParams : TFontParams` - выходное значение, заполненное атрибутами символа шрифта. Если метод завершается неудачно и возвращает `false`, значения поля записи будут неопределенными.
118112
119113Заполняет параметры шрифта символа в позиции `TextStart`. Метод возвращает `True`, если `TextStart` является действительной позицией символа, и `False` в противном случае.
120114
121115### GetStyleRange
122116
123117``` pascal
124118function GetStyleRange(CharPos: Integer; var RangeStart, RangeLen: Integer): Boolean; virtual;
125119```
126120
127121Возвращает диапазон символов с одинаковыми параметрами шрифта, т.е. все символы в диапазоне имеют одинаковые имя, размер, цвет и стили шрифта.
128122
129123- `CharPos : Integer` - символ, который принадлежит диапазону стилей. Позиция не обязательно быть в начале диапазона стилей. Она может быть в середине конца диапазона стилей. Первая позиция символа возвращается параметром `RangeStart`.
130124- `var RangeStart : Integer` - первый символ в диапазоне
131125- `var RangeLen : Integer` - количество символов в диапазоне
132126
133127Метод возвращает `true` в случае успеха. Метод возвращает `false`, если `CharPos` имеет неправильное значение - больше доступных символов или какая-либо другая ошибка.
134128
135129### CharAtPos
136130
137131``` pascal
138132function CharAtPos(x,y: Integer): Integer; virtual;
139133```
140134
141135Возвращает смещение символа от нулевой позиции (не позиция UTF8). Возвращает -1 в случае неудачи.
142136
143137- `x, y` - точка в клиентской области элемента управления RichMemo.
144138
145139Метод знает о состоянии прокрутки элемента управления. Таким образом, два вызова `CharAtPos(0,0)` могут возвращать разные значения, если между вызовами изменяется позиция прокрутки. Смотрите "examples/hittest" для \[получения\] примера использования.
146140
147141Если указанные `x,y` будут вне содержимого RichMemo, возвращаемое значение \[будет\] неопределенным. \[Поведение\] остается \[на усмотрение\] набора виджетов, который либо возвращает -1, либо закрывает доступный символ.
148142
149143### SetRangeColor
150144
151145``` pascal
152146procedure SetRangeColor(TextStart, TextLength: Integer; FontColor: TColor);
153147```
154148
155149Метод устанавливает цвет символов в указанном диапазоне для FontColor. Другие параметры шрифта (имя, размер, стили) остаются без изменений.
156150
157151- `TextStart: Integer` - первый символ в диапазоне
158152- `TextLength: Integer` - количество символов в диапазоне
159153- `FontColor: TColor` - цвет, который должен быть установлен
160154
161155### SetRangeParams
162156
163157``` pascal
164158 procedure SetRangeParams(TextStart, TextLength: Integer; ModifyMask: TTextModifyMask;
165159 const fnt: TFontParams; AddFontStyle, RemoveFontStyle: TFontStyles); overload;
166160```
167161
168162Метод изменяет параметры шрифта в указанном диапазоне.
169163
170164- `TextStart` - первый символ в диапазоне
171165- `TextLength` - количество символов в диапазоне
172166- `ModifyMask` - показывает, какие именно атрибуты шрифта должны быть обновлены. Маска принимает любую комбинацию из следующих значений:
173167 - `tmm_Color` - Цвет шрифта будет изменен (поле `fnt.Color` должно быть заполнено)
174168 - `tmm_Name` - имя шрифта будет изменено (поле `fnt.Name` должно быть заполнено)
175169 - `tmm_Size` - размер шрифта будет изменен (поле `fnt.Size` должно быть заполнено)
176170 - `tmm_Styles` - стили шрифта будут изменены в соответствии с параметрами `AddFontStyle, RemoveFontStyle`
177171 - `tmm_BackColor` - Цвет подсветки текста (фона) будет изменен. (поля `fnt.HasBkClr` и `fnt.BkColor` должны быть заполнены)
178172 - Отправка пустой маски приведет к возврату метода без внесения каких-либо изменений.
179173- `fnt` - Параметры шрифта, которые будут использоваться, в зависимости от значений `ModifyMask`.
180174- `AddFontStyle` - набор стилей, которые должны применяться к диапазону (используется только если `tmm_Style`s в `ModifyMask`, в противном случае игнорируется)
181175- `RemoveFontStyle` - набор стилей шрифта должен быть удален из диапазона (используется только если `tmm_Styles` в `ModifyMask`, в противном случае игнорируется)
182176
183177``` pascal
184178procedure SetRangeParams(TextStart, TextLength: Integer;
185179 ModifyMask: TTextModifyMask; const FontName: String;
186180 FontSize: Integer; FontColor: TColor;
187181 AddFontStyle, RemoveFontStyle: TFontStyles);
188182```
189183
190184Перегруженная версия метода. Это просто оболочка вокруг параметра, использующая структуру `TFontParams`. Метод не поддерживает изменение цвета фона, вы должны использовать версию `TFontParams`
191185
192186- `FontName` - имя шрифта, которое должно быть установлено (используется только если `tmm_Name` в `ModifyMask`, в противном случае игнорируется)
193187- `FontColor` - Цвет шрифта, который должен быть установлен (используется только если `tmm_Color` в `ModifyMask`, в противном случае игнорируется)
194188
195189Например, если используется следующий код
196190
197191```delphi
198192 RichMemo1.SetRangeParams (
199193 RichMemo1.SelStart, RichMemo1.SelLength,
200194 [tmm_Styles, tmm_Color], // только изменение цвета и стиля
201195 '', // имя шрифта - оно не используется, поэтому мы можем оставить его пустым
202196 0, // размер шрифта - это размер шрифта, мы можем оставить его пустым
203197 clGreen, // сделать весь текст в выбранной области зеленым цветом
204198 [fsBold, fsItalic], // добавление жирного и курсивного стилей
205199 []
206200 );
207201```
208202
209203### GetParaAlignment
210204
211205Получает выравнивание абзаца
212206
213207``` pascal
214208function GetParaAlignment(TextStart: Integer; var AAlign: TParaAlignment): Boolean;
215209```
216210
217211- `TextStart` - позиция символа, который принадлежит абзацу
218212- `AAlign` - получение выравнивания абзаца.
219213
220214**Примечание**:
221215
222216- Win32 - выравнивание по ширине не работает в Windows XP и более ранних версиях.
223217- OSX - из-за ограничений Carbon, это не работает в Carbon, но работает для виджетов Cocoa.
224218
225219### SetParaAlignment
226220
227221Устанавливает выравнивание абзаца
228222
229223``` pascal
230224procedure SetParaAlignment(TextStart, TextLen: Integer; AAlign: TParaAlignment);
231225```
232226
233227**Примечание**:
234228
235229- Win32 - выравнивание по ширине не работает в Windows XP и более ранних версиях.
236230- OSX - из-за ограничений Carbon, это не работает в Carbon, но работает для виджетов Cocoa. Также необходимо, чтобы правильное выравнивание было загружено из файла RTF.
237231
238232### GetParaMetric
239233
240234Возвращает отступ метрики абзаца для данного абзаца ![](/wiki-images/b/be/Richmemo_parametric.PNG)
241235
242236- `FirstLine` - смещение для первой строки (в пунктах) абзаца от начала элемента управления \[(т.н. "красная строка")\]
243237- `TailIndent` - смещение для каждой строки (в пунктах), за исключением первой строки, абзаца от конца элемента управления
244238- `HeadIndent` - смещение для каждой строки (в пунктах) абзаца от начала элемента управления
245239- `SpaceBefore` - дополнительное место перед абзацем (в пунктах)
246240- `SpaceAfter` - дополнительное место после абзаца (в пунктах)
247241- `LineSpacing` - коэффициент, используемый для расчета межстрочного интервала между строками в абзаце. Коэффициент применяется к размеру шрифта (самый высокий в строке), а не к высоте строки. Таким образом, это соответствует свойству CSS line-height. Обратите внимание, что нормальный межстрочный интервал равен 1,2. То есть шрифт размером 12 пт, фактический межстрочный интервал (равный 1,2) приведет к высоте строки 14 пт.
248242 - не поддерживается в WinXP или более ранних версиях
249243 - в большинстве систем не будет разрешено, если для межстрочного интервала установлено значение меньше 1,2. Значение будет проигнорировано, и оно по умолчанию будет равно 1,2
250244
251245**Примечание**
252246
253247- Параметры абзаца RichEdit указываются в пикселях, а не в точках, поэтому вам нужно либо преобразовать эти размеры самостоятельно, либо использовать метод RichMemoHelper.
254248- обозначение смещений «влево»/«вправо» исключено, чтобы избежать путаницы для RTL.
255249
256250``` pascal
257251function GetParaMetric(TextStart: Integer; var AMetric: TParaMetric): Boolean;
258252```
259253
260254### SetParaMetric
261255
262256Устанавливает метрики абзаца
263257
264258``` pascal
265259procedure SetParaMetric(TextStart, TextLen: Integer; const AMetric: TParaMetric);
266260```
267261
268262Рекомендуется использовать функцию `InitParaMetric` для инициализации структуры `TParaMetric`. В противном случае обнуление структуры равно ее размеру (т.е. достаточно `FillChar(m, sizeof(TParaMetric), 0)`. Если значения `TParaMetric` получены из вызова `GetParaMetric`, то структура считается правильно инициализированной).
269263
270264### GetParaRange
271265
272266Возвращает диапазон символов для абзаца. Абзац идентифицируется символом.
273267
274268``` pascal
275269 function GetParaRange(CharOfs: Integer; var ParaRange: TParaRange): Boolean;
276270 function GetParaRange(CharOfs: Integer; var TextStart, TextLength: Integer): Boolean;
277271```
278272
279273`CharOfs` - символ, который принадлежит абзацу, диапазон которого возвращается. `TParaRange` - это структура, которая возвращает 3 поля
280274
281275- `start` - первый символ в абзаце
282276- `lengthNoBr` - длина абзаца, за исключением символа разрыва строки
283277- `length` - длина абзаца, включая разрыв строки, если присутствующая последняя строка в элементе управления не содержит символа перевода строки, следовательно, `длина = lengthNoBr`.
284278
285279### SetParaTabs
286280
287281Устанавливает набор табуляций для абзацев указанной длины.
288282
289283``` pascal
290284 procedure SetParaTabs(TextStart, TextLen: Integer; const AStopList: TTabStopList);
291285```
292286
293287- `TextStart`
294288- `TextLen`
295289- `AStopList` - структура, которая содержит массив табуляций.
296290 - `Count` - указывает количество инициализированных элементов.
297291 - `Tabs` - массив содержит описание каждой позиции табуляции, состоящее из `Offset` и `Alignment`.
298292 - `Offset` - смещение точки табуляции в пунктах (с левой стороны элемента управления)
299293 - `Align` - выравнивание позиции табуляции (`tabLeft` - по умолчанию, `tabCenter, tabRight, tabDecimal`).
300294
301295**Примечание**
302296
303297Renamefest
304298до r4140 перечисляемыми значениями `TTabAlignment` были `taLeft, taCenter, taRight, taDecimal`, но они вступали в противоречие с объявлениями `Classes.TAlignment`. Таким образом суффикс был изменен.
305299
306300win32
307301позволяет не более 32 табуляций
308302
309303gtk2
310304поддерживается только выравнивание `tabLeft`
311305
312306carbon
313307не реализовано
314308
315309### GetParaTabs
316310
317311Получает массив табуляции. Если конкретные вкладки не указаны (по умолчанию виджет табуляции), счетчик AStopList будет установлен в 0.
318312
319313``` pascal
320314 function GetParaTabs(CharOfs: Integer; var AStopList: TTabStopList): Boolean;
321315```
322316
323317### SetRangeParaParams
324318
325319Выборочно устанавливает метрики абзаца
326320
327321``` pascal
328322 procedure SetRangeParaParams(TextStart, TextLength: Integer; ModifyMask: TParaModifyMask; const ParaMetric: TParaMetric);
329323```
330324
331325- `TextStart` - символ первого абзаца, чтобы тоже применить стиль
332326- `TextLength` - количество символов, которые должны изменить свойства абзаца
333327- `ModifyMask` - Маска определяет, какой показатель должен быть установлен для каждого абзаца в блоке `TextStart..TextLength`.Другие символы останутся без изменений. Являются членами набора
334328 - `pmm_FirstLine` - изменяет отступ первой строки. Поле `FirstLine` константы `ParaMetric` должно быть инициализировано
335329 - `pmm_HeadIndent` - изменяет отступ абзаца с головы. Поле `HeadIndent` константы `ParaMetric` должно быть инициализировано
336330 - `pmm_TailIndent` - изменяет отступ абзаца с хвоста. Поле `TailIndent` константы `ParaMetric` должно быть инициализировано
337331 - `pmm_SpaceBefore` - меняет пробел до абзаца. Поле `SpaceBefore` константы `ParaMetric` должно быть инициализировано
338332 - `pmm_SpaceAfter` - меняет пробел после (ниже) абзаца. Поле `SpaceAfter` константы `ParaMetric` должно быть инициализировано
339333 - `pmm_LineSpacing` - межстрочный интервал внутри абзаца. Поле `LineSpace` константы `ParaMetric` должно быть инициализировано
340334- `ParaMetric` - структура, содержащая значения, которые будут установлены. Только поля, указанные \[структурой\] `ModifyMask` должны быть инициализированы
341335
342336### LoadRichText
343337
344338``` pascal
345339function LoadRichText(Source: TStream): Boolean; virtual;
346340```
347341
348342- `Source: TStream` - поток для чтения данных из форматированного текста
349343
350344Метод загружает данные в формате RTF из указанного потока. Возвращает true в случае успеха и false в противном случае. Если source равно nil, метод возвращает false.
351345
352346Содержимое TRichMemo полностью заменяется содержимым в исходном потоке. Текущий выбор текста сбрасывается.
353347
354348### SaveRichText
355349
356350``` pascal
357351function SaveRichText(Dest: TStream): Boolean; virtual;
358352```
359353
360354- `Source: TStream` - поток для записи данных форматированного текста
361355
362356Метод сохраняет RTF-кодированные данные в указанном потоке. Возвращает true в случае успеха и false в противном случае. Если source равно nil, метод возвращает false.
363357
364358Текущее состояние TRichMemo не меняется после возврата метода.
365359
366360### Search
367361
368362``` pascal
369363function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions): Integer;
370364```
371365
372366- `ANiddle: string` - текст для поиска.
373367- `Start: Integer` - позиция символа, с которой начинается поиск, если -1 или 0 - поиск сначала.
374368- `Len: Integer` - длина (в символах, а не в байтах) текста для поиска посередине.
375369- `SearchOpt: TSearchOptions`
376370 - `soMatchCase` - поиск с учетом регистра.
377371 - `soBackward` - поиск от конца документа до символа, обозначенного параметром "Start".
378372 - `soWholeWord` - поиск всего слова.
379373
380374Метод возвращает положение символа найденной подстроки. Позиция подходит для использования в свойстве `SelStart`. Тем не менее, может быть невозможно использовать для операции прямого копирования, если в коде присутствуют символы Unicode. Вместо этого следует использовать UTF8Copy.
381375
382376Если `ANiddle` не был найден в тексте, возвращается -1
383377
384378``` pascal
385379function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions;
386380 var TextStart, TextLength: Integer): Boolean;
387381```
388382
389383(Метод введен с r5115)
390384
391385- `ANiddle: string` - текст для поиска.
392386- `Start: Integer` - позиция символа, с которой начинается поиск, если -1 или 0 - поиск сначала.
393387- `Len: Integer` - длина (в символах, а не в байтах) текста для поиска посередине.
394388- `SearchOpt: TSearchOptions`
395389 - `soMatchCase` - поиск с учетом регистра
396390 - `soBackward` - поиск от конца документа до символа, обозначенного параметром "Start".
397391 - `soWholeWord` - поиск всего слова.
398392- `(output) ATextStart` - позиция найденного текста (в символах)
399393- `(output) ATextLength` - длина найденного текста (в символах (позиции курсора!))
400394
401395Метод возвращает значение true, если искомая подстрока найдена, в противном случае - значение false.
402396
403397Возвращенные значения `ATextStart` и `ATextLength` подходят для использования в свойствах `SelStart` и `SelLength`.
404398
405399> **Note:** для сложных сценариев найденный текст может совпадать с искомой подстрокой. Поведение поиска (в сложных сценариях) зависит от набора виджетов. Таким образом, поиск одной и той же строки в разных наборах виджетов (например, win32 или gtk2) может привести к разным результатам. Если вам нужны одинаковые результаты и вы их не получили, создайте отчет об ошибке.
406400
407401Если вам нужно извлечь найденный текст, вы должны использовать метод `GetText()` (передавая значения `ATextStart` и `ATextLength`).
408402
409403### GetText, GetUText
410404
411405``` pascal
412406 function GetText(TextStart, TextLength: Integer): String;
413407 function GetUText(TextStart, TextLength: Integer): UnicodeString;
414408```
415409
416410- `TextStart: Integer` -позиция символа для начала извлечения (0 - это первый символ в тексте).
417411- `TextLength: Integer` - длина (в символах, а не в байтах) текста для извлечения
418412
419413`GetText()` возвращает подстроку UTF8
420414
421415`GetUText()` возвращает подстроку UTF16
422416
423417Текущее выделение не будет зависеть от операции. (Если вы видите, что выделение пострадало, пожалуйста, сообщите о проблеме).
424418
425419Вы не должны учитывать \[абстрактную\] эффективность любого метода. Например, WinAPI внутренне работает с символами UTF16, поэтому `GetUText()` **может** быть более эффективным для него. В то время как Gtk2 работает с UTF8 и вызов `GetText()` **может** быть более эффективным для него. Вместо того, чтобы думать о базовой системе, вы должны учитывать потребности вашей задачи.
426420
427421### Redo
428422
429423``` pascal
430424 procedure Redo;
431425```
432426
433427Метод восстанавливает последнее предыдущее изменение [undone](http://lazarus-ccr.sourceforge.net/docs/lcl/stdctrls/tcustomedit.undo.html).
434428
435429Вы всегда можете вызвать для проверки [[RichMemo/ru|CanRedo]], если есть какие-либо действия\[, которые\] могут быть переделаны.
436430
437431## Свойства
438432
439433### ZoomFactor
440434
441435``` pascal
442436property ZoomFactor: double
443437```
444438
445439Read/Write свойство. Управляет масштабированием содержимого RichMemo. 1.0 - без увеличения. Менее \< 1,0 - уменьшить масштаб, более 1,0 - увеличить масштаб. Если установлено 0 - \[приводится к\] значению по умолчанию равным 1,0 коэффициенту масштабирования (без увеличения).
446440
447441### HideSelection
448442
449443``` pascal
450444property HideSelection: Boolean default false
451445```
452446
453447Read/Write свойство. Если True, то выделение RichMemo скрыто, пока элемент управления не в фокусе. Если False, выделение отображается постоянно.
454448
455449### CanRedo
456450
457451``` pascal
458452property CanRedo: Boolean
459453```
460454
461455Если \[возвращаемое значение\] True, в очереди отмены есть действия, которые можно повторить. Если \[возвращаемое\] значение False, в очереди отмены нет действий, которые можно повторить. Вызов Redo не будет иметь никакого эффекта.
462456
463457### RTF
464458
465459``` pascal
466460property Rtf: String
467461```
468462
469463Read/Write свойство, которое позволяет читать или записывать текст в формате RTF для всего элемента управления. Назначение свойства - иметь возможность устанавливать Rich-Text во время разработки, однако свойство также будет работать во время выполнения.
470464
471-<figure>
472465<img src="RtfEditor.PNG" title="RtfEditor.PNG" width="400" />
473-<figcaption>RtfEditor.PNG</figcaption>
474-</figure>
475466
476467Если значение свойства является пустой строкой, то свойство Lines используется как простой текст для инициализации значения элемента управления во время загрузки.
477468
478469> **Note:** Свойство доступно только в классе TRichMemo, оно недоступно (или вообще не реализовано) в классе TCustomRichMemo. Рекомендуется использовать LoadRichText/SaveRichText для изменения содержимого страницы только потому, что они могут занимать меньше памяти, чем копирование всего расширенного текста в память.
479470
480471> **Note:** **для кроссплатформенной и прямой совместимости** - в настоящее время свойство реализовано на основе набора виджетов, обеспечивающего чтение/запись в формате Rich-text. Весьма вероятно, что в ближайшем будущем оно будет изменено на использование кода чтения/записи RichMemo только RTF-stream. Проблема в том, что старые системы могут не поддерживать последнюю версию RTF.
481472
482473Так что прямо сейчас вы можете столкнуться с проблемой, когда вы создадите проект в Gtk2 и сохраните richmemo время разработки, содержащее символы Unicode. Затем, если вы попытаетесь загрузить его на компьютер с XP и использовать собственный загрузчик widgetset, вы можете увидеть символы, отсутствующие или неправильно отображенные. Переход на использование \[механизмов\] RichMemo загрузки/сохранения RTF предотвратит эту проблему. В настоящее время вы также можете избежать этого, зарегистрировав загрузчики RichMemo (вызовите процедуры RegisterRTFLoader, RegisterRTFSaver при инициализации проекта перед загрузкой любого RichMemo)
483474
484475## События
485476
486477### OnSelectionChange
487478
488479``` pascal
489480property OnSelectionChange: TNotifyEvent
490481TNotifyEvent = procedure (Sender: TObject) of object;
491482```
492483
493484Событие запускается всякий раз, когда в RichMemo изменяется выделение: либо программно, либо из-за действий пользователя.
494485
495486## TRichEditForMemo
496487
497488Помощник класса, который реализует программный интерфейс RichEdit. Помощник объявлен в модуле RichEditHelpers, поэтому вы должны добавить его в раздел использования. Помощники доступны в FPC 2.6.0 или старше.
498489
499490### Методы
500491
501492#### FindText
502493
503494Поиск заданного диапазона в тексте для целевой строки
504495
505496### Свойства
506497
507498#### SelAttributes
508499
509500Читает/Изменяет атрибуты символа текущего выделения
510501
511502### Paragraph
512503
513504Читает/Изменяет атрибуты абзаца текущего выделения.
514505
515506### RichMemoUtils
516507
517508Представлен модуль, добавляющий некоторые полезные функции, специфичные для ОС, для работы с RichMemo.
518509
519510#### InsertImageFromFile
520511
521512`function InsertImageFromFile (const ARichMemo: TCustomRichMemo; APos: Integer;`\
522513`    const FileNameUTF8: string;`\
523514`    const AImgSize: TSize`\
524515`): Boolean = nil;`
525516
526-*<u>Отказ от ответственности</u>: функция будет вставлять файл изображения в RichMemo (если он реализован набором виджетов), но очень неэффективным способом. Изображение будет прочитано снова, и память будет перераспределяться для изображения каждый раз. Поэтому, пожалуйста, не используйте его для смайликов в чате. Наилучшим \[выбором будет\] API (с кэшированием данных). (Вот почему этот метод не является частью класса TCustomRichMemo).*
517+*Отказ от ответственности: функция будет вставлять файл изображения в RichMemo (если он реализован набором виджетов), но очень неэффективным способом. Изображение будет прочитано снова, и память будет перераспределяться для изображения каждый раз. Поэтому, пожалуйста, не используйте его для смайликов в чате. Наилучшим \[выбором будет\] API (с кэшированием данных). (Вот почему этот метод не является частью класса TCustomRichMemo).*
527518
528519- `APos` - позиция в тексте
529520- `AImgSize` - размер, который нужно выставлять в **ТОЧКАХ**, а не в пикселях! Если и `cx`, и `cy` равны 0, размер изображения не будет изменен вообще. Если только один \[из размеров\] - `cx, cy` - равен нулю, результаты \[будут\] неопределенными.
530521
531522Есть также служебная функция **InsertImageFromFileNoResize**, которая вызывает InsertImageFromFile, передавая размер как 0.
532523
533524Пример использования
534525
535526``` pascal
536527 procedure TForm1.Button1Click(Sender: TObject);
537528 begin
538529 // вызов диалога для выбора картинки для вставки
539530 if OpenDialog1.Execute then
540531 // вставка картинки в текущую позицию курсора RichMemo
541532 InsertImageFromFileNoResize(RichMemo1, RichMemo1.SelStart, OpenDialog1.FileName);
542533 end;
543534```
544535
545536### InsertStyledText, InsertColorStyledText, InsertFontText
546537
547538Набор функций, которые упрощают добавление и замену стилизованного текста. Указанный стиль текста применяется к вставке. Общее правило для всех функций, если `InsPos` (позиция вставки) отрицательна - текст добавляется в конец. Для вставки текста в начало теста `InsPos` должна быть установлена в 0.
548539
549540Вставленный текст не обязательно должен находиться на новой строке или добавлять новую строку. Возможно, вы захотите добавить символ `LineFeed` в параметр `TextUTF8`, чтобы вставленный текст был новой строкой.
550541
551542``` pascal
552543procedure InsertStyledText(
553544 const ARichMemo: TCustomRichMemo;
554545 const TextUTF8: String;
555546 AStyle: TFontStyles;
556547 InsPos : Integer = -1 )
557548```
558549
559550`InsertStyledText` вставляет стилизованный текст в указанную позицию.
560551
561552``` pascal
562553procedure InsertColorStyledText(
563554 const ARichMemo: TCustomRichMemo;
564555 const TextUTF8: String;
565556 AColor: TColor;
566557 AStyle: TFontStyles;
567558 InsPos : Integer = -1 )
568559```
569560
570561`InsertColorStyledText` вставляет текст с указанным стилем и цветом в указанной позиции (по умолчанию в конец RichMemo).
571562
572563``` pascal
573564procedure InsertFontText(
574565 const ARichMemo: TCustomRichMemo;
575566 const TextUTF8: String;
576567 const prms: TFontParams;
577568 InsPos : Integer = -1 )
578569```
579570
580571`InsertFontText` вставляет текст и применяет к нему указанные FontParams.
581572
582573Возможно, вы захотите создать помощник класса для реализации этих функций в качестве методов для RichMemo. Осторожно, если вы используете [[RichMemo/ru|Delphi-совместимый помощник]] - вы можете \[попасть\] в конфликт.
583574
584575## Установка
585576
586577- Получить последнюю версию из SVN
587578- Откройте пакет и установите его, пересоберите IDE
588579- TRichMemo будет добавлен на вкладку 'Common Controls'
589580
590581## Часто задаваемые вопросы
591582
592583### Использование RichMemo в общих библиотеках
593584
594585[Issue \#17412](http://bugs.freepascal.org/view.php?id=17412) Если вам нужно использовать компонент в разделяемой библиотеке, вам может понадобиться добавить ключ -fPIC к опции компилятора «пакета» и «проекта».
595586
596587## (Delphi) RichEdit-подобный интерфейс
597588
598589[Issue \#14632](http://bugs.freepascal.org/view.php?id=14632) Типичная проблема - портирование существующего кода, использующего RichEdit из Delphi. Интерфейс RichMemo не совпадает с RichEdit во многих отношениях. Но есть два способа справиться с этим:
599590
600591- вы можете создать подкласс из TCustomRichMemo (или RichMemo) и реализовать методы Delphi RichEdit;
601592- вы можете использовать модуль RichMemoHelpers (требуется fpc 2.6.0 или более поздняя версия) и использовать методы, предоставляемые классом Helpers; в настоящее время реализованы свойства SelAttributes и Paragraph.
602593
603594``` pascal
604595 uses ... RichMemo, RichMemoHelpers;
605596
606597 TForm = class
607598 RichMemo1 : TRichMemo;
608599
609600 // Свойство SelAttributes недоступно в базовом классе,
610601 // но добавлено помощником, определенным в модуле RichMemoHelpers
611602 RichMemo1.SelAttributes.Name := 'Courier New';
612603```
613604
614605## Добавление смешанного цветного текста в конец RichMemo
615606
616607Если вам просто нужна простая раскраска, то вот пример, который будет каждый раз добавлять новую строку со случайным цветом (протестировано в Windows):
617608
618609``` pascal
619610 procedure TForm1.Button1Click(Sender: TObject);
620611 var
621612 i, j: integer;
622613 str: string;
623614 begin
624615 with Richmemo1 do
625616 begin
626617 str := 'Newline text';
627618 i := Length(Lines.Text) - Lines.Count; // CR(перевод каретки) как #10#13 считается только один раз, так что вычтите его один раз
628619 j := Length(str) + 1; // +1 сделать CR в том же формате
629620 Lines.Add(str);
630621 SetRangeColor(i, j, Round(random * $FFFFFF));
631622 end;
632623 end;
633624```
634625
635-` `<span style="color:#0140FF">`Newline text`</span>\
636-` `<span style="color:#507FAF">`NewLine text`</span>\
637-` `<span style="color:#C04A90">`NewLine text`</span>
626+` ``Newline text`\
627+` ``NewLine text`\
628+` ``NewLine text`
638629
639630Альтернативный пример простой раскраски (протестировано на Windows):
640631
641632``` pascal
642633 procedure TForm1.Button2Click(Sender: TObject);
643634 begin
644635 with RichMemo1 do
645636 begin
646637 Lines.Add('Line in red');
647638 SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clRed);
648639
649640 Lines.Add('Line in blue');
650641 SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clBlue);
651642
652643 Lines.Add('Normal line.');
653644 Lines.Add('Normal line.');
654645
655646 Lines.Add('Line in green ');
656647 SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clGreen);
657648 end;
658649 end;
659650```
660651
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>
652+` ``Line in red`\
653+` ``Line in blue`\
654+` ``Normal line.`\
655+` ``Normal line.`\
656+` ``Line in green`
666657
667658Если вам нужна смешанная раскраска, то это пример, который добавит новую строку с несколькими разноцветными словами (протестировано в Windows):
668659
669660``` pascal
670661procedure TForm1.Button3Click(Sender: TObject);
671662 procedure AddColorStr(s: string; const col: TColor = clBlack; const NewLine: boolean = true);
672663 begin
673664 with RichMemo1 do
674665 begin
675666 if NewLine then
676667 begin
677668 Lines.Add('');
678669 Lines.Delete(Lines.Count - 1); // избегаем двойного межстрочного интервала
679670 end;
680671
681672 SelStart := Length(Text);
682673 SelText := s;
683674 SelLength := Length(s);
684675 SetRangeColor(SelStart, SelLength, col);
685676
686677 // отменяем выделение вставленной строки и помещаем курсор в конец текста
687678 SelStart := Length(Text);
688679 SelText := '';
689680 end;
690681 end;
691682 begin
692683 AddColorStr('Black, ');
693684 AddColorStr('Green, ', clGReen, false);
694685 AddColorStr('Blue, ', clBlue, false);
695686 AddColorStr('Red', clRed, false);
696687 end;
697688```
698689
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>
690+` ``Black, ``Green, ``Blue, ``Red`\
691+` ``Black, ``Green, ``Blue, ``Red`\
692+` ``Black, ``Green, ``Blue, ``Red`
702693
703694## Разбор языка разметки
704695
705696![mlparse example](/wiki-images/8/8c/Mlparse.png) Нативные элементы управления rich-edit не поддерживают синтаксический анализ языка разметки.
706697
707698Вам нужно написать эту \[функциональность\] самостоятельно, как показано в примере с mlparse.
708699
709700## Что внутри
710701
711702### Матрица поддержки платформы
712703
713704Ожидается, что значения в матрице не будут статическими (за исключением столбца "carbon"), каждая система должна поддерживать все функции, объявленные RichMemo.
714705
715706Обратите внимание, что таблица содержит больше функций, чем опубликовано выше. Это означает, что API-интерфейсы уже доступны в RichMemo, но, поскольку они нестабильны (на некоторых платформах), они считаются «экспериментальными», а не обещанными.
716707
717708| Особенность | Win32 | Gtk2 | Qt | Cocoa | Carbon |
718709|------------------------------------|-------|------|-----|-------|--------|
719710| Выбор цвета и стиля шрифта | | | | | |
720711| Цвет фона шрифта | | | | | |
721712| Подстрочный, надстрочный \[текст\] | | | | | |
722713| \[функция\] GetStyleRange | | | | | |
723714| Выравнивание абзаца | | | | | |
724715| Метрика абзаца | | | | | |
725716| Отступы абзаца | | | | | |
726717| Масштабирование | | | | | |
727718| Печать | | | | | |
728719| Загрузка/сохранение RTF | | | | | |
729720| Возможность вставки | | | | | |
730721
731722### Win32
732723
733724![RichMemo without Theme patch](/wiki-images/e/e9/Rm_win32_notheme.PNG) ![RichMemo with Theme](/wiki-images/1/19/Rm_win32_theme.PNG)
734725
735726- [RichEdit](https://msdn.microsoft.com/en-us/library/windows/desktop/bb787605%28v=vs.85%29.aspx) используется в качестве системного виджета. Последний известный .dll загружается и инициализируется при запуске. Обратите внимание, что RichEdit 1.0 не поддерживает большинство функций.
736727- Внутренняя оболочка RichEditManager предоставляется для совместимости с Win 9x. Однако это никогда не испытывалось и не проверялось. Также ожидается, что объект TOM может быть упакован как одна из реализаций RichEditManager. Однако имеющийся на месте «менеджер» может быть полностью удален.
737728- Согласно Интернету, элемент управления 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.
738729
739730Win32RichMemo предоставляет глобальную переменную NCPaint. Это обработчик рисования не-клиентской области. По умолчанию он пытается нарисовать тематическую границу (см. Win32RichMemo.ThemedNCPaint для реализации). Он обеспечивает хорошие результаты по темам Windows XP, но в более поздних темах (где используются анимация) результаты не так хороши и должны быть обновлены.
740731
741732Чтобы система могла выполнять только NCPaint (т.е. реализация LCL вызывает проблемы или новые окна обновляли RichEdit для правильного рисования границ), вы можете изменить значение NCPaint во время выполнения, сбросив его в nil:
742733
743734``` pascal
744735 uses
745736 RichMemo, ..
746737 {$ifdef WINDOWS}
747738 Win32RichMemo
748739 {$endif}
749740
750741 initialization
751742 {$ifdef WINDOWS}
752743 Win32RichMemo.NCPaint:=nil;
753744 {$endif}
754745```
755746
756747Вы также можете предоставить собственную реализацию NCPaint. Однако, если вы реализуете правильную анимацию рисунка темы, пожалуйста, предоставьте патч.
757748
758749Поведение зависит от реализации Windows и не должно (и не будет) частью интерфейса RichMemo.
759750
760751### Gtk2
761752
762753- В качестве системного виджета используется [GtkTextView](https://developer.gnome.org/gtk2/stable/GtkTextView.html).
763754- Subscript и Superscript изначально не поддерживаются, в gtk2richmemo реализован дополнительный код для их реализации.
764755- Маркированные и нумерованные списки эмулируются.
765756
766757### Gtk3
767758
768759API между Gtk2 и [Gtk3](https://developer.gnome.org/gtk3/stable/GtkTextView.html) на самом деле не отличаются. Основное отличие в отрисовке. Для Gtk3 активно используется Cairo Canvas. Единственная область, на которую это влияет - "внутренности". Если кто-то хочет внести свой вклад в реализацию Gtk2 - пожалуйста, создайте отдельные модули gtk3richmemoXXX. Не нужно создавать {\$ ifdefs} в модулях gtk2.
769760
770761### Cocoa
771762
772763- Для Cocoa в качестве системного виджета используется [NSTextView](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTextView_Class/index.html).
773764- Не каждое семейство шрифтов предоставляет «курсивный» шрифт. Таким образом, даже если вы передадите fsItalic как часть Style для шрифта, он может быть проигнорирован.
774765
775766### Qt
776767
777768- Используется [QTextEdit](http://doc.qt.io/qt-4.8/qtextedit.html) виджет. В современных C-отображениях для Qt отсутствует множество API-интерфейсов RichText, поэтому полная реализация в настоящее время невозможна.
778769- Следующие классы должны быть сопоставлены с C-функциями:
779770 - [QTextBlockFormatH](http://doc.qt.io/qt-4.8/qtextblockformat.html) необходим для выравнивания абзацев (например, отступы абзаца, межстрочный интервал и табуляции). QTextEdit предоставляет только выравнивание абзаца.
780771 - [QTextCharFormatH](http://doc.qt.io/qt-4.8/qtextcharformat.html) необходим для дополнительного форматирования символов (то есть вертикальное выравнивание, поддержка ссылок). QTextEdit предоставляет только стили шрифтов.
781772
782773## См. также
783774
784775- [[RichMemo/Features]] - комментирует некоторые функции в процессе.
785776- [[RichMemo/WorkArounds]] - некоторые заметки о функциях еще не завершены.
786777- [[RichMemo/Defines]] - дополнительные переключатели пакетов, которые позволяют решить проблемы компиляции/времени выполнения
787778- [[RichMemo/Samples]] - еще примеры
788779- [MyNotex](https://sites.google.com/site/mynotex) приложение, которое использует модифицированный пакет Massimo Nardello RichMemo для Linux-Gtk2
789780- [[TMemo]]
790781- [[KControls|KMemo control]]
791782
792783---
793784*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