Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
Заблокирован
1
RAD XE3+

Надчёркивание (overline)

27.01.2021, 06:36. Показов 7002. Ответов 46

Author24 — интернет-сервис помощи студентам
Потребовалось мне вывести на окно (ну, например, в TLabel, текст с надчёркиваем). Попробовал поиграться с диакритическими подстановками - результат меня не устроил: надчёркивание получается прерывистым и не соответствует по длине тексту, над которым оно расположено (см. рис. 1).
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
// надчёркивание юникодного текста диакритическим символом
function Overline(const str: string): string;
const
  SYMB_OVLN: WideChar = #$0305;
begin
  result:= '';
  for var idx:= 1 to length(str) do
    result:= result + SYMB_OVLN + str[idx];
end;
 
//==============
LabelTest.Caption:= Overline('SC1')  + ' (push-pull output)';
Надчёркивание (overline)

рис. 1.
Понимаю, что это маловероятно, но всё ж спрошу: мож кто-то справился с такой проблемой до меня? Возможно ли это без очевидных костылей сделать? А то лениво писать потомка TLabel с дорисовкой это линии (писанины много будет).

Хотелось бы иметь таки возможность выводить именно частично надчёркнутый текст, как в документах, например (см. рис. 2).
Надчёркивание (overline)

рис. 2.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2021, 06:36
Ответы с готовыми решениями:

Надчёркивание текста
Коллеги, добрый день, подскажите, пожалуйста, как используя только HTML, можно сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
46
3584 / 2194 / 692
Регистрация: 29.05.2013
Сообщений: 9,370
29.01.2021, 14:40 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от DenNik Посмотреть сообщение
Насколько мне известно - это амперсанд
А чего это меня на тильду торкнуло? Вот где-то я эту комбинацию как служебную видел.
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
29.01.2021, 14:41 22
Пытливый, однако спасибо, ибо я понял, что не учёл этот момент
Миниатюры
Надчёркивание (overline)  
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
29.01.2021, 14:42 23
Цитата Сообщение от DenNik Посмотреть сообщение
я понял, что не учёл этот момент
Потому что пользуюсь амперсандом со словом "никогда" )) а кто им пользуется?
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
29.01.2021, 14:57 24
пофиксил.

нет, не совсем..
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
29.01.2021, 15:12 25
в общем, возникла проблема двойного амперсанда в тексте исходной строки. Двойной амперсанд обрабатывается аж в предке TWinControl в SetText (или GetText) - я не вникал, но в Caption приходит уже сформированная строка
При&&вет (вход) > При&вет (выход)
Чтобы учесть это, нужно глобально перерабатывать код метода GetLines. Онако же мне думается, что это не нужно (кто пользуется &&?)
Чтобы учесть одинарный амперсанд, нужно изменить цикл
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ПРОГОН "ГРЯЗНОЙ" СТРОКИ
  for c in Caption do
  begin
    if c = '&' then Continue else
    if (c <> tild) then
    // ОБЫЧНЫЙ СИМВОЛ
    begin
      // вычисляем ширину Line для очередного символа
      Line:= TLine.Create(Canvas.TextWidth(c));
      // если обрабатываемый символ не первый, сдвигаем текущую линию
      // "вправо" на сумму ширин предыдущих линий
      if i > 0 then for n:= 0 to Pred(i) do Line.Offset(Lines[n].Width);
      Lines[i]:= Line;
      Inc(i);
    end else
    // ТИЛЬДА. следовательно, ПРЕДЫДУЩИЙ символ требует отрисовки линии.
    // его ширина на предыдущей итерации уже добавлена в массив Lines.
    // добавляем её в выходной массив.
    begin
      SetLength(Result,Succ(Length(Result)));
      Result[High(Result)]:= Lines[Pred(i)];
    end;
  end;
Миниатюры
Надчёркивание (overline)  
0
3584 / 2194 / 692
Регистрация: 29.05.2013
Сообщений: 9,370
29.01.2021, 15:33 26
Вот если бы переопределить тип:
Delphi
1
TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut, fsOverline)
Было бы намного красивее, чем эта возня с дополнительными символами
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
29.01.2021, 16:12 27
Цитата Сообщение от Пытливый Посмотреть сообщение
Вот если бы переопределить тип:
Мало переопределить тип. Шрифт должен поддерживать надчёркивание. А сам по себе fsItalic не делает начертание наклонным, ибо есть шрифты, не поддерживающие курсив, или полужирное начертание и т.д.

