Потоковый/виртуальный EDIT
От: CEMb  
Дата: 21.06.22 09:57
Оценка:
Всем привет.

Хочется концептуально понять, можно ли быстро сделать сабж штатными средствами? Т.е. количество велосипеда свести к минимуму.

Задумка примерно такая. Вот есть консоль cmd, туда текст может сыпаться огромными количествами, просто через printf, добавляется в хвост, его там можно скроллить, копировать.
Хочется такой же EDIT.
Вот есть виртуальный ListView32, которому только размер меняешь и обрабатывает колбак для подачи информации в ячейки. В качестве буфера — std::vector. Удобно. Но нельзя скопировать

Сама задача примерно такая: есть консольное приложение, которое в пайпу сыпет астрономические объёмы текста(клиент БД), есть Win32 оконное приложение, которое установило потоки ввода-вывода на себя (чтобы разделить окно ввода и вывода, чтобы удобнее было вводить команды и так далее) и вот теперь ему надо как-то справляться с объёмом информации, быстро его выводить, но пока для вывода используется read-only Edit, и это всё дико тормозит на больших объёмах в wm_settext. Вставка текста в хвост работает быстро (интересно, как это внутри), но у меня read-only.

PS: пока набирал пост, просмотрел stackoverflow, ничего не нашёл, кроме как "сделать свой".
Re: Потоковый/виртуальный EDIT
От: Stanislav V. Zudin Россия  
Дата: 21.06.22 10:10
Оценка: 6 (1)
Здравствуйте, CEMb, Вы писали:
CEM>Сама задача примерно такая: есть консольное приложение, которое в пайпу сыпет астрономические объёмы текста(клиент БД), есть Win32 оконное приложение, которое установило потоки ввода-вывода на себя (чтобы разделить окно ввода и вывода, чтобы удобнее было вводить команды и так далее) и вот теперь ему надо как-то справляться с объёмом информации, быстро его выводить, но пока для вывода используется read-only Edit, и это всё дико тормозит на больших объёмах в wm_settext. Вставка текста в хвост работает быстро (интересно, как это внутри), но у меня read-only.

CEM>PS: пока набирал пост, просмотрел stackoverflow, ничего не нашёл, кроме как "сделать свой".


Посмотри в сторону RichEdit'а и в частности EM_REPLACESEL.
Если склероз не подводит, то похожую задачу делали именно через него.
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: Потоковый/виртуальный EDIT
От: Carc Россия https://vk.com/gosha_mazov
Дата: 22.06.22 16:17
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, CEMb, Вы писали:

CEM>>Сама задача примерно такая: есть консольное приложение, которое в пайпу сыпет астрономические объёмы текста(клиент БД), есть Win32 оконное приложение, которое установило потоки ввода-вывода на себя (чтобы разделить окно ввода и вывода, чтобы удобнее было вводить команды и так далее) и вот теперь ему надо как-то справляться с объёмом информации, быстро его выводить, но пока для вывода используется read-only Edit, и это всё дико тормозит на больших объёмах в wm_settext. Вставка текста в хвост работает быстро (интересно, как это внутри), но у меня read-only.

CEM>>PS: пока набирал пост, просмотрел stackoverflow, ничего не нашёл, кроме как "сделать свой".


SVZ>Посмотри в сторону RichEdit'а и в частности EM_REPLACESEL.

SVZ>Если склероз не подводит, то похожую задачу делали именно через него.
Решение с RichEdit вполне рабочее. Но вот сделать RichEdit виртуальным как ListView так просто не получится.
Aml Pages Home
Re: Потоковый/виртуальный EDIT
От: flаt  
Дата: 23.06.22 05:15
Оценка: +2
Почему нельзя скопировать из ListView? Контекстное меню есть, выделенные строки тоже можно получить. Если напрячься, можно нарисовать и выделение по буквам. Ну, а копировать в буфер обмена — тривиально.
Re: Потоковый/виртуальный EDIT
От: qaz77  
Дата: 23.06.22 08:59
Оценка: 7 (2)
Здравствуйте, CEMb, Вы писали:
CEM>Задумка примерно такая. Вот есть консоль cmd, туда текст может сыпаться огромными количествами, просто через printf, добавляется в хвост, его там можно скроллить, копировать.

