Показать сообщение отдельно
  #6  
Старый 20.07.2021, 20:23
Lighting Lighting вне форума
Прохожий
 
Регистрация: 18.07.2021
Сообщения: 5
Версия Delphi: Delphi 10.4
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Не ставить компоненты, связанные с данными.
Я ничего такого не ставил. О чем речь?

Цитата:
Сообщение от lmikle
У тебя бесплатная версия Starter?
Starter это что?

Цитата:
Сообщение от lmikle
ЗЫ. Вообще-то я привел ссылку, где есть пример.
Да, я это все прочитал.
А мне вот такой совет показали: "Через EM_GETCHARFORMAT получить информацию о нужном символе в структуру CHARFORMAT (или CHARFORMAT2 для RE 2.0) и проверить содержимое поля yOffset. Если оно содержит нулевое значение - то текст обычный. Если положительное - текст надстрочный. Отрицательное - подстрочный."
Т.е. yOffset надо читать, а не писать в него. В вашем коде "yOffset:= 60; ", насколько я понял, для установки символа: над- или подстрочного, а значение 60 - смещение от центральной линии вверх.

А это пример, как узнать цвет слоя под текстом в RichEdit:
Код:
var
   CFormat : TCharFormat2;
begin
   FillChar(CFormat, SizeOf(CFormat), 0);
   CFormat.cbSize := SizeOf(cf);
   CFormat.dwMask := CFM_BACKCOLOR;
   RichEdit1.Perform(EM_GETCHARFORMAT, SCF_SELECTION, LPARAM(@CFormat));
   ShowMessage(ColorToString(CFormat.crBackColor));
end;

Насколько я понял, эта строка устанавливает параметры для вывода в RichEdit (если EM_SETCHARFORMAT)
Код:
richedit1.Perform( EM_SETCHARFORMAT, SCF_SELECTION, LongInt(@format));
Цитата:
Сообщение от lmikle
Тебе надо делать EM_GETCHARFORMAT и проверять что тебе напихали в соовт. структуру.
Да. Но как это сделать?
Я пробовал
Код:
CFormat.cbSize:=SizeOf(CFormat);
Код:
CFormat.dwMask:=CFM_SUPERSCRIPT;
Или
Код:
CFormat.dwMask:=CFM_OFFSET;
Код:
RichEdit1.Perform(EM_GETCHARFORMAT, SCF_SELECTION, LPARAM(@CFormat));
Потом
Код:
if CFormat.yOffset >0 then       //Если текущий символ надстрочный, то...
   begin
    S9:=S9+RichEdit1.Text[ii];   //Накапливаем все надстрочные символы в одну переменную
   end
но yOffset у меня постоянно = 0 вне зависимости от символа.
Значит, информация о нужном символе не передается в структуру CHARFORMAT2. Все примеры, что я видел или для выдачи символа в RichEdit или для получения информации из RichEdit куда указывает курсор. А у меня:
Код:
RichEdit1.SelStart:=i;
и все, дальше можно брать символ, например,
Код:
S4:=RichEdit1.Text[i];
а как его передать в CHARFORMAT2 я без понятия.

Я тут https://docs.microsoft.com/en-us/win...charformat2w_1 пытался что-нибудь выяснить, но это справочник какой-то для спецов, а мне нужен учебник, где бы было показано, что такое FillChar, cbSize, dwMask, Perform, что оно такое, и что туда писать.
Ответить с цитированием