Добавлено через 21 минуту
Самое правильное - заморочиться с созданием шрифта
Это очень интересная работа
0
Заблокирован
29.01.2021, 23:30  [ТС] 28
Амперсанды амперсандами, а ты учёл такие свойства TLabel, как Alignment, AlignWithMargins, AutoSize, Layout?
Может лучше запилить метод вывода текста на канвас с учётом надчёркиваний, а? Шоп отойти от TLabel-концепции и сделать возможным вывод такой вундервафли куда угодно? Например, в TVirtualStringTree.
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
30.01.2021, 02:05 29
Конечно, не учёл. В 10 строчках кода за пару часов это учесть нереально. Нужно залазить в такие дебри классовых взаимоотношений, в которые я никогда не лазил. А так, для вывода коротких однострочных надписей сойдёт
0
Заблокирован
30.01.2021, 02:08  [ТС] 30
Цитата Сообщение от DenNik Посмотреть сообщение
Конечно, не учёл. В 10 строчках кода за пару часов это учесть нереально.
А кто тебя торопит?
Цитата Сообщение от DenNik Посмотреть сообщение
А так, для вывода коротких однострочных надписей сойдёт
кек
Надчёркивание (overline)
0
3584 / 2194 / 692
Регистрация: 29.05.2013
Сообщений: 9,370
30.01.2021, 02:22 31
Хотите быстро но не очень красиво, используйте шрифт Segoe UI Symbol. Это единственный шрифт, который рисует непрерывную линию.
Миниатюры
Надчёркивание (overline)  
0
Заблокирован
30.01.2021, 02:24  [ТС] 32
DenNik, согласись, как-то это некомильфо.

Надчёркивание (overline)
0
Заблокирован
30.01.2021, 02:26  [ТС] 33
Цитата Сообщение от Пытливый Посмотреть сообщение
Хотите быстро но не очень красиво
Хотим красиво и универсально. Пусть и небыстро.
Надо коллективно родить универсальный вариант и потом всегда им пользоваться.
0
Заблокирован
30.01.2021, 02:38  [ТС] 34
Попробую написать свой вариант. Вдруг чо получится. Бахнул пивка, чот прям задор появился.
Проект на гифке оставлю тут как есть:
Вложения
Тип файла: 7z TLabel overline.7z (4.43 Мб, 5 просмотров)
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
30.01.2021, 02:47 35
Вообще, какова сфера применения подобного чуда? Понятно, что в метку можно при желании и философский трактат засунуть, однако судя по скрину из начального поста - явно не тот случай.

Добавлено через 2 минуты
Цитата Сообщение от Verevkin Посмотреть сообщение
DenNik, согласись, как-то это некомильфо.

Вложение 1222338
Не спорю экспресс-решение: сдвинуть массив линий на разницу ширины метки и ширины текста.

Добавлено через 1 минуту
С высотой та же петрушка
0
Заблокирован
30.01.2021, 06:04  [ТС] 36
Цитата Сообщение от DenNik Посмотреть сообщение
Вообще, какова сфера применения подобного чуда?
Я ж в шапке треда разъяснил всё это. С картинками даже.
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
30.01.2021, 10:55 37
Только заметил, что при изменении AlignWithMargins цвет линий меняется. Любопытный эффект. Надо будет поковырять

Добавлено через 6 минут
Цитата Сообщение от Verevkin Посмотреть сообщение
Я ж в шапке треда разъяснил всё это. С картинками даже.
Я специально задал тот вопрос. И ещё вдогонку хочу спросить: насколько актуально именно для твоих программ использование меток в режиме нижнего выравнивания/мультистроки/AlignWithMargins? Ибо если судить по другим скринам твоих программ, метка обычно используется для вывода короткого поясняющего текста.
0
Заблокирован
30.01.2021, 12:37  [ТС] 38
Цитата Сообщение от DenNik Посмотреть сообщение
асколько актуально именно для твоих программ использование меток в режиме нижнего выравнивания/мультистроки/AlignWithMargins?
Постоянно. Считай, по умолчанию выставляю AlignWithMargins = true и Layout = tlCenter.
------------------
Короче, чот я увлякся, сил моих больше нет. Устал.

Надчёркивание (overline)


Кому интересно, можете поковырять исходник. Он жутко сырой, я его не тестил. Режим WordWrap не учитывается алгоритмом, я забыл его заблокировать. Щас спать, если вечером интерес не пропадёт, попробую допилить до установки в поллитру компонентов.
Вложения
Тип файла: 7z ovln-rc.7z (6.88 Мб, 5 просмотров)
0
3584 / 2194 / 692
Регистрация: 29.05.2013
Сообщений: 9,370
30.01.2021, 13:21 39
И все-же я считаю, что эффект надчеркивания должен быть реализован изменением свойств шрифта, там-же где и подчеркивание, жирность, но для этого придется пересобрать массу исходников и теряется гибкость произвольной его установки в любом месте текста и вот как это противоречие обойти пока не соображу.
0
Заблокирован
30.01.2021, 13:27  [ТС] 40
Цитата Сообщение от Пытливый Посмотреть сообщение
И все-же я считаю, что эффект надчеркивания должен быть реализован изменением свойств шрифта, там-же где и подчеркивание
И чо ты предлагаешь?
0
30.01.2021, 13:27
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru