powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как в окне RichEdit определить над- и подстрочные символы?
7 сообщений из 7, страница 1 из 1
Как в окне RichEdit определить над- и подстрочные символы?
    #40086070
VladSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу сам решить эту задачу.
Есть текст, в котором надо выловить надстрочные и подстрочные символы. Как я понял, надо использовать 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.

Вот полный код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
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.
...
Рейтинг: 0 / 0
Как в окне RichEdit определить над- и подстрочные символы?
    #40086211
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
FillChar(CF, SizeOf(CF), 0);
CF.cbSize:=SizeOf(CF);
SendMessage(RichEdit1.Handle, EM_GETCHARFORMAT, SCF_SELECTION, LPARAM(@CF));
if CF.dwMask and CFM_OFFSET = CFM_OFFSET then begin  // Если есть информация об уровне символов
  if CF.yOffset > 0 then         //Если текущий символ надстрочный, то...
    S3:=S3+RichEdit1.Text[i];    //Все надстрочные символы в одну переменную
  else if CF.yOffset < 0 then    //Если текущий символ подстрочный, то...
    S4:=S4+RichEdit1.Text[i];    //Все подстрочные символы в одну переменную
end;
...
Рейтинг: 0 / 0
Как в окне RichEdit определить над- и подстрочные символы?
    #40086286
VladSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Этот код не работает. Вы же его даже не проверяли, потому что в нем ошибка. Но и без нее он не определяет над- и подстрочные символы.
...
Рейтинг: 0 / 0
Как в окне RichEdit определить над- и подстрочные символы?
    #40086292
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда, какой же все-таки этот рич гемморой. То что в HTML делается в одну строчку, тут целое приключение.
...
Рейтинг: 0 / 0
Как в окне RichEdit определить над- и подстрочные символы?
    #40086303
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladSQL
Вы же его даже не проверяли
Как я посмел?!!
...
Рейтинг: 0 / 0
Как в окне RichEdit определить над- и подстрочные символы?
    #40086309
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladSQL,

Delphi 6:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
uses RichEdit;

{$R *.dfm}

procedure TForm1.btnAlalyzeClick(Sender: TObject);
var
   iLen     : integer;
   i        : integer;
   recCF    : TCharFormat2;

   cChar    : char;
   iCode    : integer;
   sInfo    : string;
begin
   iLen := Length(edRichEdit.Text);

   for i:=0 to iLen-1 do
   begin
      //get Char
      cChar := edRichEdit.Text[i+1];
      iCode := Ord(cChar);
      if iCode<=32 then
         sInfo := 'chr('+IntToStr(iCode)+')'
      else
         sInfo := cChar;

      //get Effect
      edRichEdit.SelStart := i;
      edRichEdit.SelLength := 1;

      FillChar(recCF, SizeOf(recCF), 0);
      recCF.cbSize:=SizeOf(recCF);
      //SendMessage(edRichEdit.Handle, EM_GETCHARFORMAT, SCF_SELECTION, LPARAM(@recCF));
      edRichEdit.Perform(EM_GETCHARFORMAT, SCF_SELECTION, Longint(@recCF));

      if recCF.dwEffects and CFE_SUPERSCRIPT > 0 then
         sInfo := sInfo + '  [^^^]';

      if recCF.dwEffects and CFE_SUBSCRIPT > 0 then
         sInfo := sInfo + '  [vvv]';


      edOutput.Lines.Add(sInfo);
   end;
end;
...
Рейтинг: 0 / 0
Как в окне RichEdit определить над- и подстрочные символы?
    #40086418
VladSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кроик Семён,
Спасибо большое!
Буду разбираться.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как в окне RichEdit определить над- и подстрочные символы?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]