Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677

Не получается изменить атрибуты текста в TRichMemo

22.10.2017, 18:43. Показов 2949. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, создаю значит в функции TRichMemo, все хорошо, все работает. Но когда через код пытаюсь изменить атрибуты текста в определенной области, ничего не происходит.

Код:
Delphi
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
71
procedure TClientTab.AddMemo(newMemoWindowName: wideString);
var
  tempMemo: TRichMemo;
 
  timeForward: TDateTime;
  fontParams: TFontParams;
begin
  tempMemo := TRichMemo.Create(ClientScrollBox);
  tempMemo.Parent := ClientScrollBox;
 
  // add a new memo and anchor it to the top memo
 
  tempMemo.Anchors:=[akLeft,akRight,akTop];
 
  tempMemo.AnchorSide[akLeft].Side := asrLeft;
  tempMemo.AnchorSide[akLeft].Control := ClientScrollBox;
 
  tempMemo.AnchorSide[akRight].Side := asrRight;
  tempMemo.AnchorSide[akRight].Control := ClientScrollBox;
 
  if (Length(WindowMemos) = 0) then
  begin
    // anchor to top of scroll box
    tempMemo.AnchorSide[akTop].Side := asrTop;
    tempMemo.AnchorSide[akTop].Control := ClientScrollBox;
  end
  else
  begin
    // anchor to bottom of last memo
    tempMemo.AnchorSide[akTop].Side := asrBottom;
    tempMemo.AnchorSide[akTop].Control := WindowMemos[Length(WindowMemos)-1];
  end;
 
  tempMemo.BorderSpacing.Top     := ServerSideForm.WindowGapBar.Position;
  tempMemo.BorderSpacing.Left    := 5;
  tempMemo.BorderSpacing.Right   := 5;
 
  tempMemo.ScrollBars:=ssAutoBoth;
  tempMemo.WordWrap:=false;
 
  tempMemo.Font := ServerSideForm.FontExampleMemo.Font;
 
  tempMemo.Height := ServerSideForm.KeystrokeAreaBar.Position;
 
  tempMemo.Lines.Add(string(newMemoWindowName));
  //tempMemo.Font.Name:='Yu Gothic';
  //tempMemo.Font.Size:=20;
  fontParams.Name:='Yu Gothic';
  fontParams.HasBkClr:=false;
  fontParams.Color:=clBlack;
  fontParams.Style:=[fsItalic];
  fontParams.VScriptPos:=vpNormal;
  fontParams.Size:=20;
 
  tempMemo.SetTextAttributes(0, Length(newMemoWindowName), fontParams);
  tempMemo.Lines.Add('');
  tempMemo.Lines.Add('');
 
  timeForward := Time;
  timeForward := IncSecond(timeForward, ServerSideForm.NewLineTimer.Interval div 1000);
 
  tempMemo.Text := tempMemo.Text + TimeToStr(Time) + ' - ' + TimeToStr(timeForward) + ': ' + sLineBreak + sLineBreak;
 
  tempMemo.Hint := newMemoWindowName;
  //showMessage('New Hint: ' + tempMemo.Hint);
  //tempMemo.Visible:=true;
  tempMemo.ReadOnly:=true;
 
  SetLength(WindowMemos, Length(WindowMemos)+1); // One more slot
  WindowMemos[Length(WindowMemos)-1] := tempMemo; // Add it
end;
Прошу обратить внимание на строки 48-55, там все самое интересное. После выполнения строки с SetTextAttributes, атрибуты текста в области с 0 по Length(newMemoWindwoName) не меняются, а я не знаю почему.

Кто-нибудь мог бы подсказать, что может быть причиной проблемы?

Добавлено через 4 минуты
Так же пробовал функцию SetRangeParams на той же области (0 по Length(newMemoWindowName)), ничего опять же не происходило.

Так:
Delphi
1
2
3
4
5
6
7
8
...
  tempMemo.Lines.Add(string(newMemoWindowName));
  //tempMemo.Font.Name:='Yu Gothic';
  //tempMemo.Font.Size:=20;
  /tempMemo.SetRangeParams(0, Length(newMemoWindowName), [tmm_Name, tmm_Color, tmm_Size, tmm_Styles], 'Yu Gothic', 20, clBlack, [fsItalic], []);
  tempMemo.Lines.Add('');
  tempMemo.Lines.Add(''); 
...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.10.2017, 18:43
Ответы с готовыми решениями:

Не получается изменить атрибуты System и hiddeh у файлов и папок на флешке.
Повествование будет достаточно пространным, так что приготовьтесь написать в ответ "многа букаф, ниасилил". однако впервые...

