На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Как в окне 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.

    Вот полный код:
    ExpandedWrap disabled
      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.
        Да, решение мне уже подсказали.

          Delphi Master еще жив!!? :o
            Цитата Profi @
            Delphi Master еще жив!!? :o

            А чего ему сделается?
              Да тут-то народа почти не осталось, а Delphi Master вообще узкоспециализированный форум.
                Все в телеге сидят :)
                  Rouse_
                  >Все в телеге сидят

                  Правда, что ли?
                    Типа того :)
                      Неудобно же...
                        Цитата Rouse_ @
                        Все в телеге сидят

                        Не Сань, ты не прав. Не знаю все ли сидят в телеге, но некоторые сидят не только в телеге.
                        До сих пор живы и активно живы sql.ru и cyberforum. На первом, например, можно пообщаться с АА, он же GS, он же CM и попробовать решить проблемы с AV. Ну и другие более-менее сложные проблемы тоже там обсуждаются.
                        Второй, конечно заточен его авторами на помощь троешникам и двоешникам, но на нём есть два (по крайней мере) классных специалиста. Один по Лазарусу, другой по FMX.
                        Сообщение отредактировано: northener -
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,1051 ]   [ 16 queries used ]   [ Generated: 19.03.24, 09:19 GMT ]