Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502

Большой обьем текста в CEdit

30.06.2020, 20:27. Показов 1494. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем.
Подскажите что делать если необходимо добавить большой обьем текста в CEdit.
В момент добавления он виснет и чем длиннее
текст, тем дольше пауза (Пользователь конечно не будет использовать такую программу). Есть ли возможность что то с этим сделать?
Я в принципе уже сталкивался с подобным в CListCtrl.
И здесь мне подсказали волшебный флаг LVS_OWNERDATA.
Может есть какой то выход и с CEdit?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.06.2020, 20:27
Ответы с готовыми решениями:

Ошибка при получении текста из CEdit
Пишу программу на MFC. Создал переменную m_wareRemainderEdit для контрола CEdit, расположенного на диалоге. При получении текста из...

Большой обьем текста и процедура
У меня имеется пара вопросов: 1)Какой командой можно напечатать большой обьем текста (пару абзацев)? Writeln, как я понимаю, печатает...

Обьем текста в Qr генераторе
Почему то влазит около 100 символов, иначе выбивает ошибку. Как Можно менять размеры самого Qr кода. Очень буду благодарен за помощь

19
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.06.2020, 22:31
Цитата Сообщение от zombivadim Посмотреть сообщение
И здесь мне подсказали волшебный флаг LVS_OWNERDATA.
Может есть какой то выход и с CEdit?
Нет, здесь такого нету.
А как ты добавляешь? Покажи код.

И, наверное, воспользуйся Rich Edit, он лучше приспособлен для обработки больших текстов
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
30.06.2020, 23:26  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А как ты добавляешь? Покажи код.
m_edit.SetWindowTextW(strOutput);
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.07.2020, 11:27
Цитата Сообщение от zombivadim Посмотреть сообщение
m_edit.SetWindowTextW(strOutput);
Это не добавление, а установка текста. И оно отрабатывает очень быстро. Проблема у тебя где-то в другом месте.

Добавлено через 43 секунды
Какой у тебя размер текста?
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
01.07.2020, 19:23  [ТС]
8 509 629 байт (приходится ждать наверно пол минуты).
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.07.2020, 19:30
Цитата Сообщение от zombivadim Посмотреть сообщение
8 509 629 байт (приходится ждать наверно пол минуты).
У меня текст, размером 8 * 1024 * 1024, меньше, чем за секунду добавляется, вместе с формированием такой строки.
Покажи код.
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
01.07.2020, 19:43  [ТС]
В коде точно нет проблемы он прост насколько возможно
C++
1
2
3
4
CString strOutput;
    LPSTR str = LPSTR((DWORD_PTR)WinINIR + m_rawofset);
    strOutput = str;
    m_edit.SetWindowTextW(strOutput);
Добавлено через 3 минуты
А может быть проблема в том что текст не форматированный?
А идет сплошной кучей. Возможно контрол тратит время на его разбиение?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.07.2020, 19:45
Цитата Сообщение от zombivadim Посмотреть сообщение
В коде точно нет проблемы он прост насколько возможно
Ну как нету - зачем ты копируешь строку в strOutput?
C++
1
    ::SetWindowTextA(m_edit.m_hWnd, LPSTR((DWORD_PTR)WinINIR + m_rawofset));
Подозреваю, у тебя на конвертацию в юникод всё время и тратилось
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
01.07.2020, 20:01  [ТС]
oleg-m1973,
Не ваш пример ничего не изменил, абсолютно одинаковый результат.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.07.2020, 20:06
Цитата Сообщение от zombivadim Посмотреть сообщение
Не ваш пример ничего не изменил, абсолютно одинаковый результат.
Замерь просто время вызова ::SetWindowTextA. Скорее всего у тебя проблема в другом месте
C++
1
2
3
4
    const DWORD tm = ::GetTickCount();
    ::SetWindowTextA(m_edit.m_hWnd, LPSTR((DWORD_PTR)WinINIR + m_rawofset));
    auto msg = std::to_wstring(::GetTickCount() - tm);
    MessageBox(msg.c_str());
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
01.07.2020, 20:20  [ТС]
oleg-m1973,
59375
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.07.2020, 20:24
Лучший ответ Сообщение было отмечено zombivadim как решение

Решение