Изменить цвет текста в описании товара не получается
Текстовый редактор тупит конкретно, не меняет цвет текста в описании...поставил новый. Но при задании цвета тексту оставляет...

После применения AlphaSkina не получается изменить цвет текста
После применения Alpha Skina не могу изменить цвет текста. Какой бы цвет в свойства не устанавливал все равно выводит черный. Может кто...

10
274 / 178 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
22.10.2017, 22:39
Цитата Сообщение от meJevin Посмотреть сообщение
пытаюсь изменить атрибуты текста в определенной области
(много кода! лень вычитывать в поиске ошибок)
я правильно понял, вам надо "покрасить" часть текста указав начало и длину?
0
602 / 550 / 210
Регистрация: 24.01.2012
Сообщений: 1,352
23.10.2017, 09:42
Плохо, что в richmemo не предусмотрено функции определить позицию строки в символах от начала текста, а для изменения атрибутов нужен именно этот параметр. Поэтому вычислять позицию приходится в цикле. К примеру нужно изменить формат 5-й строки.
Pascal
1
2
3
  a:=0;
  for i:=0 to 3 do a:=a+utf8length(tempmemo.Lines[i])+1;
  tempMemo.SetTextAttributes(a, utf8length(tempmemo.Lines[4]), fontParams);
0
274 / 178 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
23.10.2017, 09:51
Цитата Сообщение от edukra Посмотреть сообщение
Плохо, что в richmemo не предусмотрено функции определить позицию строки в символах от начала текста, а для изменения атрибутов нужен именно этот параметр. Поэтому вычислять позицию приходится в цикле. К примеру нужно изменить формат 5-й строки.

Не по теме:

В RichMemo вообще очень многого не хватает! Символ по строке, строку по символу, первая видимая строка, количество видимых строк... Многое сильно глючит... Может в следующих версиях хоть что-то допилят.



В цикле это слишком... не правильно долго! я это делаю по другому:
запоминаю курсор
переношу курсор на нужную строку // RichMemo1.CaretPos := Point(0, lineId);
хватаю SelStart
восстанавливаю курсор (прыгает скролл - восстановить не получается)

как задать атрибуты уже разобрались?
0
602 / 550 / 210
Регистрация: 24.01.2012
Сообщений: 1,352
23.10.2017, 11:53
Цитата Сообщение от andyj Посмотреть сообщение
как задать атрибуты уже разобрались?
с этим у меня проблем никогда не возникало.
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
23.10.2017, 16:38  [ТС]
andyj, не только покрасить, но и изменить размер, имя, стиль шрифта в опреденной области.

Добавлено через 2 минуты
Цитата Сообщение от edukra Посмотреть сообщение
а для изменения атрибутов нужен именно этот параметр
Там разве не по индексам все работает? Если у меня в Lines несколько линий, но я хочу изменить только первые два символа первой линии, разве не от 0 до 1 включительно надо идти? У Lines еще есть Text, который просто текст полностью возвращает.

Добавлено через 1 минуту
Цитата Сообщение от andyj Посмотреть сообщение
В цикле это слишком... не правильно долго! я это делаю по другому:
запоминаю курсор
переношу курсор на нужную строку // RichMemo1.CaretPos := Point(0, lineId);
хватаю SelStart
восстанавливаю курсор (прыгает скролл - восстановить не получается)
Я вообще не использую выделение пользователя, мне самому, без вмешательства пользователя надо менять атрибуты текста в определенных местах.
0
274 / 178 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
23.10.2017, 17:21
Цитата Сообщение от meJevin Посмотреть сообщение
Я вообще не использую выделение пользователя, мне самому, без вмешательства пользователя надо менять атрибуты текста в определенных местах.
А я говорил не о "ручном" изменении, а о методе получения нужного символа любой строки зная его XY, но не зная SelStart.

Лови! (вырезал из моего работающего проекта не вычищая, имя шрифта не менял)
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
  RichMemo1.SetRangeParams(RichMemo1.SelStart, RichMemo1.SelLength, [tmm_Styles], '', 0, 0,
    [fsUnderline], //fsBold, fsStrikeOut, fsItalic, fsUnderline)
    []
  );
 
  RichMemo1.SetRangeParams(RichMemo1.SelStart, RichMemo1.SelLength, [tmm_Color], '', 0, clLime,
    [],
    []
  );
 
 
procedure TForm1.Button50Click(Sender: TObject);
var
  fp: TFontParams;
begin
  fp.HasBkClr := true;
  fp.BkColor := ColorButton4.ButtonColor;
  RichMemo1.SetRangeParams(RichMemo1.SelStart, RichMemo1.SelLength,[tmm_BackColor], fp, [], []);
  RichMemo1.SelLength:=0;
end;
 
