Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » *Теория*| храним форматируемый текст

Ответить
Настройки темы
*Теория*| храним форматируемый текст
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


вопрос такой: как можно быстро и удобно держать в памяти строчку форматированного текста (для последующей многократной отрисовки на DC), Строчек много, желательно экономить память. Подскажите варианты, плз.. Примеры:
1. включать в строчку управляющие символы, напр.: void <u>foo</u>(int);
2. хранить отдельно текст и его форматирование с указателями на диапазон символов.
3. хранить текст как что-то вроде метафайла (примитивами)

Отправлено: 13:33, 09-10-2006

 

Старожил


Сообщения: 435
Благодарности: 63

Профиль | Отправить PM | Цитировать


Я бы выбрал первый вариант хранения. Список возможных тегов конечен и весьма не велик. Один раз написать библиотеку для отображения и дальше можно спокойно пользоваться.
Для более полного ответа нужно знать для чего это будет использоваться и с какой частотой будет изменяться текст.

-------
black-eric.livejournal.com


Отправлено: 17:16, 09-10-2006 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


pva
Pango (отрисовщик gtk) применяет 1 и 2. То есть на вход ему можно подать текст с разметкой а-ля html, а он уже создаст внутри список атрибутов вида "символ с индексом x - символ с индексом y - атрибут такой-то". Либо можно дать неформатированный текст и самому задать список атрибутов. Отрисовывает соответственно по этому списку. Форматирование внутри строки неудобно по той причине, что при каждой отрисовке всё равно придётся парсить текст в аналог списка атрибутов. Так зачем делать одну и ту же работу дважды?

-------
http://ivank.ru

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:35, 09-10-2006 | #3


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


pva
Хранить "на каком" уровне?
Если Вы пишете, к примеру, "разукрашивальщик синтаксиса", то форматирование и текст хранятся отдельно.
Но если Вы уже имеете такой компонент, а важно лишь хранить сам текст "вообще", то... XML-лизация рулит в последнее время.

Кстати. Посмотрите, если будет время и желание, QSyntaxHightlighter (кажется так) в QT >3.1

Отправлено: 10:14, 10-10-2006 | #4

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цель: разукрасить (как в QT, Swing) текст на контролах. Например, в статус баре написать: Итого: <b>1 024,768</b> (цифра - жирным) или построить дерево классов/методов с подсветкой названий методов: void <b>function</b>(arg_type) - чтобы было лучше видно, причём использовать один и тот же подход в обоих случаях. По поводу частоты изменения текста, всё-таки думаю, что текст будет меняться не часто (т.е. это не редактор с подсветкой), но часто отрисовываться. Количество таких "строчек" может достигать 10^6. Больше - вряд ли.
Код: Выделить весь код
// для пояснения - пример варианта №1
class Graphics
{
 HDC fhandle;
 std::vector<struct format_t> fformats;
public:
 void renderText(int x, int y, const std::wstring& s)
 {
   SetTextAlign(fhandle, TA_UPDATECP|TA_BASELINE);
   MoveToEx(fhandle, x, y, 0);
   const char* pc = s.c_str();

   while(*pc)
   {
     if (pc[0]!=0x1b || pc[1]==0)
     {
      TextOut(fhandle, 0, 0, pc, 1);
      ++pc;
     }
     else
     {
       struct format_t& fmt(fformats.at(pc[1]-1));
       SetTextColor(fhandle, fmt.color);
       SelectObject(fhandle, fmt.hfont);
       pc+=2;
     }
   }
 }
}

...

void ListBox::paint(Graphics& g)
{
 // fitems[0] = "void \x1b\2foo\x1b\1(arg_type)" 
 unsigned begin = firstVisibleItem();
 unsigned end = lastVisibleItem();

 end -= begin;
 for(unsigned a=0; a<end; ++a)
 {
  g.renderText(0, (1+a)*itemHeight(), fitems[begin + a]);
 }
}
... и по поводу QSyntaxHilighter: я думал сделать что-то типа ostream, с соответствующими манипуляторами, который форматирует текст в буфер. Затем этот буфер отдавать контролу на хранение в качетстве содержимого. Вопрос в оптимальном хранении данных в буфере (быстрая отрисовка и экономия памяти)

Отправлено: 12:22, 10-10-2006 | #5


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


pva
Я имел в виду "посмотрите, как огранизован" :-) Коды открыты

Отправлено: 12:26, 10-10-2006 | #6

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Извиняюсь, стормозил. Где можно коды посмотреть? А ещё я не понял, как контрол в Qt 4.0 узнаёт, что на экране рисовать? Например QTreeView: ссылается на QAbstractItemModel, а дальше - не понятно..

Отправлено: 12:51, 10-10-2006 | #7


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


>> Где можно коды посмотреть?

Можно скачать опен-сурс
У них сейчас как раз 4.2 вышла.
http://www.trolltech.com/developer/downloads/qt/windows
Для линукса - рядом

Там \src\qt3support\text\q3syntaxhighlighter*.* AFAIK

>> А ещё я не понял, как контрол в Qt 4.0 узнаёт, что на экране рисовать?

Ух, это в двух словах не скажешь.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:17, 10-10-2006 | #8

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Спасибо, проверим

Отправлено: 14:07, 10-10-2006 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » *Теория*| храним форматируемый текст

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
*Теория* | Сокеты XPurple Программирование и базы данных 1 25-09-2006 12:05
*Теория* | Кодогенерация Vlad Drakula Программирование и базы данных 6 28-08-2006 06:49
*Теория* | Числа Фибоначчи Grub Программирование и базы данных 8 28-07-2006 14:23
*Теория* | Tree via c++ pva Программирование и базы данных 2 04-05-2005 13:34
ТЕОРИЯ german r Мобильные ОС, смартфоны и планшеты 5 07-02-2003 09:42




 
Переход