RichEdit умеет добавление через EM_STREAMIN.
Там в структуре EDITSTREAM указывается callback и можно данные подавать из std::vector, std::istrstream и т.п.

Использовал такую штуку для вывода логов на экран. Работает вполне приемлемо на миллионах строчек.
Re[2]: Потоковый/виртуальный EDIT
От: Carc Россия https://vk.com/gosha_mazov
Дата: 23.06.22 09:54
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>RichEdit умеет добавление через EM_STREAMIN.

Q>Там в структуре EDITSTREAM указывается callback и можно данные подавать из std::vector, std::istrstream и т.п.

Q>Использовал такую штуку для вывода логов на экран. Работает вполне приемлемо на миллионах строчек.

А вертикальный скрроллинг в таком RichEdit как тогда отслеживать\реализовывать?
Aml Pages Home
Re[2]: Потоковый/виртуальный EDIT
От: CEMb  
Дата: 23.06.22 10:34
Оценка: 1 (1)
Здравствуйте, flаt, Вы писали:

F>Почему нельзя скопировать из ListView? Контекстное меню есть, выделенные строки тоже можно получить. Если напрячься, можно нарисовать и выделение по буквам. Ну, а копировать в буфер обмена — тривиально.

Нельзя скопировать с произвольной позиции до произвольной. Т.е, к примеру, текст от середины первой строки до середины второй. И я не уверен, что ListView с режимом редактирования может использоваться одновременно с виртуальным fixed size, ему же там для отрисовки текста колбак нужен. Ну и сам ListView по виду и интерактиву сильно отличается от Edit-а.

F>Если напрячься, можно нарисовать и выделение по буквам.

Если уж напрягаться, то можно тогда просто свой Edit забабахать хотелось минимально что-то своё делать.
Re[3]: Потоковый/виртуальный EDIT
От: qaz77  
Дата: 23.06.22 10:37
Оценка:
Здравствуйте, Carc, Вы писали:
C>А вертикальный скрроллинг в таком RichEdit как тогда отслеживать\реализовывать?

В смысле чтобы последняя строчка всегда была видна?
Сначала колдую с EM_GETFIRSTVISIBLELINE, EM_GETLINECOUNT и EM_LINEINDEX,
а потом делаю EM_LINESCROLL на вычисленное количество строк.
Re[4]: Потоковый/виртуальный EDIT
От: Carc Россия https://vk.com/gosha_mazov
Дата: 23.06.22 10:56
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Здравствуйте, Carc, Вы писали:

C>>А вертикальный скрроллинг в таком RichEdit как тогда отслеживать\реализовывать?

Q>В смысле чтобы последняя строчка всегда была видна?

Q>Сначала колдую с EM_GETFIRSTVISIBLELINE, EM_GETLINECOUNT и EM_LINEINDEX,
Q>а потом делаю EM_LINESCROLL на вычисленное количество строк.
Нет. Это-то раз фигня… Там вариантов туча: скролл-туды, скролл-сюды, TOM-интерфейсы, EM_EXSETSEL, EM_LINESCROLL и прочия…

А вот как сделать так?
1) Чтобы если первая строка в RichEdit уже видна (скажем, текущее выделение {0,0}).
2) Но де факто эта первая видимая строка вовсе не первая.
Потому как где-то во внешнем источнике данных для такого "виртуального" RichEdit, есть еще предыдущие Икс строк данных для отображения.

Вот как сделать, чтобы именно сам вертикальный скроллер Ричэдита показывал возможность скрольнуться выше? То бишь в те самые предыдущие Икс строк, в порцию данных (того же лога)?

Как сие-то реализовать?
Aml Pages Home
Re[5]: Потоковый/виртуальный EDIT
От: qaz77  
Дата: 23.06.22 11:05
Оценка:
Здравствуйте, Carc, Вы писали:

C>Потому как где-то во внешнем источнике данных для такого "виртуального" RichEdit, есть еще предыдущие Икс строк данных для отображения.


C>Вот как сделать, чтобы именно сам вертикальный скроллер Ричэдита показывал возможность скрольнуться выше? То бишь в те самые предыдущие Икс строк, в порцию данных (того же лога)?



Не-не. Никакой виртуальности там нет. RichEdit самый обычный и скроллинг показывает все строки.
Потоковый ввод — это просто один из способов забить контрол текстом.

У ТС с обычным Edit проблема, что каждый раз делается GetWindowText, append добавки, SetWindowText, а это медленно.
Для какого-то мелкого вывода, где ожидается порядка десяти строчек, я тоже так делаю с readonly Edit.
Re[6]: Потоковый/виртуальный EDIT
От: Carc Россия https://vk.com/gosha_mazov
Дата: 23.06.22 11:21
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Здравствуйте, Carc, Вы писали:


C>>Потому как где-то во внешнем источнике данных для такого "виртуального" RichEdit, есть еще предыдущие Икс строк данных для отображения.


C>>Вот как сделать, чтобы именно сам вертикальный скроллер Ричэдита показывал возможность скрольнуться выше? То бишь в те самые предыдущие Икс строк, в порцию данных (того же лога)?



Q>Не-не. Никакой виртуальности там нет. RichEdit самый обычный и скроллинг показывает все строки.

Q>Потоковый ввод — это просто один из способов забить контрол текстом.
А это-то… Ну тогда это никакой не виртуальный RichEdit! Чего тогда городить огород было с EM_STREAMIN?

Q>У ТС с обычным Edit проблема, что каждый раз делается GetWindowText, append добавки, SetWindowText, а это медленно.

Q>Для какого-то мелкого вывода, где ожидается порядка десяти строчек, я тоже так делаю с readonly Edit.
Дык добавлять и в Edit можно…
Делов-то, йопта?
EM_SETSEL (-1 , -1) + EM_REPLASESEL();

Это и Edit все умеет, ну и RichEdit тоже само собой.

Хотя про выбор RichEdit я все равно согласен.
1) Запас памяти под внутренний буфер у него в разы больше. Одно это уже склоняет к выбору.

2) Манипуляшки с TOM-интерфейсами дают больший выбор возможностей на порядок. Уже хорошо!

3) Маскировка событий (EM_SETEVENTMASK): причем можно и на лету (выключил-сделал-включил)

4) Ну и само собой возможности на вырост: минимальное форматирование (bold, italic). Автоподсветка гиперссылок. Ну и всякие синтаксические подсветки приделываются к RichEdit на раз, за подня-день.
Aml Pages Home
Re[7]: Потоковый/виртуальный EDIT
От: qaz77  
Дата: 23.06.22 12:04
Оценка:
Здравствуйте, Carc, Вы писали:

C>Дык добавлять и в Edit можно…

C>Делов-то, йопта?
C>
C>EM_SETSEL (-1 , -1) + EM_REPLASESEL();
C>

C>Это и Edit все умеет, ну и RichEdit тоже само собой.

Это все известно, но порождает другие проблемы.
Надо запоминать, что у пользователя было выделено, потом восстанавливать.
Скроллинг также запоминать-восстанавливать.

Плюс EM_STREAMIN в том, что ничего никуда не прокручивает.
Выделение и позиция скроллинга остаются какими были.
Если нужно куда-то прокрутить, то делаем это руками.
В моем окошке вывода видимость последней строки обеспечивается только в том случае,
когда каретка стоит в конце текста.
А если пользователь что-то выделил, куда-то прокрутил окно,
то он спокойно смотрит-выделяет-копирует в середине текста,
а новые строчки спокойно стримятся в конец.

Получается что-то вроде студийного окна output.
Re[8]: Потоковый/виртуальный EDIT
От: Carc Россия https://vk.com/gosha_mazov
Дата: 23.06.22 17:18
Оценка: +1
Здравствуйте, qaz77, Вы писали:

Q>Здравствуйте, Carc, Вы писали:


C>>Дык добавлять и в Edit можно…

C>>Делов-то, йопта?
C>>
C>>EM_SETSEL (-1 , -1) + EM_REPLASESEL();
C>>

C>>Это и Edit все умеет, ну и RichEdit тоже само собой.

Q>Это все известно, но порождает другие проблемы.

Q>Надо запоминать, что у пользователя было выделено, потом восстанавливать.
Q>Скроллинг также запоминать-восстанавливать.

Q>Плюс EM_STREAMIN в том, что ничего никуда не прокручивает.

Q>Выделение и позиция скроллинга остаются какими были.
Q>Если нужно куда-то прокрутить, то делаем это руками.
А зачем для этого EM_STREAMIN, я чего-то не пойму… Можно кусок кода посмотреть?
Имхо, проще использовать интерфейс ITextRange.
Aml Pages Home
Re[3]: Потоковый/виртуальный EDIT
От: flаt  
Дата: 23.06.22 20:15
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>

CEM>Если уж напрягаться, то можно тогда просто свой Edit забабахать хотелось минимально что-то своё делать.

Scintilla не вариант?
Re[4]: Потоковый/виртуальный EDIT
От: CEMb  
Дата: 24.06.22 09:45
Оценка:
Здравствуйте, flаt, Вы писали:

CEM>>Если уж напрягаться, то можно тогда просто свой Edit забабахать хотелось минимально что-то своё делать.


F>Scintilla не вариант?


У меня свой такой есть, но они оба с излишним функционалом. Не хочется тащить лишнее в проект, а выкидывать и отлаживать может оказаться дольше, чем написать с нуля.

Хотелось просто стену текста с возможностью выделения и копирования. Я вообще когда с проблемой столкнулся, думал, что я чего-то тут не знаю, потому как казалось, что такое требование к контролу довольно ожидаемое, плюс у ListView32 такое есть, а он несколько сложнее.
Думаю, сделаю просто стену текста без копирования, зато быстро.
Re: Потоковый/виртуальный EDIT
От: Шольцевская Колбаса Россия  
Дата: 03.08.22 06:56
Оценка: -1
Здравствуйте, CEMb, Вы писали:

CEM>Задумка примерно такая. Вот есть консоль cmd, туда текст может сыпаться огромными количествами, просто через printf, добавляется в хвост, его там можно скроллить, копировать.

CEM>Хочется такой же EDIT.

Поищи на Code Project, я там находил. У меня давно давно была задача: надо было cout перенаправить в Edit.
СЛАВА РФ! СЛАВА ПУТИНУ, моему любимому царю и вождю великому! Смотрю только Соловьева, Симонян, Скабееву, МО РФ.
Re: Потоковый/виртуальный EDIT
От: Went  
Дата: 03.08.22 12:15
Оценка:
Здравствуйте, CEMb.
Боюсь, что мимо, но с этим ничего нельзя сделать?
Re[2]: Потоковый/виртуальный EDIT
От: CEMb  
Дата: 14.08.22 12:09
Оценка:
Здравствуйте, Went, Вы писали:

W>Здравствуйте, CEMb.

W>Боюсь, что мимо, но с этим ничего нельзя сделать?
Неа, уже пробовал
Re[2]: Потоковый/виртуальный EDIT
От: CEMb  
Дата: 14.08.22 12:12
Оценка: 1 (1)
Здравствуйте, Шольцевская Колбаса, Вы писали:

ШК>Поищи на Code Project, я там находил. У меня давно давно была задача: надо было cout перенаправить в Edit.


да я пока просто запилил read-only edit, без выделения/копирования, а если понадобится вдруг, буду решать задачи по мере поступления
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.