Есть лог работы программы, который формируется в памяти в TStringList. Чем лучше его отобразить на экране? Желательно, чтобы была возможность это делать в оперативном режиме, во время работы программы добавлять туда текст. TMemo - можно, но, во-первых, редактирование изначально не нужно, и во-вторых, очень медленно он работает, если большой объем. Идеальное решение было бы наподобие терминала. Есть хардкорный вариант - рендерить текст самому на канве + скроллеры, но остаются вопросы по выделению текста и копированию его в буфер. Просто перед тем, как изобретать велосипед, подумал, что, возможно, такая задача уже была решена и решение известно многим, но не мне.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
22-05-2019 14:41 | Комментарий к предыдущим ответам
To Python:
Для таких специальных целей как "скопировать кусочек текста", можно использовать буферный TMemo. Но не лепить его всплывающим, а пусть в диалоге появляется, или на той же форме, варианты есть. Отметить в листбоксе диапазон строк, скопировать в TMemo, а дальше использовать штатные средства.
22-05-2019 09:06 | Комментарий к предыдущим ответам
To Александр Малыгин:
Ну у меня та же штука с виртуальным листбоксом, только я не пользуюсь OnHint - он неудобен. Точнее как: он удобен для просмотра, но вот чтобы скопировать кусочек данных из лога - уже никак (приходится только полную строку). Я пытался сделать всплывающий TMemo (ну, не сам TMemo, он так не сможет, а именно виндовый компонент EDIT многострочный), чтобы можно было "залезть" в подсказку, скопировать отткуда кусочек по желанию штатными методами... но не получилось. Точнее как: получилось, но работало нестабильно: то не отображалось, когда надо, то напротив, не исчезло, когда надо. Понятно, что руки, но...
Я использую для логов большого размера TListbox в виртуальном режиме, т.е. когда он не хранит данные, а получает строки из обработчика события onData.
Проблема длинных строк решается следующим образом: для строки, которая не помещается в поле вывода, при наведении курсора появляется хинт с полной строкой. Для этого на событие Application.OnShowHint вешается специальный обработчик, и эта фича работает для всех листбоксов в приложении (у которых ShowHint=true). Разные версии кода обработчика были опубликованы на этом сайте, например: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=762
Спасибо за ответы. Конечно, все приёмы работы с Мемо соблюдены. Кроме буферизированного вывода, это может улучшить. Физически обновление добавление делать по таймеру из буфера. Но опять же, нужно самому следить за наполнением, установить некий лимит, после которого очищать содержимое.
Виртуальный ListBox и ListView я рассматривал, но оно не подходит по своей идее из-за важности всего текста, который должен быть записан в логе, Word Wrap важен.
Я для отображения логов пользуюсь виртуальным ListBox. Правда, я не рисую во много строк, то есть длинные строки обрезаются (для меня - некритично). В ListBox хранится только адрес структуры, где лежат два integer (по логике надо int64, но у меня физически лог обрезается до 10 Мб, так что 2Гб и выше просто не может быть), файл спроецирован полностью (если лог будет более 2Гб - то не спроецируете, придётся окошком бегать, да ещё заботиться о том, чтобы окошко перемещалось с гистерезисом, а то при малейшем движении туда-сюда будете несколько раз переставлять окошко) в память, оттуда дёргаю кусок, сразу разбираю и отображаю нужным цветом.
В отличии от Memo, данный метод МОЖЕТ дать выигрыш по памяти (Memo всё суёт в память, потому и работает быстро, для логов не очень хорошее решение).
Вряд ли что-то быстрее TMemo получится. У него, кстати, есть свойство ReadOnly
Вывод нужно оптимизировать, посылая текст порциями, плюс TMemo.Lines.BeginUpdate()/EndUpdate()
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.