Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вставить разрыв страницы в RichEdit 
V
    Опции темы
Hukuma
Дата 16.3.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.2.2009

Репутация: нет
Всего: нет



Здравствуйте!Скажите пожалуйста,как вставить разрыв страницы в ричэдит?
PM MAIL   Вверх
Hukuma
Дата 17.3.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.2.2009

Репутация: нет
Всего: нет



Много лазил по инету,особенно по западным сайтам и кажется понял,что средствами VCL нельзя вставить разрыв страницы в RichEdit,но пишут,что это надо делать с помощью команд RTF. Но если писать так,то похоже,что получается неправильно.

Код

  RichEdit1->Text="текст на странице 1 \page текст на странице 2";
  RichEdit1->Lines->SaveToFile("Test.rtf");


В ричэдите получается такой вывод: 
Цитата
текст на странице 1 page текст на странице 2 
, а в файл текст выводится на одной странице в точно таком же виде.

хотя в (RTF) Specification ясно написано: 
Цитата
   \page    Required page break. 


мне кажется,что ведь все должно быть просто..если работает команада \n, то должна быть какая-нибудь команда для прогона всей страницы. Я пробовал в ворде вставлять разрыв,потом открывать через RTF этот файл,но там не сохраняется знак разрыва,прото стоит несколько пустых строк между текстом на разных страницах.
Ребята,очень нужна ваша помощь...




Это сообщение отредактировал(а) Hukuma - 17.3.2009, 10:43
PM MAIL   Вверх
Anikmar
Дата 17.3.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Я не нашел простого способа это сделать.
Мне вообще не нравится обработка RTF этим контролом.
Ежинственное, что я могу предложить - посмотрите исходники этого контрола, как он обрабатывает RTF.

Конечно можно все организовать через файл, но это удаление апендицита через ж...


PM MAIL ICQ   Вверх
Hukuma
Дата 17.3.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.2.2009

Репутация: нет
Всего: нет



Anikmar,все равно спасибо большое за то,что уделили время. Буду думать..
PM MAIL   Вверх
xvr
Дата 17.3.2009, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



RichEdit->Text (равно как и Lines) не работают с RTF - все, что туда попадает немедленно преобразуется в plain text. Единственное место, где вылазит на поверхность RTF - это стриминг из/в Lines.
Вставка RTF текста в RichEdit (в текущую позицию) (TPgmInsertMgr::stream_sel_to_view)
Код

struct StreamDataStruct {
 char* buf;
 int len;
};

static DWORD __stdcall RTFEditStreamCallback(DWORD_PTR dwCookie,
    LPBYTE pbBuff,
    LONG cb,
    LONG *pcb
)
{
 StreamDataStruct &S=*(StreamDataStruct*)dwCookie;
 int l=min(S.len,cb);
 memcpy(pbBuff,S.buf,l);
 S.buf+=l; S.len-=l;
 *pcb=l;
 return 0;
}

void TPgmInsertMgr::stream_sel_to_view(AnsiString buf)
{
 StreamDataStruct ds={buf.c_str(),buf.Length()};
 EDITSTREAM es={(DWORD_PTR)&ds,0,RTFEditStreamCallback};
 SendMessage(FileView->Handle,EM_STREAMIN,SF_RTF|SFF_SELECTION,(LPARAM)&es);
 if (es.dwError) error(EL_Error,"Problem setting RTF selection");
}
FileView - собственно RichEdit

PM MAIL   Вверх
Hukuma
Дата 17.3.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.2.2009

Репутация: нет
Всего: нет



xvr,извините пожалуйста,но не могли бы вы пояснить это... не понял..если можно - на простом примере, например реализация алгоритма

Код

RichEdit1->Text="текст на странице 1 \page текст на странице 2";
 RichEdit1->Lines->SaveToFile("Test.rtf");


через метод,который вы описали...был бы очень вам благодарен...
PM MAIL   Вверх
xvr
Дата 17.3.2009, 17:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Hukuma @ 17.3.2009,  16:51)
xvr,извините пожалуйста,но не могли бы вы пояснить это... не понял..если можно - на простом примере, например реализация алгоритма

Код

RichEdit1->Text="текст на странице 1 \page текст на странице 2";
 RichEdit1->Lines->SaveToFile("Test.rtf");


через метод,который вы описали...был бы очень вам благодарен...

Запросто. Пример - вставляем в начало
Код

RichEdit1->SelStart=0;
RichEdit1->SelLength=0;
stream_sel_to_view("Text on page  1 \\page Text on page 2");
С русскими буквами сложнее - они в RTF файле эскейпятся - т.е. напрямую так вставлять нельзя
Можно так:
Код

RichEdit1->SelStart=0;
RichEdit1->SelLength=0;
RichEdit1->SelText="текст на странице 1";

RichEdit1->SelStart=RichEdit1->SelStart+RichEdit1->SelLength;
RichEdit1->SelLength=0;
stream_sel_to_view(" \\page ");

RichEdit1->SelStart=RichEdit1->SelStart+RichEdit1->SelLength;
RichEdit1->SelLength=0;
RichEdit1->SelText="текст на странице 2";


PM MAIL   Вверх
Hukuma
Дата 17.3.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.2.2009

Репутация: нет
Всего: нет



xvr,огромное вам спасибо! smile
PM MAIL   Вверх
Anikmar
Дата 17.3.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Hukuma @  17.3.2009,  22:10 Найти цитируемый пост)
xvr,огромное вам спасибо!  


xvr, +1
 Сам с большим интересом ознакомился с таким методом.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.