C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ПОМОГИТЕ!!! RxRichEdit ДОБИЛ МЕНЯ!!!!, Копирование RTF в RxRichEdit
mxn
  Отправлено: 12.01.2006, 10:02


Ученик-кочегар

Группа: Участник
Сообщений: 12



Уважаемые ГУРУ!!! ПОМОГИТЕ!!!

Проблема такова: есть форма, на ней RxRichEdit_1 и RxRichEdit_2. Надо скопировать текст из RxRichEdit_2 в RxRichEdit_1 С СОХРАНЕНИЕМ ФОРМАТИРОВАНИЯ и таким образом, что б в RxRichEdit_1 текст ДОБАВИЛСЯ в конец уже существующего в нем ФОРМАТИРОВАННОГО текста!!! А так же надо что б в RxRichEdit_1 можно было ДОБАВИТЬ форматированный текст из полученного со стороны TMemoryStream.

Решение есть, но оно ужасно... Я копирую текст из RxRichEdit_2 в буфер обмена и вставляю в RxRichEdit_1 из буфера обмена. Форматирование при этом сохраняется. А как засунуть полученный TMemoryStream в буфер обмена в виде RTF я не знаю, поэтому приделал RxRichEdit_3 (Visible = false) и делаю LoadFromStream в него, оттуда в буфер обмена и в RxRichEdit_1. Но это же УЖАС! Про оптимальность я молчу, конечно же... но даже пользовательские данные теряются в буфере обмена (если таковые там есть) + очень не желательно что б вся инфа оседала в прогах-следилках за буфером обмена...

ЛЮДИ,  — сутки сидел, ночь не спал — ПОМОГИТЕ!!!!!!!!!!! Может кто-то уже решал подобную задачу человеческим способом!?!?!?!?!?!?!?
mxn
Отправлено: 12.01.2006, 16:49


Ученик-кочегар

Группа: Участник
Сообщений: 12



Битва продолжалась... :-) Вот так работает. То есть текст переносится с сохранением форматирования. Таким же образом можно вставлять полученный откуда-то TStringStream :

void __fastcall TForm1::Button1Click(TObject *Sender)
{

String tmp;

TStringStream *R1_S = new TStringStream("");
TStringStream *R2_S = new TStringStream("");

RxRichEdit_1->Lines->SaveToStream(R1_S);
RxRichEdit_2->Lines->SaveToStream(R2_S);

tmp = R1_S->DataString;

R1_S->Position = 0;


// tmp.Delete(tmp.Length()-2, 2); // Не знаю как правильно
// tmp.Insert("par par par ", tmp.Length()); // Не знаю как правильно

tmp.Insert(R2_S->DataString, tmp.Length());


//ShowMessage(tmp); //Здесь можно увидеть объедененные строки в RTF

R1_S->WriteString(tmp);

R1_S->Position = 0;

RxRichEdit_1->Lines->LoadFromStream(R1_S);

delete R1_S;
delete R2_S;

НО! В двух стоках tmp.Delete и tmp.Insert надо что-то удалить и что-то добавить, согласно правилам RTF-формата. Только тогда будет настоящее объеденение. Сейчас RxRichEdit просто не показывает вторую часть...

Может кто знает что надо удалить/вставить в конец одного RTF, что б можно было прикрутить к нему второй ???
AVC
Отправлено: 13.01.2006, 09:27


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Может кто знает что надо удалить/вставить в конец одного RTF, что б можно было прикрутить к нему второй ???

Очень подозреваю, что эта операция будет работать не корректно, так как rtf желательно объединять разумно, но можно попробовать следующее: убираем фигурную скобку в конце первого rtf, убираем открывающую фигурную скобку и заголовок в начале второго rtf ({\rtf1), дописавем 2 в 1. По крайней мере быстрый тест в простом редакторе показал дееспособность полученного файла.

Варант 2 — поискать на msdn функцию, которая сама грамотно сливает два rtf.

Вернуться в Вопросы программирования в C++Builder