Цитата Сообщение от zombivadim Посмотреть сообщение
oleg-m1973,
59375
У меня ~500. Покажи, как у тебя этот контрол объявлен в ресурсах
C++
1
EDITTEXT        IDC_EDIT1,7,7,230,134,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_VSCROLL | WS_HSCROLL
1
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
01.07.2020, 20:28  [ТС]
https://yadi.sk/d/ueb-WGP5TXvyNw
Попробуйте у себя открыть это файл я копирую его в буфер памяти и вывожу как показывал.
Создаю
m_edit.Create(WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE| ES_MULTILINE | WS_VSCROLL | ES_AUTOVSCROLL, m_invalidate, this, 9557);
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.07.2020, 20:34
Цитата Сообщение от zombivadim Посмотреть сообщение
Попробуйте у себя открыть это файл я копирую его в буфер памяти и вывожу как показывал.
~600мс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void CMFCApplication1Dlg::OnBnClickedButton1()
{
    std::string s = (std::stringstream() << std::ifstream(R"(D:\Y.txt)").rdbuf()).str();
 
    //size_t i = 0;
    //while (s.size() < 8 * 1024 * 1024)
    //{
    //  s += std::to_string(++i);
    //  s += ": ";
    //  for (size_t i = 0; i < 100; ++i)
    //      s += "абвгдежз";
 
    //  s += "\r\n";
    //}
 
    const DWORD tm = ::GetTickCount();
    ::SetWindowTextA(m_edit1.m_hWnd, s.c_str());
    auto msg = std::to_wstring(::GetTickCount() - tm);
    MessageBox(msg.c_str());
}
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
01.07.2020, 20:48  [ТС]
Еееее прст. ES_AUTOVSCROLL заменил на WS_HSCROLL и все мгновенно вывелось, что за ерунда.

Добавлено через 5 минут
такие флаги WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE| ES_MULTILINE | WS_VSCROLL | WS_HSCROLL
600 мс
такие WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE| ES_MULTILINE | WS_VSCROLL | ES_AUTOVSCROLL
60000 мс

Добавлено через 8 минут
oleg-m1973,
А ну все правильно. Это и есть доказательство моего изначального предположения.
Все время контрол тратил на разбиение строк, чтобы запихнуть их в окно.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.07.2020, 20:53
Цитата Сообщение от zombivadim Посмотреть сообщение
такие WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE| ES_MULTILINE | WS_VSCROLL | ES_AUTOVSCROLL
60000 мс
Ну да, тоже повторилось. Нужна горизонтальная прокрутка ES_AUTOHSCROLL или WS_HSCROLL

Добавлено через 1 минуту
Цитата Сообщение от zombivadim Посмотреть сообщение
А ну все правильно. Это и есть доказательство моего изначального предположения.
Все время контрол тратил на разбиение строк, чтобы запихнуть их в окно.
Там и без разбиения начинает тормозить

Добавлено через 3 минуты
Если не указать ES_AUTOHSCROLL, он по словам пытается переносить, word wrap
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
01.07.2020, 21:05  [ТС]
oleg-m1973,
Спасибо вам за уделенное мне время.
Вы всегда меня выручаете
Вообщем тут один выход, если HSCROLL не нужен, то надо самому отформатировать текст,
Их алгоритм очень медленный.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.07.2020, 21:10
Цитата Сообщение от zombivadim Посмотреть сообщение
Вообщем тут один выход, если HSCROLL не нужен, то надо самому отформатировать текст,
Вряд ли твой алгоритм будет быстрее.
Просто не надо редактировать большие тексты без переводов строк, они везде медленно обрабатываются
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
01.07.2020, 21:29  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Просто не надо редактировать большие тексты без переводов строк
Как вы себе такое представляете?
В моем тексте есть перевод строк, только строки очень длинные и они не помещаются в окно,
а если бы их вообще не было?
Все вывелось бы в одну строку, а длинна горизонтального ползунка
была бы километровой.
Такое не приемлемо в принципе.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.07.2020, 21:38
Цитата Сообщение от zombivadim Посмотреть сообщение
Как вы себе такое представляете?
В моем тексте есть перевод строк, только строки очень длинные и они не помещаются в окно,
а если бы их вообще не было?
Никак не представляю. В любом случае плохо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.07.2020, 21:38
Помогаю со студенческими работами здесь

Использовать ф-цию которая вычисляет обьем цилиндра, найти в программе обьем трёх цилиндров с указаными параметрами.
Радиус основания Висота цилиндра первый цилиндр R1 h второй цилиндр a 10 третий цилиндр 8.34 7.3

Большой объём текста в TMemo
Имеется текстовый файл весом порядка 1 мегабайта Если текст загонять в TMemo через...

Вывести большой кусок текста
Необходимо вывести большой кусок текста пользователю, но richtextBox не может показать столько символов. Как вывести текст?

Большой размер текста в TextEdit qml
Собсно, проблема в следующем: Имеем текстовые файлы, размерами 10 Кб, 100 Кб, 1Мб, обработчик на C++ и элемент на QML. При попытке...

Как вывести большой объём текста?
При использовании QTextEdit или QPlainTextEdit Если попытаться вывести за 1 цикл, текста больше чем помещается в едитку без прокрутки,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru