Sign in Join
Wiki copytemporary

RichMemo/ru: what changed

Revision 3 to 4. 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
29-[`https://github.com/skalogryz/richmemo`](https://github.com/skalogryz/richmemo)
29+```text
30+https://github.com/skalogryz/richmemo
31+```
3032
3133Прим.перев.: Существует также [форк](https://github.com/mrandreastoth/richmemo) данного компонента на гитхабе от [Andreas Toth](https://github.com/mrandreastoth) aka mrandreastoth.
3234
3335## Change Log
3436
3537- Version 1.0.0 22th Jun 2009
3638- Version 0.8.0 Jun 2009
3739
3840## Зависимости / Системные требования
3941
4042- Lazarus 1.0.0
4143
4244Статус: выпущен.
4345
4446## Установка
4547
4648- Скачайте исходники пакета
4749- Установите пакет в Lazarus и пересоберите его
4850- TRichMemo добавится в закладку 'Common Controls'.
4951
5052![](/wiki-images/8/80/RichMemoPalette.PNG)
5153
5254## TRichMemo
5355
5456### Параметры шрифта
5557
5658Параметры шрифта обычно представлены записью `TFontParams`. Тип используется для описания атрибутов шрифта **rich**. Некоторые атрибуты выходят за рамки класса `TFont`, поэтому необходим дополнительный тип. Однако большинство типов данных, связанных с `TFont`, используются повторно (т.е. `TFontStyles`).
5759
5860- `Name` - название шрифта (семейство).
5961- `Size` - размер шрифта в пунктах (передача отрицательного значения может привести к неожиданным результатам).
6062- `Color` - цвет шрифта.
6163- `Style` - стили шрифта, включая полужирный, курсив, зачеркнутый, подчеркивание.
6264- `HasBkClr` - логический флаг, если текст для должен иметь цвет фона (если true, поле BkColor используется, в противном случае BkColor игнорируется). Прозрачность не поддерживается.
6365- `BkColor` - цвет фона (или подсветка) для текста.
6466- `VScriptPos` - вертикальная настройка текста ![](/wiki-images/c/c1/Richmemo_Subsuper.png).
6567 - `vpNormal` - нет особой позиции.
6668 - `vpSubscript` - текст - нижний индекс.
6769 - `vpSuperscript` - текст - верхний индекс.
6870
6971
7072Фактическое вертикальное смещение индексов верх/низ зависит от реализации ОС и в настоящее время не может контролироваться.
7173
7274Вы можете присвоить `FontParams` из структуры `TFont`. Для этого вам нужно использовать функцию `GetFontParams(afont: TFont)`. Обратите внимание, что для большинства элементов управления LCL для `TFont` установлены значения по умолчанию. Это не фактические значения, а скорее указание на то, что следует использовать шрифт по умолчанию для элемента управления (аналогично `crDefault` для `TColor`).
7375
7476Функция `GetFontParams` разрешает имя шрифта по умолчанию и возвращает фактическое имя семейства шрифтов.
7577
7678## Методы
7779
7880### SetTextAttributes
7981
8082``` pascal
8183procedure SetTextAttributes(TextStart, TextLen: Integer; AFont: TFont);
8284```
8385
8486- `TextStart : Integer` - первый символ, который будет изменен
8587- `TextLen : Integer` - количество символов для изменения
8688- `AFont : TFont` - шрифт, который должен быть применен к части текста
8789
8890``` pascal
8991procedure SetTextAttributes(TextStart, TextLen: Integer; const TextParams: TFontParams);
9092```
9193
9294- `TextStart : Integer` - первый символ, который будет изменен
9395- `TextLen : Integer` - количество символов для изменения
9496- `TextParams : TFontParams` - параметры шрифта, которые будут установлены
9597
9698Методы `SetTextureAttributes` изменяют указанный стиль текстового диапазона. Параметры шрифта передаются в обоих методах, параметром `AFont` (объект LCL `TFont`) или `TFontParams` (объявлено в RichMemo)
9799
98100Установка атрибутов текста не меняет текущий выбор. Если необходимо изменить стиль выделенного в данный момент текста, вам следует выбрать `SelStart` и `SelLength` в качестве значений текстового диапазона:
99101
100102``` pascal
101103RichMemo1.SetTextAttributes(RichMemo1.SelStart, RichMemo1.SelLength, FontDialog1.Font);
102104```
103105
104106### GetTextAttributes
105107
106108``` pascal
107109function GetTextAttributes(TextStart: Integer; var TextParams: TFontParams): Boolean; virtual;
108110```
109111
110112- `TextStart : Integer` - позиция символа для запроса параметров шрифта
111113- `var TextParams : TFontParams` - выходное значение, заполненное атрибутами символа шрифта. Если метод завершается неудачно и возвращает `false`, значения поля записи будут неопределенными.
112114
113115Заполняет параметры шрифта символа в позиции `TextStart`. Метод возвращает `True`, если `TextStart` является действительной позицией символа, и `False` в противном случае.
114116
115117### GetStyleRange
116118
117119``` pascal
118120function GetStyleRange(CharPos: Integer; var RangeStart, RangeLen: Integer): Boolean; virtual;
119121```
120122
121123Возвращает диапазон символов с одинаковыми параметрами шрифта, т.е. все символы в диапазоне имеют одинаковые имя, размер, цвет и стили шрифта.
122124
123125- `CharPos : Integer` - символ, который принадлежит диапазону стилей. Позиция не обязательно быть в начале диапазона стилей. Она может быть в середине конца диапазона стилей. Первая позиция символа возвращается параметром `RangeStart`.
124126- `var RangeStart : Integer` - первый символ в диапазоне
125127- `var RangeLen : Integer` - количество символов в диапазоне
126128
127129Метод возвращает `true` в случае успеха. Метод возвращает `false`, если `CharPos` имеет неправильное значение - больше доступных символов или какая-либо другая ошибка.
128130
129131### CharAtPos
130132
131133``` pascal
132134function CharAtPos(x,y: Integer): Integer; virtual;
133135```
134136
135137Возвращает смещение символа от нулевой позиции (не позиция UTF8). Возвращает -1 в случае неудачи.
136138
137139- `x, y` - точка в клиентской области элемента управления RichMemo.
138140
139141Метод знает о состоянии прокрутки элемента управления. Таким образом, два вызова `CharAtPos(0,0)` могут возвращать разные значения, если между вызовами изменяется позиция прокрутки. Смотрите "examples/hittest" для \[получения\] примера использования.
140142
141143Если указанные `x,y` будут вне содержимого RichMemo, возвращаемое значение \[будет\] неопределенным. \[Поведение\] остается \[на усмотрение\] набора виджетов, который либо возвращает -1, либо закрывает доступный символ.
142144
143145### SetRangeColor
144146
145147``` pascal
146148procedure SetRangeColor(TextStart, TextLength: Integer; FontColor: TColor);
147149```
148150
149151Метод устанавливает цвет символов в указанном диапазоне для FontColor. Другие параметры шрифта (имя, размер, стили) остаются без изменений.
150152
151153- `TextStart: Integer` - первый символ в диапазоне
152154- `TextLength: Integer` - количество символов в диапазоне
153155- `FontColor: TColor` - цвет, который должен быть установлен
154156
155157### SetRangeParams
156158
157159``` pascal
158160 procedure SetRangeParams(TextStart, TextLength: Integer; ModifyMask: TTextModifyMask;
159161 const fnt: TFontParams; AddFontStyle, RemoveFontStyle: TFontStyles); overload;
160162```
161163
162164Метод изменяет параметры шрифта в указанном диапазоне.
163165
164166- `TextStart` - первый символ в диапазоне
165167- `TextLength` - количество символов в диапазоне
166168- `ModifyMask` - показывает, какие именно атрибуты шрифта должны быть обновлены. Маска принимает любую комбинацию из следующих значений:
167169 - `tmm_Color` - Цвет шрифта будет изменен (поле `fnt.Color` должно быть заполнено)
168170 - `tmm_Name` - имя шрифта будет изменено (поле `fnt.Name` должно быть заполнено)
169171 - `tmm_Size` - размер шрифта будет изменен (поле `fnt.Size` должно быть заполнено)
170172 - `tmm_Styles` - стили шрифта будут изменены в соответствии с параметрами `AddFontStyle, RemoveFontStyle`
171173 - `tmm_BackColor` - Цвет подсветки текста (фона) будет изменен. (поля `fnt.HasBkClr` и `fnt.BkColor` должны быть заполнены)
172174 - Отправка пустой маски приведет к возврату метода без внесения каких-либо изменений.
173175- `fnt` - Параметры шрифта, которые будут использоваться, в зависимости от значений `ModifyMask`.
174176- `AddFontStyle` - набор стилей, которые должны применяться к диапазону (используется только если `tmm_Style`s в `ModifyMask`, в противном случае игнорируется)
175177- `RemoveFontStyle` - набор стилей шрифта должен быть удален из диапазона (используется только если `tmm_Styles` в `ModifyMask`, в противном случае игнорируется)
176178
177179``` pascal
178180procedure SetRangeParams(TextStart, TextLength: Integer;
179181 ModifyMask: TTextModifyMask; const FontName: String;
180182 FontSize: Integer; FontColor: TColor;
181183 AddFontStyle, RemoveFontStyle: TFontStyles);
182184```
183185
184186Перегруженная версия метода. Это просто оболочка вокруг параметра, использующая структуру `TFontParams`. Метод не поддерживает изменение цвета фона, вы должны использовать версию `TFontParams`
185187
186188- `FontName` - имя шрифта, которое должно быть установлено (используется только если `tmm_Name` в `ModifyMask`, в противном случае игнорируется)
187189- `FontColor` - Цвет шрифта, который должен быть установлен (используется только если `tmm_Color` в `ModifyMask`, в противном случае игнорируется)
188190
189191Например, если используется следующий код
190192
191193```delphi
192194 RichMemo1.SetRangeParams (
193195 RichMemo1.SelStart, RichMemo1.SelLength,
194196 [tmm_Styles, tmm_Color], // только изменение цвета и стиля
195197 '', // имя шрифта - оно не используется, поэтому мы можем оставить его пустым
196198 0, // размер шрифта - это размер шрифта, мы можем оставить его пустым
197199 clGreen, // сделать весь текст в выбранной области зеленым цветом
198200 [fsBold, fsItalic], // добавление жирного и курсивного стилей
199201 []
200202 );
201203```
202204
203205### GetParaAlignment
204206
205207Получает выравнивание абзаца
206208
207209``` pascal
208210function GetParaAlignment(TextStart: Integer; var AAlign: TParaAlignment): Boolean;
209211```
210212
211213- `TextStart` - позиция символа, который принадлежит абзацу
212214- `AAlign` - получение выравнивания абзаца.
213215
214216**Примечание**:
215217
216218- Win32 - выравнивание по ширине не работает в Windows XP и более ранних версиях.
217219- OSX - из-за ограничений Carbon, это не работает в Carbon, но работает для виджетов Cocoa.
218220
219221### SetParaAlignment
220222
221223Устанавливает выравнивание абзаца
222224
223225``` pascal
224226procedure SetParaAlignment(TextStart, TextLen: Integer; AAlign: TParaAlignment);
225227```
226228
227229**Примечание**:
228230
229231- Win32 - выравнивание по ширине не работает в Windows XP и более ранних версиях.
230232- OSX - из-за ограничений Carbon, это не работает в Carbon, но работает для виджетов Cocoa. Также необходимо, чтобы правильное выравнивание было загружено из файла RTF.
231233
232234### GetParaMetric
233235
234236Возвращает отступ метрики абзаца для данного абзаца ![](/wiki-images/b/be/Richmemo_parametric.PNG)
235237
236238- `FirstLine` - смещение для первой строки (в пунктах) абзаца от начала элемента управления \[(т.н. "красная строка")\]
237239- `TailIndent` - смещение для каждой строки (в пунктах), за исключением первой строки, абзаца от конца элемента управления
238240- `HeadIndent` - смещение для каждой строки (в пунктах) абзаца от начала элемента управления
239241- `SpaceBefore` - дополнительное место перед абзацем (в пунктах)
240242- `SpaceAfter` - дополнительное место после абзаца (в пунктах)
241243- `LineSpacing` - коэффициент, используемый для расчета межстрочного интервала между строками в абзаце. Коэффициент применяется к размеру шрифта (самый высокий в строке), а не к высоте строки. Таким образом, это соответствует свойству CSS line-height. Обратите внимание, что нормальный межстрочный интервал равен 1,2. То есть шрифт размером 12 пт, фактический межстрочный интервал (равный 1,2) приведет к высоте строки 14 пт.
242244 - не поддерживается в WinXP или более ранних версиях
243245 - в большинстве систем не будет разрешено, если для межстрочного интервала установлено значение меньше 1,2. Значение будет проигнорировано, и оно по умолчанию будет равно 1,2
244246
245247**Примечание**
246248
247249- Параметры абзаца RichEdit указываются в пикселях, а не в точках, поэтому вам нужно либо преобразовать эти размеры самостоятельно, либо использовать метод RichMemoHelper.
248250- обозначение смещений «влево»/«вправо» исключено, чтобы избежать путаницы для RTL.
249251
250252``` pascal
251253function GetParaMetric(TextStart: Integer; var AMetric: TParaMetric): Boolean;
252254```
253255
254256### SetParaMetric
255257
256258Устанавливает метрики абзаца
257259
258260``` pascal
259261procedure SetParaMetric(TextStart, TextLen: Integer; const AMetric: TParaMetric);
260262```
261263
262264Рекомендуется использовать функцию `InitParaMetric` для инициализации структуры `TParaMetric`. В противном случае обнуление структуры равно ее размеру (т.е. достаточно `FillChar(m, sizeof(TParaMetric), 0)`. Если значения `TParaMetric` получены из вызова `GetParaMetric`, то структура считается правильно инициализированной).
263265
264266### GetParaRange
265267
266268Возвращает диапазон символов для абзаца. Абзац идентифицируется символом.
267269
268270``` pascal
269271 function GetParaRange(CharOfs: Integer; var ParaRange: TParaRange): Boolean;
270272 function GetParaRange(CharOfs: Integer; var TextStart, TextLength: Integer): Boolean;
271273```
272274
273275`CharOfs` - символ, который принадлежит абзацу, диапазон которого возвращается. `TParaRange` - это структура, которая возвращает 3 поля
274276
275277- `start` - первый символ в абзаце
276278- `lengthNoBr` - длина абзаца, за исключением символа разрыва строки
277279- `length` - длина абзаца, включая разрыв строки, если присутствующая последняя строка в элементе управления не содержит символа перевода строки, следовательно, `длина = lengthNoBr`.
278280
279281### SetParaTabs
280282
281283Устанавливает набор табуляций для абзацев указанной длины.
282284
283285``` pascal
284286 procedure SetParaTabs(TextStart, TextLen: Integer; const AStopList: TTabStopList);
285287```
286288
287289- `TextStart`
288290- `TextLen`
289291- `AStopList` - структура, которая содержит массив табуляций.
290292 - `Count` - указывает количество инициализированных элементов.
291293 - `Tabs` - массив содержит описание каждой позиции табуляции, состоящее из `Offset` и `Alignment`.
292294 - `Offset` - смещение точки табуляции в пунктах (с левой стороны элемента управления)
293295 - `Align` - выравнивание позиции табуляции (`tabLeft` - по умолчанию, `tabCenter, tabRight, tabDecimal`).
294296
295297**Примечание**
296298
297299Renamefest
298300до r4140 перечисляемыми значениями `TTabAlignment` были `taLeft, taCenter, taRight, taDecimal`, но они вступали в противоречие с объявлениями `Classes.TAlignment`. Таким образом суффикс был изменен.
299301
300302win32
301303позволяет не более 32 табуляций
302304
303305gtk2
304306поддерживается только выравнивание `tabLeft`
305307
306308carbon
307309не реализовано
308310
309311### GetParaTabs
310312
311313Получает массив табуляции. Если конкретные вкладки не указаны (по умолчанию виджет табуляции), счетчик AStopList будет установлен в 0.
312314
313315``` pascal
314316 function GetParaTabs(CharOfs: Integer; var AStopList: TTabStopList): Boolean;
315317```
316318
317319### SetRangeParaParams
318320
319321Выборочно устанавливает метрики абзаца
320322
321323``` pascal
322324 procedure SetRangeParaParams(TextStart, TextLength: Integer; ModifyMask: TParaModifyMask; const ParaMetric: TParaMetric);
323325```
324326
325327- `TextStart` - символ первого абзаца, чтобы тоже применить стиль
326328- `TextLength` - количество символов, которые должны изменить свойства абзаца
327329- `ModifyMask` - Маска определяет, какой показатель должен быть установлен для каждого абзаца в блоке `TextStart..TextLength`.Другие символы останутся без изменений. Являются членами набора
328330 - `pmm_FirstLine` - изменяет отступ первой строки. Поле `FirstLine` константы `ParaMetric` должно быть инициализировано
329331 - `pmm_HeadIndent` - изменяет отступ абзаца с головы. Поле `HeadIndent` константы `ParaMetric` должно быть инициализировано
330332 - `pmm_TailIndent` - изменяет отступ абзаца с хвоста. Поле `TailIndent` константы `ParaMetric` должно быть инициализировано
331333 - `pmm_SpaceBefore` - меняет пробел до абзаца. Поле `SpaceBefore` константы `ParaMetric` должно быть инициализировано
332334 - `pmm_SpaceAfter` - меняет пробел после (ниже) абзаца. Поле `SpaceAfter` константы `ParaMetric` должно быть инициализировано
333335 - `pmm_LineSpacing` - межстрочный интервал внутри абзаца. Поле `LineSpace` константы `ParaMetric` должно быть инициализировано
334336- `ParaMetric` - структура, содержащая значения, которые будут установлены. Только поля, указанные \[структурой\] `ModifyMask` должны быть инициализированы
335337
336338### LoadRichText
337339
338340``` pascal
339341function LoadRichText(Source: TStream): Boolean; virtual;
340342```
341343
342344- `Source: TStream` - поток для чтения данных из форматированного текста
343345
344346Метод загружает данные в формате RTF из указанного потока. Возвращает true в случае успеха и false в противном случае. Если source равно nil, метод возвращает false.
345347
346348Содержимое TRichMemo полностью заменяется содержимым в исходном потоке. Текущий выбор текста сбрасывается.
347349
348350### SaveRichText
349351
350352``` pascal
351353function SaveRichText(Dest: TStream): Boolean; virtual;
352354```
353355
354356- `Source: TStream` - поток для записи данных форматированного текста
355357
356358Метод сохраняет RTF-кодированные данные в указанном потоке. Возвращает true в случае успеха и false в противном случае. Если source равно nil, метод возвращает false.
357359
358360Текущее состояние TRichMemo не меняется после возврата метода.
359361
360362### Search
361363
362364``` pascal
363365function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions): Integer;
364366```
365367
366368- `ANiddle: string` - текст для поиска.
367369- `Start: Integer` - позиция символа, с которой начинается поиск, если -1 или 0 - поиск сначала.
368370- `Len: Integer` - длина (в символах, а не в байтах) текста для поиска посередине.
369371- `SearchOpt: TSearchOptions`
370372 - `soMatchCase` - поиск с учетом регистра.
371373 - `soBackward` - поиск от конца документа до символа, обозначенного параметром "Start".
372374 - `soWholeWord` - поиск всего слова.
373375
374376Метод возвращает положение символа найденной подстроки. Позиция подходит для использования в свойстве `SelStart`. Тем не менее, может быть невозможно использовать для операции прямого копирования, если в коде присутствуют символы Unicode. Вместо этого следует использовать UTF8Copy.
375377
376378Если `ANiddle` не был найден в тексте, возвращается -1
377379
378380``` pascal
379381function Search(const ANiddle: string; Start, Len: Integer; const SearchOpt: TSearchOptions;
380382 var TextStart, TextLength: Integer): Boolean;
381383```
382384
383385(Метод введен с r5115)
384386
385387- `ANiddle: string` - текст для поиска.
386388- `Start: Integer` - позиция символа, с которой начинается поиск, если -1 или 0 - поиск сначала.
387389- `Len: Integer` - длина (в символах, а не в байтах) текста для поиска посередине.
388390- `SearchOpt: TSearchOptions`
389391 - `soMatchCase` - поиск с учетом регистра
390392 - `soBackward` - поиск от конца документа до символа, обозначенного параметром "Start".
391393 - `soWholeWord` - поиск всего слова.
392394- `(output) ATextStart` - позиция найденного текста (в символах)
393395- `(output) ATextLength` - длина найденного текста (в символах (позиции курсора!))
394396
395397Метод возвращает значение true, если искомая подстрока найдена, в противном случае - значение false.
396398
397399Возвращенные значения `ATextStart` и `ATextLength` подходят для использования в свойствах `SelStart` и `SelLength`.
398400
399401> **Note:** для сложных сценариев найденный текст может совпадать с искомой подстрокой. Поведение поиска (в сложных сценариях) зависит от набора виджетов. Таким образом, поиск одной и той же строки в разных наборах виджетов (например, win32 или gtk2) может привести к разным результатам. Если вам нужны одинаковые результаты и вы их не получили, создайте отчет об ошибке.
400402
401403Если вам нужно извлечь найденный текст, вы должны использовать метод `GetText()` (передавая значения `ATextStart` и `ATextLength`).
402404
403405### GetText, GetUText
404406
405407``` pascal
406408 function GetText(TextStart, TextLength: Integer): String;
407409 function GetUText(TextStart, TextLength: Integer): UnicodeString;
408410```
409411
410412- `TextStart: Integer` -позиция символа для начала извлечения (0 - это первый символ в тексте).
411413- `TextLength: Integer` - длина (в символах, а не в байтах) текста для извлечения
412414
413415`GetText()` возвращает подстроку UTF8
414416
415417`GetUText()` возвращает подстроку UTF16
416418
417419Текущее выделение не будет зависеть от операции. (Если вы видите, что выделение пострадало, пожалуйста, сообщите о проблеме).
418420
419421Вы не должны учитывать \[абстрактную\] эффективность любого метода. Например, WinAPI внутренне работает с символами UTF16, поэтому `GetUText()` **может** быть более эффективным для него. В то время как Gtk2 работает с UTF8 и вызов `GetText()` **может** быть более эффективным для него. Вместо того, чтобы думать о базовой системе, вы должны учитывать потребности вашей задачи.
420422
421423### Redo
422424
423425``` pascal
424426 procedure Redo;
425427```
426428
427429Метод восстанавливает последнее предыдущее изменение [undone](http://lazarus-ccr.sourceforge.net/docs/lcl/stdctrls/tcustomedit.undo.html).
428430
429431Вы всегда можете вызвать для проверки [[RichMemo/ru|CanRedo]], если есть какие-либо действия\[, которые\] могут быть переделаны.
430432
431433## Свойства
432434
433435### ZoomFactor
434436
435437``` pascal
436438property ZoomFactor: double
437439```
438440
439441Read/Write свойство. Управляет масштабированием содержимого RichMemo. 1.0 - без увеличения. Менее \< 1,0 - уменьшить масштаб, более 1,0 - увеличить масштаб. Если установлено 0 - \[приводится к\] значению по умолчанию равным 1,0 коэффициенту масштабирования (без увеличения).
440442
441443### HideSelection
442444
443445``` pascal
444446property HideSelection: Boolean default false
445447```
446448
447449Read/Write свойство. Если True, то выделение RichMemo скрыто, пока элемент управления не в фокусе. Если False, выделение отображается постоянно.
448450
449451### CanRedo
450452
451453``` pascal
452454property CanRedo: Boolean
453455```
454456
455457Если \[возвращаемое значение\] True, в очереди отмены есть действия, которые можно повторить. Если \[возвращаемое\] значение False, в очереди отмены нет действий, которые можно повторить. Вызов Redo не будет иметь никакого эффекта.
456458
457459### RTF
458460
459461``` pascal
460462property Rtf: String
461463```
462464
463465Read/Write свойство, которое позволяет читать или записывать текст в формате RTF для всего элемента управления. Назначение свойства - иметь возможность устанавливать Rich-Text во время разработки, однако свойство также будет работать во время выполнения.
464466
465467![](/wiki-images/b/b8/RtfEditor.PNG)
466468
467469Если значение свойства является пустой строкой, то свойство Lines используется как простой текст для инициализации значения элемента управления во время загрузки.
468470
469471> **Note:** Свойство доступно только в классе TRichMemo, оно недоступно (или вообще не реализовано) в классе TCustomRichMemo. Рекомендуется использовать LoadRichText/SaveRichText для изменения содержимого страницы только потому, что они могут занимать меньше памяти, чем копирование всего расширенного текста в память.
470472
471473> **Note:** **для кроссплатформенной и прямой совместимости** - в настоящее время свойство реализовано на основе набора виджетов, обеспечивающего чтение/запись в формате Rich-text. Весьма вероятно, что в ближайшем будущем оно будет изменено на использование кода чтения/записи RichMemo только RTF-stream. Проблема в том, что старые системы могут не поддерживать последнюю версию RTF.
472474
473475Так что прямо сейчас вы можете столкнуться с проблемой, когда вы создадите проект в Gtk2 и сохраните richmemo время разработки, содержащее символы Unicode. Затем, если вы попытаетесь загрузить его на компьютер с XP и использовать собственный загрузчик widgetset, вы можете увидеть символы, отсутствующие или неправильно отображенные. Переход на использование \[механизмов\] RichMemo загрузки/сохранения RTF предотвратит эту проблему. В настоящее время вы также можете избежать этого, зарегистрировав загрузчики RichMemo (вызовите процедуры RegisterRTFLoader, RegisterRTFSaver при инициализации проекта перед загрузкой любого RichMemo)
474476
475477## События
476478
477479### OnSelectionChange
478480
479481``` pascal
480482property OnSelectionChange: TNotifyEvent
481483TNotifyEvent = procedure (Sender: TObject) of object;
482484```
483485
484486Событие запускается всякий раз, когда в RichMemo изменяется выделение: либо программно, либо из-за действий пользователя.
485487
486488## TRichEditForMemo
487489
488490Помощник класса, который реализует программный интерфейс RichEdit. Помощник объявлен в модуле RichEditHelpers, поэтому вы должны добавить его в раздел использования. Помощники доступны в FPC 2.6.0 или старше.
489491
490492### Методы
491493
492494#### FindText
493495
494496Поиск заданного диапазона в тексте для целевой строки
495497
496498### Свойства
497499
498500#### SelAttributes
499501
500502Читает/Изменяет атрибуты символа текущего выделения
501503
502504### Paragraph
503505
504506Читает/Изменяет атрибуты абзаца текущего выделения.
505507
506508### RichMemoUtils
507509
508510Представлен модуль, добавляющий некоторые полезные функции, специфичные для ОС, для работы с RichMemo.
509511
510512#### InsertImageFromFile
511513
512-`function InsertImageFromFile (const ARichMemo: TCustomRichMemo; APos: Integer;`\
513-`    const FileNameUTF8: string;`\
514-`    const AImgSize: TSize`\
515-`): Boolean = nil;`
514+``` pascal
515+function InsertImageFromFile (const ARichMemo: TCustomRichMemo; APos: Integer;
516+ const FileNameUTF8: string;
517+ const AImgSize: TSize
518+): Boolean = nil;
519+```
516520
517521*Отказ от ответственности: функция будет вставлять файл изображения в RichMemo (если он реализован набором виджетов), но очень неэффективным способом. Изображение будет прочитано снова, и память будет перераспределяться для изображения каждый раз. Поэтому, пожалуйста, не используйте его для смайликов в чате. Наилучшим \[выбором будет\] API (с кэшированием данных). (Вот почему этот метод не является частью класса TCustomRichMemo).*
518522
519523- `APos` - позиция в тексте
520524- `AImgSize` - размер, который нужно выставлять в **ТОЧКАХ**, а не в пикселях! Если и `cx`, и `cy` равны 0, размер изображения не будет изменен вообще. Если только один \[из размеров\] - `cx, cy` - равен нулю, результаты \[будут\] неопределенными.
521525
522526Есть также служебная функция **InsertImageFromFileNoResize**, которая вызывает InsertImageFromFile, передавая размер как 0.
523527
524528Пример использования
525529
526530``` pascal
527531 procedure TForm1.Button1Click(Sender: TObject);
528532 begin
529533 // вызов диалога для выбора картинки для вставки
530534 if OpenDialog1.Execute then
531535 // вставка картинки в текущую позицию курсора RichMemo
532536 InsertImageFromFileNoResize(RichMemo1, RichMemo1.SelStart, OpenDialog1.FileName);
533537 end;
534538```
535539
536540### InsertStyledText, InsertColorStyledText, InsertFontText
537541
538542Набор функций, которые упрощают добавление и замену стилизованного текста. Указанный стиль текста применяется к вставке. Общее правило для всех функций, если `InsPos` (позиция вставки) отрицательна - текст добавляется в конец. Для вставки текста в начало теста `InsPos` должна быть установлена в 0.
539543
540544Вставленный текст не обязательно должен находиться на новой строке или добавлять новую строку. Возможно, вы захотите добавить символ `LineFeed` в параметр `TextUTF8`, чтобы вставленный текст был новой строкой.
541545
542546``` pascal
543547procedure InsertStyledText(
544548 const ARichMemo: TCustomRichMemo;
545549 const TextUTF8: String;
546550 AStyle: TFontStyles;
547551 InsPos : Integer = -1 )
548552```
549553
550554`InsertStyledText` вставляет стилизованный текст в указанную позицию.
551555
552556``` pascal
553557procedure InsertColorStyledText(
554558 const ARichMemo: TCustomRichMemo;
555559 const TextUTF8: String;
556560 AColor: TColor;
557561 AStyle: TFontStyles;
558562 InsPos : Integer = -1 )
559563```
560564
561565`InsertColorStyledText` вставляет текст с указанным стилем и цветом в указанной позиции (по умолчанию в конец RichMemo).
562566
563567``` pascal
564568procedure InsertFontText(
565569 const ARichMemo: TCustomRichMemo;
566570 const TextUTF8: String;
567571 const prms: TFontParams;
568572 InsPos : Integer = -1 )
569573```
570574
571575`InsertFontText` вставляет текст и применяет к нему указанные FontParams.
572576
573577Возможно, вы захотите создать помощник класса для реализации этих функций в качестве методов для RichMemo. Осторожно, если вы используете [[RichMemo/ru|Delphi-совместимый помощник]] - вы можете \[попасть\] в конфликт.
574578
575579## Установка
576580
577581- Получить последнюю версию из SVN
578582- Откройте пакет и установите его, пересоберите IDE
579583- TRichMemo будет добавлен на вкладку 'Common Controls'
580584
581585## Часто задаваемые вопросы
582586
583587### Использование RichMemo в общих библиотеках
584588
585589[Issue \#17412](http://bugs.freepascal.org/view.php?id=17412) Если вам нужно использовать компонент в разделяемой библиотеке, вам может понадобиться добавить ключ -fPIC к опции компилятора «пакета» и «проекта».
586590
587591## (Delphi) RichEdit-подобный интерфейс
588592
589593[Issue \#14632](http://bugs.freepascal.org/view.php?id=14632) Типичная проблема - портирование существующего кода, использующего RichEdit из Delphi. Интерфейс RichMemo не совпадает с RichEdit во многих отношениях. Но есть два способа справиться с этим:
590594
591595- вы можете создать подкласс из TCustomRichMemo (или RichMemo) и реализовать методы Delphi RichEdit;
592596- вы можете использовать модуль RichMemoHelpers (требуется fpc 2.6.0 или более поздняя версия) и использовать методы, предоставляемые классом Helpers; в настоящее время реализованы свойства SelAttributes и Paragraph.
593597
594598``` pascal
595599 uses ... RichMemo, RichMemoHelpers;
596600
597601 TForm = class
598602 RichMemo1 : TRichMemo;
599603
600604 // Свойство SelAttributes недоступно в базовом классе,
601605 // но добавлено помощником, определенным в модуле RichMemoHelpers
602606 RichMemo1.SelAttributes.Name := 'Courier New';
603607```
604608
605609## Добавление смешанного цветного текста в конец RichMemo
606610
607611Если вам просто нужна простая раскраска, то вот пример, который будет каждый раз добавлять новую строку со случайным цветом (протестировано в Windows):
608612
609613``` pascal
610614 procedure TForm1.Button1Click(Sender: TObject);
611615 var
612616 i, j: integer;
613617 str: string;
614618 begin
615619 with Richmemo1 do
616620 begin
617621 str := 'Newline text';
618622 i := Length(Lines.Text) - Lines.Count; // CR(перевод каретки) как #10#13 считается только один раз, так что вычтите его один раз
619623 j := Length(str) + 1; // +1 сделать CR в том же формате
620624 Lines.Add(str);
621625 SetRangeColor(i, j, Round(random * $FFFFFF));
622626 end;
623627 end;
624628```
625629
626-` ``Newline text`\
627-` ``NewLine text`\
628-` ``NewLine text`
630+```text
631+ <span style="color:#0140FF">Newline text</span>
632+ <span style="color:#507FAF">NewLine text</span>
633+ <span style="color:#C04A90">NewLine text</span>
634+```
629635
630636Альтернативный пример простой раскраски (протестировано на Windows):
631637
632638``` pascal
633639 procedure TForm1.Button2Click(Sender: TObject);
634640 begin
635641 with RichMemo1 do
636642 begin
637643 Lines.Add('Line in red');
638644 SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clRed);
639645
640646 Lines.Add('Line in blue');
641647 SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clBlue);
642648
643649 Lines.Add('Normal line.');
644650 Lines.Add('Normal line.');
645651
646652 Lines.Add('Line in green ');
647653 SetRangeColor(Length(Lines.Text) - Length(Lines[Lines.Count - 1]) - Lines.Count - 1, Length(Lines[Lines.Count - 1]), clGreen);
648654 end;
649655 end;
650656```
651657
652-` ``Line in red`\
653-` ``Line in blue`\
654-` ``Normal line.`\
655-` ``Normal line.`\
656-` ``Line in green`
658+```text
659+ <span style="color:#FF0000">Line in red</span>
660+ <span style="color:#0000FF">Line in blue</span>
661+ <span style="color:#000000">Normal line.</span>
662+ <span style="color:#000000">Normal line.</span>
663+ <span style="color:#008000">Line in green</span>
664+```
657665
658666Если вам нужна смешанная раскраска, то это пример, который добавит новую строку с несколькими разноцветными словами (протестировано в Windows):
659667
660668``` pascal
661669procedure TForm1.Button3Click(Sender: TObject);
662670 procedure AddColorStr(s: string; const col: TColor = clBlack; const NewLine: boolean = true);
663671 begin
664672 with RichMemo1 do
665673 begin
666674 if NewLine then
667675 begin
668676 Lines.Add('');
669677 Lines.Delete(Lines.Count - 1); // избегаем двойного межстрочного интервала
670678 end;
671679
672680 SelStart := Length(Text);
673681 SelText := s;
674682 SelLength := Length(s);
675683 SetRangeColor(SelStart, SelLength, col);
676684
677685 // отменяем выделение вставленной строки и помещаем курсор в конец текста
678686 SelStart := Length(Text);
679687 SelText := '';
680688 end;
681689 end;
682690 begin
683691 AddColorStr('Black, ');
684692 AddColorStr('Green, ', clGReen, false);
685693 AddColorStr('Blue, ', clBlue, false);
686694 AddColorStr('Red', clRed, false);
687695 end;
688696```
689697
690-` ``Black, ``Green, ``Blue, ``Red`\
691-` ``Black, ``Green, ``Blue, ``Red`\
692-` ``Black, ``Green, ``Blue, ``Red`
698+```text
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+```
693703
694704## Разбор языка разметки
695705
696706![mlparse example](/wiki-images/8/8c/Mlparse.png) Нативные элементы управления rich-edit не поддерживают синтаксический анализ языка разметки.
697707
698708Вам нужно написать эту \[функциональность\] самостоятельно, как показано в примере с mlparse.
699709
700710## Что внутри
701711
702712### Матрица поддержки платформы
703713
704714Ожидается, что значения в матрице не будут статическими (за исключением столбца "carbon"), каждая система должна поддерживать все функции, объявленные RichMemo.
705715
706716Обратите внимание, что таблица содержит больше функций, чем опубликовано выше. Это означает, что API-интерфейсы уже доступны в RichMemo, но, поскольку они нестабильны (на некоторых платформах), они считаются «экспериментальными», а не обещанными.
707717
708718| Особенность | Win32 | Gtk2 | Qt | Cocoa | Carbon |
709719|------------------------------------|-------|------|-----|-------|--------|
710720| Выбор цвета и стиля шрифта | | | | | |
711721| Цвет фона шрифта | | | | | |
712722| Подстрочный, надстрочный \[текст\] | | | | | |
713723| \[функция\] GetStyleRange | | | | | |
714724| Выравнивание абзаца | | | | | |
715725| Метрика абзаца | | | | | |
716726| Отступы абзаца | | | | | |
717727| Масштабирование | | | | | |
718728| Печать | | | | | |
719729| Загрузка/сохранение RTF | | | | | |
720730| Возможность вставки | | | | | |
721731
722732### Win32
723733
724734![RichMemo without Theme patch](/wiki-images/e/e9/Rm_win32_notheme.PNG) ![RichMemo with Theme](/wiki-images/1/19/Rm_win32_theme.PNG)
725735
726736- [RichEdit](https://msdn.microsoft.com/en-us/library/windows/desktop/bb787605%28v=vs.85%29.aspx) используется в качестве системного виджета. Последний известный .dll загружается и инициализируется при запуске. Обратите внимание, что RichEdit 1.0 не поддерживает большинство функций.
727737- Внутренняя оболочка RichEditManager предоставляется для совместимости с Win 9x. Однако это никогда не испытывалось и не проверялось. Также ожидается, что объект TOM может быть упакован как одна из реализаций RichEditManager. Однако имеющийся на месте «менеджер» может быть полностью удален.
728738- Согласно Интернету, элемент управления 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.
729739
730740Win32RichMemo предоставляет глобальную переменную NCPaint. Это обработчик рисования не-клиентской области. По умолчанию он пытается нарисовать тематическую границу (см. Win32RichMemo.ThemedNCPaint для реализации). Он обеспечивает хорошие результаты по темам Windows XP, но в более поздних темах (где используются анимация) результаты не так хороши и должны быть обновлены.
731741
732742Чтобы система могла выполнять только NCPaint (т.е. реализация LCL вызывает проблемы или новые окна обновляли RichEdit для правильного рисования границ), вы можете изменить значение NCPaint во время выполнения, сбросив его в nil:
733743
734744``` pascal
735745 uses
736746 RichMemo, ..
737747 {$ifdef WINDOWS}
738748 Win32RichMemo
739749 {$endif}
740750
741751 initialization
742752 {$ifdef WINDOWS}
743753 Win32RichMemo.NCPaint:=nil;
744754 {$endif}
745755```
746756
747757Вы также можете предоставить собственную реализацию NCPaint. Однако, если вы реализуете правильную анимацию рисунка темы, пожалуйста, предоставьте патч.
748758
749759Поведение зависит от реализации Windows и не должно (и не будет) частью интерфейса RichMemo.
750760
751761### Gtk2
752762
753763- В качестве системного виджета используется [GtkTextView](https://developer.gnome.org/gtk2/stable/GtkTextView.html).
754764- Subscript и Superscript изначально не поддерживаются, в gtk2richmemo реализован дополнительный код для их реализации.
755765- Маркированные и нумерованные списки эмулируются.
756766
757767### Gtk3
758768
759769API между Gtk2 и [Gtk3](https://developer.gnome.org/gtk3/stable/GtkTextView.html) на самом деле не отличаются. Основное отличие в отрисовке. Для Gtk3 активно используется Cairo Canvas. Единственная область, на которую это влияет - "внутренности". Если кто-то хочет внести свой вклад в реализацию Gtk2 - пожалуйста, создайте отдельные модули gtk3richmemoXXX. Не нужно создавать {\$ ifdefs} в модулях gtk2.
760770
761771### Cocoa
762772
763773- Для Cocoa в качестве системного виджета используется [NSTextView](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTextView_Class/index.html).
764774- Не каждое семейство шрифтов предоставляет «курсивный» шрифт. Таким образом, даже если вы передадите fsItalic как часть Style для шрифта, он может быть проигнорирован.
765775
766776### Qt
767777
768778- Используется [QTextEdit](http://doc.qt.io/qt-4.8/qtextedit.html) виджет. В современных C-отображениях для Qt отсутствует множество API-интерфейсов RichText, поэтому полная реализация в настоящее время невозможна.
769779- Следующие классы должны быть сопоставлены с C-функциями:
770780 - [QTextBlockFormatH](http://doc.qt.io/qt-4.8/qtextblockformat.html) необходим для выравнивания абзацев (например, отступы абзаца, межстрочный интервал и табуляции). QTextEdit предоставляет только выравнивание абзаца.
771781 - [QTextCharFormatH](http://doc.qt.io/qt-4.8/qtextcharformat.html) необходим для дополнительного форматирования символов (то есть вертикальное выравнивание, поддержка ссылок). QTextEdit предоставляет только стили шрифтов.
772782
773783## См. также
774784
775785- [[RichMemo/Features]] - комментирует некоторые функции в процессе.
776786- [[RichMemo/WorkArounds]] - некоторые заметки о функциях еще не завершены.
777787- [[RichMemo/Defines]] - дополнительные переключатели пакетов, которые позволяют решить проблемы компиляции/времени выполнения
778788- [[RichMemo/Samples]] - еще примеры
779789- [MyNotex](https://sites.google.com/site/mynotex) приложение, которое использует модифицированный пакет Massimo Nardello RichMemo для Linux-Gtk2
780790- [[TMemo]]
781791- [[KControls|KMemo control]]
782792
783793---
784794*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