Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.165.131] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте.
Не могу сам решить эту задачу. Есть текст, в котором надо выловить надстрочные и подстрочные символы. Как я понял, надо использовать EM_GETCHARFORMAT, но как, я не пойму. Создал новый проект. Использую только стандартные TRichEdit, пока без всяких Jv, cx и пр. Указываю RichEdit1.SelStart:=i; взять текущий символ, и RichEdit1.SelLength:=1; взять 1 символ. Хотя, если указать 3, то все равно берется только 1 символ. Почему - не пойму. Насколько я понял, надо проверять yOffset: "Через EM_GETCHARFORMAT получить информацию о нужном символе в структуру CHARFORMAT (или CHARFORMAT2 для RE 2.0) и проверить содержимое поля yOffset. Если оно содержит нулевое значение - то текст обычный. Если положительное - текст надстрочный. Отрицательное - подстрочный." В dwMask я установил CFM_OFFSet ("Чтобы использовать элемент yOffset, установите флаг CFM_OFFSet в элементе DWMask". Но я пробовал, а толку ноль). Пробовал разные варианты, но я не знаю главного - передается ли информация о нужном символе в структуру CHARFORMAT2. Что-то я не вижу, как бы он туда мог передаться. Где код, который за это отвечает? Из Word'а копирую текст с над- и подстрочными символами и вставляю в RichEdit1. У меня Delphi 10.4. Вот полный код: unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, RichEdit; type TForm1 = class(TForm) RichEdit1: TRichEdit; RichEdit2: TRichEdit; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin RichEdit1.Clear; RichEdit2.Clear; end; procedure TForm1.Button1Click(Sender: TObject); var i:integer; S1,S2,S3,S4:string; CF:TCharFormat; begin for i:=1 to 5 do begin //Цикл идет от первого символа строки до последнего RichEdit1.SelStart:=i; //Установка начала выборки символов в строке RichEdit1.SelLength:=1; //Взять 1 символ (можно указать любую цифру, все равно почему-то берется 1 символ) S1:=RichEdit1.Text[i]; //Текущий символ S2:=S2+RichEdit1.Text[i]; //Накапливаем все символы в одну переменную FillChar(CF, SizeOf(CF), 0); //FillChar - заполняем память, выделенную для переменной указанным значением CF.cbSize:=SizeOf(CF); //cbSize - Определяет размер, в байтах, структуры. Перед тем, как передавать эту структуру на rich edit control, установите CBSIze до размера структуры CHARFORMAT или CHARFORMAT2. Если CBSIze равен размеру конструкции CharFormat, контроль использует только члены CharFormat. (https://docs.microsoft.com/en-us/windows/win32/api/richedit/ns-richedit-charformat2w_1) CF.dwMask:=CFM_OFFSet; //dwMask - Определяет части структуры CHARFORMAT2, которая содержит допустимую информацию. Член DWMask может быть комбинацией значений из двух наборов битовых флагов. Один набор указывает на членов структуры, которые действительны. Другой набор указывает на действительные атрибуты в элементе Dweffects. (https://docs.microsoft.com/en-us/windows/win32/api/richedit/ns-richedit-charformat2w_1) //Чтобы использовать элемент yOffset, установите флаг CFM_OFFSet в элементе DWMask (//https://docs.microsoft.com/en-us/windows/win32/api/richedit/ns-richedit-charformat2w_1) RichEdit1.Perform(EM_GETCHARFORMAT, SCF_SELECTION, LPARAM(@CF)); //Perform - посылает сообщение (Windows message) окну компонента для обработки if CF.yOffset >0 then //Если текущий символ надстрочный, то... begin S3:=S3+RichEdit1.Text[i]; //Все надстрочные символы в одну переменную end; if CF.yOffset <0 then //Если текущий символ подстрочный, то... begin S4:=S4+RichEdit1.Text[i]; //Все подстрочные символы в одну переменную end; end; RichEdit2.Lines.Add('Надстрочные: '+S3); RichEdit2.Lines.Add('Подстрочные: '+S4); end; end. |
Сообщ.
#2
,
|
|
|
Сообщ.
#3
,
|
|
|
Да, решение мне уже подсказали.
|
Сообщ.
#4
,
|
|
|
Delphi Master еще жив!!? |
Сообщ.
#5
,
|
|
|
Цитата Profi @ Delphi Master еще жив!!? А чего ему сделается? |
Сообщ.
#6
,
|
|
|
Да тут-то народа почти не осталось, а Delphi Master вообще узкоспециализированный форум.
|
Сообщ.
#7
,
|
|
|
Все в телеге сидят
|
Сообщ.
#8
,
|
|
|
Rouse_
>Все в телеге сидят Правда, что ли? |
Сообщ.
#9
,
|
|
|
Типа того
|
Сообщ.
#10
,
|
|
|
Неудобно же...
|
Сообщ.
#11
,
|
|
|
Цитата Rouse_ @ Все в телеге сидят Не Сань, ты не прав. Не знаю все ли сидят в телеге, но некоторые сидят не только в телеге. До сих пор живы и активно живы sql.ru и cyberforum. На первом, например, можно пообщаться с АА, он же GS, он же CM и попробовать решить проблемы с AV. Ну и другие более-менее сложные проблемы тоже там обсуждаются. Второй, конечно заточен его авторами на помощь троешникам и двоешникам, но на нём есть два (по крайней мере) классных специалиста. Один по Лазарусу, другой по FMX. |