Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2021, 14:36   #1
Vladimir K.
Пользователь
 
Регистрация: 25.12.2006
Сообщений: 64
По умолчанию Как в окне RichEdit определить над- и подстрочные символы?

Не могу сам решить эту задачу.
Есть текст, в котором надо выловить надстрочные и подстрочные символы. Как я понял, надо использовать 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:TCharFormat2;
begin
 for i:=1 to 5 do begin                                                         //Цикл идет от первого символа строки до последнего

 RichEdit1.SelStart:=i;                                                         //Установка начала выборки символов в строке
 RichEdit1.SelLength:=3;                                                        //Взять 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.
Vladimir K. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Надстрочные/подстрочные символы/индексы. Степени. Формулы. overlookerz Общие вопросы Delphi 6 21.01.2013 22:45
Невыводимые символы в Memo, RichEdit Fre5h Компоненты Delphi 2 13.06.2012 08:47
Как определить курсор над контролом antonkovaliou Общие вопросы Delphi 3 21.04.2012 10:09
ограничить символы в строке richedit s1s1s1 Общие вопросы Delphi 0 07.06.2011 21:38
Надстрочные и подстрочные символы( Delphi) CAMOBAP Помощь студентам 2 08.03.2011 15:08