procedure TForm1.Panel79Click(Sender: TObject);
var
  pn1: TParaNumbering;
begin
 
  //TParaNumStyle   = (pnNone, pnBullet, pnNumber, pnLowLetter, pnLowRoman, pnUpLetter, pnUpRoman, pnCustomChar);
  pn1.Style:=pnBullet;
  pn1.Indent:=0;
  pn1.ForceNewNum:=false;
  pn1.NumberStart:=1;
 
  RichMemo1.SetParaNumbering(RichMemo1.SelStart, RichMemo1.SelLength, pn1);
 
end;
 
var
  fnt: TFontParams;
begin
  fnt.Size:=300;//60;//TrackBar_FontSize.Position;//
  RichMemo1.SetRangeParams(0, RichMemo1.GetTextLen, [tmm_Size], fnt, [], []);
end;
Добавлено через 4 минуты
Цитата Сообщение от meJevin Посмотреть сообщение
Там разве не по индексам все работает? Если у меня в Lines несколько линий, но я хочу изменить только первые два символа первой линии, разве не от 0 до 1 включительно надо идти? У Lines еще есть Text, который просто текст полностью возвращает.
Все действительно работает по "индексам". Вернее по "абсолютной" позиции символа в тексте без учета номера линии.

Не по теме:

У меня стояла задача типа "выдели строку №15 кликом мышкой по кнопке", поэтому сначала предстояло вычиcлить SetStart для первого символа 15й строки...

1
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
23.10.2017, 19:51  [ТС]
andyj, хм, странно, все равно не работает.

Пишу вот так в своем коде:

Delphi
1
2
3
fnt.HasBkClr:=false;
fnt.Size:=60;
tempMemo.SetRangeParams(0, tempMemo.GetTextLen, [tmm_Size], fnt, [], []);
Все равно ничего не изменяется
0
274 / 178 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
24.10.2017, 02:06
Цитата Сообщение от meJevin Посмотреть сообщение
Все равно ничего не изменяется
слишком много неизвестных которые не проверишь... (метод создания tempMemo, какой шрифт раньше стоял - может уже был 60)

попробуйте один из моих кодов! создайте RichMemo1 в форме, создайте кнопку с одним из моих кодов, запустите, впишите в RichMemo что-нибудь от руки, выделите вручную кусочек текста и нажмите кнопку. (у меня весь код рабочий)
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
11.11.2017, 02:54  [ТС]
Итак, вернувшись к этой штуке через десять тысяч лет, выяснилось, что на самом деле атрибуты менялись.

То есть такой случай, например:

Delphi
1
ClientTabsArray[i].WindowMemos[j].SetRangeParams(startRange, endRange, [tmm_Styles, tmm_Color, tmm_Size, tmm_Name], 'Yu Gothic', 12, clGray, [fsBold], []);
Нормально меняет атрибуты в определенной области.

Но, когда текст модифицируют добавлением или удалением символов, все эти атрибуты, которые мы ставили, благополучно убираются и текст в измененных атрибутах становится таким, какой указан в Font поле класса.

Вопрос: как предотвратить этот ресет атрибутов при модификации текста?

Добавлено через 19 часов 34 минуты
Ответа пока что нет, но есть близкий вариант. Если использовать Append(), то текст остается отформатированным и ничего не ресетится. Но есть проблема с Append(), он добавляет дополнительную строку новую, что мне не надо. Я хочу добавить один символ в конец текста.
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
12.11.2017, 13:59  [ТС]
Бум, решение нашлось. В RichMemoUtils много полезных штук!

Если кому пригодится, посмотреть там код, наверное, вот. Мне очень подошла функция InsertFontText, которая использует какую-то магическую, сохраняющую форматирование текста, функцию InDelText в купе с SetTextAttributes.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2017, 13:59
Помогаю со студенческими работами здесь

Изменить атрибуты на 777
Здравтвуйте, помогите пожалуйста, пытаюсь изменить атрибуты php файла на 777, действую согласно инструкции http://mexboy.ru/?p=88 но у меня...

Изменить атрибуты файлы
Всем доброго времени суток. Помогите пожалуйста. Как сделать что бы перед началом чтения файла программа делала его не скрытым, изначально...

Изменить атрибуты инпута
<h3>Создание заявки на вывод</h3> <form method="post" action="<?=$app->urlFor('cashoutNewPost')?>"> <div...

Можно ли изменить атрибуты у каталога?
Есть папка. В ней файлы. Искал в Гугле и в MSDN, но так и не смог найти, как, например, сделать папку скрытой? Может ли кто-то...

Изменить атрибуты во внутреннем блоке
Добрый день, имеется следующий css файлик .cont { width: 30em; /* поддерживаются любые единицы, в том числе проценты */ ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru