Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Нужна помощь - вывод большого объема текста в текстовое поле
|
|||
|---|---|---|---|
|
#18+
Народ! Хочу написать клиента для непрерывного чата. Возникла проблема с выводом текста в текстовое поле. Поясню: работа клиента не ограничена, при этом нужно организовать чекбокс "остановить прокрутку", чтобы можно было оставить клиента на ночь в чате, а потом читать текст с того места, где прервался. Все бы ничего, да вот текст должен отображаться форматированным (по цвету, по размеру и т.д.), поэтому обычный TextBox не подходит. Тогда выбор пал на RichTextBox. Но появилась неувязочка - как только я приваиваю ему дополнительную порцию форматированного текста (RichTextBox.text=RichTextBox & string), предыдущее форматирование стирается. Я и это обошел, написав след. код: ' RichTextBox.SelStart = Len(RichTextBox.text) RichTextBox.SelText = vbLf & string ' Тогда при каждом добавлении текста скролл автоматом съезжает вниз. В общем, получается замкнутый круг... Решил было воспользоваться советом о том, как добавлять в TextEdit более 64 Кб текста, т.е. организовать массив и загонять его в RichTextBox порциями, но тогда все упирается в размеры окна этого самого RichTextBox - в конце прокрутки неизбежно появятся пустые строки. И как я только не "извращался", не получается. Заранее длину строки предугадать невозможно, горизонтальной прокрутки нет (ее не дожно быть в принципе), поэтому подгон константы с пустыми строками под высоту RichTextBox не пойдут, т.к. в массиве длиннющая строка будет представлена как одна, а в RichTextBox она будет переносится по строкам... поэтому возможен еще один "глюк" - я прокручу скролл на 1 позицию, а RichTextBox обновится, скажем, на 3 новых строки. Разбиение (предварительное) строки в массиве на неск. подстрок тоже не проходит, все зависит от размера выбранного шрифта и размеров самих символов. В общем, я уже почти отчаялся... но ведь есть же редакторы типа Word, Excel, тот же IE - все форматированное и со скроллом все в порядке. Что посоветуете? Может, есть другой контрол? (WebBrowser не предлагать;) Желательно, чтобы в этом контроле можно было делать ссылки.. напр., пойдет в чате сообщение с урл, и чтобы пользователь мог мышкой, прямо из клиента, пройти по ней (как в IE). PS Даже если и отказаться от идеи остановки скролла, все равно будет ошибка - через пару часов пребывания клиента в чате, форматирование будет жутко тормозить.. т.е. сначала появится мессага, а только потом она будет раскрашена соответствующим образом... PPS Надеюсь, все подробно описал;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2004, 20:32 |
|
||
|
Нужна помощь - вывод большого объема текста в текстовое поле
|
|||
|---|---|---|---|
|
#18+
На счет торможения. А ты не крась все. Как видяхи современные делают, крась только то что видно. Оставляй в тексте невидимые теги цветов и при прокрутке читай да подкрашивай :) Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2004, 20:35 |
|
||
|
Нужна помощь - вывод большого объема текста в текстовое поле
|
|||
|---|---|---|---|
|
#18+
2 Magnus23 Интересно, конечно, а как код узнает, видима строка в данный момент или нет? Это я и сам думал, и, если бы с массивом у меня все получилось, так и делал бы. Насчет "невидимых" цветов - интересное выражение;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2004, 20:49 |
|
||
|
Нужна помощь - вывод большого объема текста в текстовое поле
|
|||
|---|---|---|---|
|
#18+
Ну ты же знаешь текущую позицию а также знаешь насколько прокрутили. Для этого, отключаем его собственные скролбары и цепляем отдельный вертикальный, по его изменениям можно судить о позиции. я имел ввиду что тег цвета можно не показывать а не сами цвета :) Вообще-то, можно ипишками получитьразмеры шрифта и вычислять количество символов в одной строке в зависимости от размера контрола. Но это немного муторно в кодировании. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2004, 21:26 |
|
||
|
Нужна помощь - вывод большого объема текста в текстовое поле
|
|||
|---|---|---|---|
|
#18+
Я это тоже пробовал... а что ты имеешь в виду под словом "тег"? это же не хтмл... да, приходит в виде хтмл, но теги все вырезаются, красить-то по-любому через .SelColor= А вот насчет АПИ поподробнее, потому как я не смог их "правильно выстроить".. вроде бы примерно в голове код критится, но никак не могу это реализовать.. Тем более, ты не учел сами символы. Т.к. Если ты напишешь, например, десять раз подряд большую букву А, а потом, на др. строке, десять точек (.), то точки будут занимать гораздо меньше места, поэтому их можно в одной строке уместить больше. Понимаешь? Все не так просто, как хотелось бы.. в общем, если еще есть идеи - пожалуйста в коде;) Иначе, после 10 часов беспрерывного программинга голова уже не варит;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2004, 21:38 |
|
||
|
Нужна помощь - вывод большого объема текста в текстовое поле
|
|||
|---|---|---|---|
|
#18+
Не хтмл, но ртф :), там тоже своих тегов хватает, вполне можнонпоиграться с ними. TextRtf свойство. Но конечно, сначала тебе придется разобраться с со спецификацией ртф. Это кстати очень интересный вариант. На счет АПИ, символы то я учел, не учел то что телепаты в отпуске :), я когда это писал , сам думал о главе из книги Эпламана "Вин32 АПИ и Вижуал Васик", в которй как раз подобное и описывалось. У меня-то мозги уже тоже не первой свежести. :) Она дома валяется, если будет время, вечером гляну и завтра притараню код. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2004, 21:49 |
|
||
|
Нужна помощь - вывод большого объема текста в текстовое поле
|
|||
|---|---|---|---|
|
#18+
Да, только РТФ мне еще не хватало)) Видел я там этот код... тоскливо стало;)) Насчет кода - буду благодарен:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2004, 21:58 |
|
||
|
Нужна помощь - вывод большого объема текста в текстовое поле
|
|||
|---|---|---|---|
|
#18+
На самом деле в ртф все не так страшно, тебе то нужно не все, а только некоторая часть приминительно к товей проблеме. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2004, 22:01 |
|
||
|
Нужна помощь - вывод большого объема текста в текстовое поле
|
|||
|---|---|---|---|
|
#18+
В общем, примеры кода в студию!;) Я понимаю, что и сам могу разобраться в этом... но уже сил и времени нет:( Еще раз большое спасибо за внимание к моей проблеме;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2004, 22:44 |
|
||
|
Нужна помощь - вывод большого объема текста в текстовое поле
|
|||
|---|---|---|---|
|
#18+
Ок :). Постараюсь завтра притащить. Кстати, :), есть местная функция, TextWidth возвращающая длинну текста в исходя из текущего шрифта формы. Делишь на размер бокса, получаешь строки :) Как вариант :) Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2004, 23:08 |
|
||
|
Нужна помощь - вывод большого объема текста в текстовое поле
|
|||
|---|---|---|---|
|
#18+
Или используй шрифт курьер - там все символы одинаковой ширины. Тоже как вариант :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2004, 14:32 |
|
||
|
Нужна помощь - вывод большого объема текста в текстовое поле
|
|||
|---|---|---|---|
|
#18+
Народ! Свершилось;)) Я сам догадался, как енто все перехитрить. На всяк случай приведу пример кода, может кому-то поможет... ' Option Explicit Private Const LINES = 20 ' вот это значение зависит от высоты RichTextBox (тут я его обозвал txtText Dim n Private A$() Private Sub Command3_Click() Dim dd As Integer, i3 As Integer Open "C:\113.txt" For Input As #1 Len = 1024 Do Until EOF(1) n = n + 1 ReDim Preserve A$(n + LINES) Line Input #1, A$(n) txtText.Text = A$(n) If txtText.GetLineFromChar(Len(txtText.Text)) > 0 Then A$(n) = "" dd = 0 For i3 = 1 To Len(txtText.Text) If txtText.GetLineFromChar(i3 - 1) > dd Then ' -1 обязательно, иначе может быть ошибка n = n + 1 ReDim Preserve A$(n + LINES) dd = dd + 1 End If A$(n) = A$(n) + Mid(txtText.Text, i3, 1) Next End If Loop Close #1 End Sub ' Код полосы прокрутки, его изменения не привожу - это уже не суть важно;) Сразу прошу прощения за обозначения переменных - это тоже не суть:) Осталось только одно: сделать изменять константу в зависимости от Form_Resize (соотв. и изменения размеров RichTextBox). Тут тоже есть над чем подумать.. ведь пользователь может изменить размеры уже во время выполнения кода, т.е. константа изменится. Придется переделывать массив снова. В общем, задача пока не решена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2004, 23:00 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=32461532&tid=2169851]: |
0ms |
get settings: |
6ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 350ms |

| 0 / 0 |
