Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 09.09.2015
Сообщений: 22

TMemo и Scrollbar. Как сделать выделение i строки?

01.11.2015, 23:24. Показов 3315. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
С этой проблемой я бъюсь уже очень долго и решить ее не могу. Под TMemo в идеальном случае я понимаю все компоненты, имеющие Scrollbar(TStringGrid, TRichEdit итд).
Проблема заключается в следующем: я создал TMemo поместил в него текст, закрыл программу и сохранил все настройки последнего состояния. Когда я открыл программу заного, соответственно загрузил в него текст(настройки шрифта и прочее). Перед закрытием программы я читал текст. Текста было много и я листал его с помощью Scrollbar`а. Я могу узнать положение каретки, номер строки и прочие параметры, но как мне выставить 150 строку текста в мемо в качестве начальной строки? Другими словами как мне выставить ползунок Scrollbar на 80% или Scrollbar->Position=115? Причем выставить так, чтобы первая отрисованная строка мемо начиналась с середины текста.
Единственное что я нашел это - Memo1->ScrollBy(DeltaX,DeltaY). Но эту дельту нужно подбирать, причем дельта относится к канве, но не к строке. ( Если я проведу команду Memo1->ScrollBy(0,10), то я получу желаемый результат( будет отрисована 2 строка текста в качестве первой отрисованной), но если я поставлю дельту 210, то я не получу 21 строку, а получу, например, 20. Подборка коэффициэнта вызывает много вопросов, потому что потом я захочу поменять текст и все съедет.
Если совсем коротко, то как выполнить такую команду:
Memo1->First_Draw_Item(Line)_Number=i?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.11.2015, 23:24
Ответы с готовыми решениями:

TMemo: выделение выбранной строки цветом
Как сделать, что бы в TMemo выбрана строка была выделена цветом?

Как на cellclick сделать выделение только строки, а выделение столбца отменить
Здравствуйте, проблема такая, программа работает отлично, но я занимаюсь сопровождением ПО. И при выделении строки все хорошо, а при...

Прокрутка ScrollBar в TMemo по таймеру в Android приложении
Добрый день товарищи! Помогите решить проблему. Есть приложение, на нем много контролов. Основные: TMemo, TTimer, TButton. По...

8
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,879
Записей в блоге: 12
02.11.2015, 00:03
C++
1
2
SendMessage(Memo1->Handle, EM_SCROLLCARET, 0, 0);
SendMessage(Memo1->Handle, EM_LINESCROLL, 0, i);
1
2 / 2 / 0
Регистрация: 09.09.2015
Сообщений: 22
02.11.2015, 23:18  [ТС]
Заработало!!
Только осталась небольшая проблема. Сообщение EM_SCROLLCARET сбрасывает меня не в начало, а в конец текста.
Я сделал цикл for (unsigned i = 0; i < 1000; i++)Memo1->Lines->Add(i); и после отправки двух сообщений (i=15) окно показывает последнюю пятерку( 995;996;997;998;999). Если не посылать сообщение EM_SCROLLCARET, то все нормально, но понятно, что без каретки пролистывание строк будет суммироваться.
Спасибо за ответ, подскажите плз, как выставить каретку в начало через SendMessage.
И еще вопрос. Возможно ли получить указатель TScrollbar из компонента?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,879
Записей в блоге: 12
02.11.2015, 23:41
Цитата Сообщение от Илья2 Посмотреть сообщение
как выставить каретку в начало через SendMessage.
Не надо SendMessage, достаточно
C++
1
Memo1->SelStart = 0;
Цитата Сообщение от Илья2 Посмотреть сообщение
Возможно ли получить указатель TScrollbar из компонента?
Зачем?
0
2 / 2 / 0
Регистрация: 09.09.2015
Сообщений: 22
04.11.2015, 02:01  [ТС]
Memo1->SelStart = 0; не работает. Я пробовал и CaretPos и Cursor и другие свойства. Единственное, что меняет индекс первой отрисовываемой строки это функция ScrollBy. Еще я пробовал делать Clear() и рисовать все заного, но это ужасно.

Указатель на TScrollbar нужен чтобы задавать шаг прогрутки и допл. настройки (SmallChange, Min, Max). Главная цель уменьшить количество действий с TMemo. Когда я читаю текст или занимаюсь редактированием, то кнопками на скроле(вверх и вниз на строку) я почти не пользуюсь, листаю сразу по слайдеру. Если перевести SmallChange с единицы на собственную величину, например, на 15% от всего, то большие тексты я смогу пролистывать быстрее и попадать, например, в середину документа сразу без прицеливания. Еще можно использовать клавишу ScrollDown как пролистывание всех видимых строк (те в мемо нарисовано с 0 по 20 строк, я нажал один раз ScrollDown и мемо нарисовал строки с 20 по 40).
Я рассматривал вариант где можно создать дополнительный скрол и через него все подкрутить. Но такое решение вызывает у меня проектировочную печаль.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,879
Записей в блоге: 12
04.11.2015, 09:42
Memo1->SelStart = 0; не работает.
Если б не работало - я б не написал. Коды без проверки мной не выкладываются. Все прекрасно работает, пробуй на чистом проекте. Если у тебя в коде какой-то другой фрагмент мешает этому способу отработать - это проблемы того, другого фрагмента.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
04.11.2015, 09:52
Memo1->SelStart = 0;
- работает; но может у ТС фокус переносится на другой компонент и этого не видно?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,879
Записей в блоге: 12
04.11.2015, 10:02
Цитата Сообщение от nick42 Посмотреть сообщение
и этого не видно?
Не видно чего? Что содержимое Memo прокручивается на заданное число строк не от текущего положения, а от начала? Это в любом случае должно быть видно.
0
2 / 2 / 0
Регистрация: 09.09.2015
Сообщений: 22
04.11.2015, 13:16  [ТС]
Да, все работает.
Я понял
Цитата Сообщение от volvo Посмотреть сообщение
Не надо SendMessage, достаточно
по другому и выполнял как
Memo1->SelStart = 0;
SendMessage(Memo1->Handle, EM_LINESCROLL, 0, i);
Сейчас я написал
Memo1->SelStart = 0;
SendMessage(Memo1->Handle, EM_SCROLLCARET, 0, 0);
SendMessage(Memo1->Handle, EM_LINESCROLL, 0, i);
И все заработало.
Спасибо за ответ, теперь все супер))))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2015, 13:16
Помогаю со студенческими работами здесь

DataGrid как сделать выделение всей строки
Есть заполненный данными DataGrid свойство ReadOnly = true если кликнуть на ячейке то происходит переход в режим 'редактирования' ячейки,...

[WPF] Как сделать выделение строки цветом в listBox?
У меня выводится список подозрительных файлов в list.box. Допустим там есть расширение файла amc. ,как сделать чтобы все файлы с этим...

Выделение текста в TMemo
как сделать так,чтобы при удачном поиске слова в Memo (компонента) это найденное слово выделилось там скажем синим цветом?? не подскажите...

Как сделать скроллинг в TMemo?
как промотать содержимое TMemo до самого низа? необходимо вести некое подобие лога, чтобы последнее сообщение (последняя строка) было на...

Как зафиксировать две строки в TMemo?
У меня есть цикл. И в нём постоянно в memo заносится новая строка. Вот так они заносятся, заносятся и первые строки начинают уплывать из...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД 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 05.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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru