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