klyaksa |
Отправлено: 22.09.2005, 13:17 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Подскажите, пжлста, компонент наподобии ричэдит только для работы с хтмл. |
|
AVC |
Отправлено: 22.09.2005, 13:51 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
TMemo |
|
klyaksa |
Отправлено: 22.09.2005, 14:04 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Т.е?
Нужно чтобы можно было редактировать текст как в ричэдит, но не в формате ртф, а в формате хтмл.
Если можно подробнее. Я почти начинающий. |
|
avc* |
Отправлено: 22.09.2005, 15:37 |
|
Не зарегистрирован
|
Вас интересует:
1. редактор html кода
2. подсветка синтаксиса
или
3. WYSIWYG технология
1 — это просто текстовый файл
2 — недавно где то здесь рекламировали компонент
3 — не интересовался, так как это "не есть хорошо" в смысле разработки и хватает готовых инструментов |
|
olegenty |
Отправлено: 22.09.2005, 15:42 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
касаемо 2 — TSynEdit. http://synedit.sourceforge.net
|
|
klyaksa |
Отправлено: 22.09.2005, 18:11 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Например, (2 части программы)
1. в текстовой файле хранятся строки текста. Эти строки одна за другой выводятся пользователю. Строки отформатированы. Строки могут содержать картинки и анимацию. Лучший вариант строки — это куски кода хтмл:
< b>бла-бла-бла< / b>
< i>бла-бла-бла< / i>
< sub>бла-бла-бла< / sub>
бла-бла-бла< картинка (файл)>бла-бла-бла
2. надо дать пользователю самому наполнить этот файл. Но пользователь не знает хтмл. Т.е. получается почти WYSIWYG технология с минимальными возможностями. Т.е есть тектовая область, пользователь написал текст, выделил, нажал кнопку Ж и текст жырный. А в файл записалось < b>бла-бла-бла< / b>.
(Ага вот пример: как форма на форуме для оставления сообщения, только форма на форме, а текст не в веб, а в файл)
компонент для 1. (статик текст) вроде нашел на http://tmssoftware.com/
Может кто чего посоветует?
Отредактировано klyaksa — 22/09/2005, 18:14 |
|
AVC |
Отправлено: 23.09.2005, 08:12 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Сделать большую жирную кнопку (с настраиваемой командой а то и несколькими) и по нажитии на нее запускать внешний html редактор. |
|
GIZMO |
Отправлено: 23.09.2005, 09:08 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (klyaksa @ 22/09/2005, 14:04) | Т.е?
Нужно чтобы можно было редактировать текст как в ричэдит, но не в формате ртф, а в формате хтмл.
Если можно подробнее. Я почти начинающий. |
TCppWebBrowser
|
|
Sergey Boyko |
Отправлено: 23.09.2005, 13:42 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 4
|
Использовать RichEdit, а при загрузке и сохранении конвертировать HTML<->RTF.
P.S.
Советую поизучать материалы сайта http://home.att.net/~robertdunn/Yacs.html, особенно рездел "Microsoft Office RTF Converters (TRtfConverter & TRtfConverterList classes)."
Отредактировано Sergey Boyko — 23/09/2005, 14:38
|
|
Guest |
Отправлено: 24.09.2005, 09:33 |
|
Не зарегистрирован
|
Это интересно, жаль что вся не по-русски. Попробую разобраться, но не знаю... Есть ли где про это по-русски? |
|
** klyaksa |
Отправлено: 24.09.2005, 17:55 |
|
Не зарегистрирован
|
Скачал TRtfConverter & TRtfConverterList classes, но он не работает. Ртф открывает, а преобразовывать не хочет. виснет.
Может кто может помочь разобраться как самому написать преобразование из ртф и хтмл. Хотя бы на простом примере... |
|
klyaksa |
Отправлено: 24.09.2005, 23:42 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Замучился компоненты искать.
Помогите, плиз, самому написать парсер rtf.
Пусть в RichEdit есть жирный и не жирный текст (остальное форматирование пока не интересует) как получить тестк типа "не жирный < b>жирный< /b>"?
Люди, не бросайте человека. Очень надеюсь на помощь.
Отредактировано klyaksa — 24/09/2005, 23:43 |
|
GIZMO |
Отправлено: 26.09.2005, 09:01 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (klyaksa @ 24/09/2005, 23:42) | Замучился компоненты искать.
Помогите, плиз, самому написать парсер rtf.
Пусть в RichEdit есть жирный и не жирный текст (остальное форматирование пока не интересует) как получить тестк типа "не жирный < b>жирный< /b>"?
Люди, не бросайте человека. Очень надеюсь на помощь. |
CODE |
...
CComQIPtr<IOleCommandTarget, &IID_IOleCommandTarget> m_spOleCmdTarg(CppWebBrowsewr1->ControlInterface);
m_spOleCmdTarg->Exec(&CGID_MSHTML, IDM_BOLD, MSOCMDEXECOPT_DODEFAULT,
NULL,
NULL);
...
|
и выделенный текст жирный, получается почти WYSIWYG технология ...
А вообще:
CODE |
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> m_spDoc(CppWebBrowsewr1->Document);
USES_CONVERSION; // Needed for the OLE2A conversion macro
BSTR bstrMode;
m_spDoc->get_designMode(&bstrMode);
char* cMode = OLE2A(bstrMode);
if (strcmp(cMode, "On"))
{
m_spDoc->put_designMode(L"On");
Button5->Caption = "On";
}
else
{
m_spDoc->put_designMode(L"Off");
Button5->Caption = "Off";
}
|
какие проблемы?
Отредактировано GIZMO — 26/09/2005, 09:02
|
|
klyaksa |
Отправлено: 26.09.2005, 16:35 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
А мона это только в виде проекта, а то по куску кода сложновато? |
|
GIZMO |
Отправлено: 27.09.2005, 10:19 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (klyaksa @ 26/09/2005, 16:35) | А мона это только в виде проекта, а то по куску кода сложновато? |
А сам чего?
|
|
klyaksa |
Отправлено: 28.09.2005, 15:44 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
А как туда рисунки запихивать? |
|
GIZMO |
Отправлено: 29.09.2005, 10:14 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (klyaksa @ 28/09/2005, 15:44) | А как туда рисунки запихивать? |
В режиме designMode On, кликнуть правой кнопкой мыши...
или так
CODE |
CComQIPtr<IOleCommandTarget, &IID_IOleCommandTarget> m_spOleCmdTarg(WB->ControlInterface);
WideString wsImage = ExtractFilePath(Application->ExeName) + "\\52.jpg";
//à âîò òàê íå õî÷åò...
//â ôàéëå ðåñóðñîâ ä.á. ñòðîêà: 52.JPG RC_DATA "52.jpg"
//íî êîìïèëëÿòîð ðåñóðñîâ îòêàçûâàåòñÿ ïðèíèìàòü òî÷êó â 52.JPG, à WebBrowserControl, áåç ðàñøèðåíèÿ íå ïîíèìàåò
//âûâîäû: — íàäî ïðàâèòü â ñêîìïèëèðîâàííîì åõå èëè êîìïèëèòü êîìïèëëÿòîðîì ðåñóðñîâ èç VC++
//WideString wsImage = WideString("res://") + ExtractFilePath(Application->ExeName) + WideString("/52");
VARIANT vImage;
vImage.vt = VT_BSTR;
vImage.bstrVal = wsImage.c_bstr();
m_spOleCmdTarg->Exec(&CGID_MSHTML,
IDM_IMAGE,
Shdocvw_tlb::MSOCMDEXECOPT_DONTPROMPTUSER,
&vImage,
NULL);
|
|
|
GIZMO |
Отправлено: 29.09.2005, 11:46 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (GIZMO @ 29/09/2005, 10:14) | QUOTE (klyaksa @ 28/09/2005, 15:44) | А как туда рисунки запихивать? |
В режиме designMode On, кликнуть правой кнопкой мыши...
или так
|
Обновил маленько, загрузка из ресурсов и т.п.
|
|
klyaksa |
Отправлено: 29.09.2005, 17:07 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
А как запихивать в wb свои строки? И извлекать созданные тела из wb?
Не могли бы провести теоретический ликбез, чтобы было понятна каждая строка кода..., параметры функций и т.д. Или что (и где) можно почитать по этому поводу.
Спасибо за помощь, как раз то, что надо. |
|
klyaksa |
Отправлено: 29.09.2005, 23:40 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Еще возникла пара вопросов:
1. Как сделать чтобы при нажатии enter нач. новый абзац, а не переключался режим?
2. Как изменить меню появл. при нажатии правой кнопки. |
|
GIZMO |
Отправлено: 30.09.2005, 08:35 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE |
1. Как сделать чтобы при нажатии enter нач. новый абзац, а не переключался режим?
|
Фокус с кнопки убери ... например:
CODE |
void __fastcall TForm1::Button5Click(TObject *Sender)
{
...
Edit1->SetFocus();
}
|
QUOTE |
2. Как изменить меню появл. при нажатии правой кнопки.
|
http://msdn.microsoft.com/workshop/browser...stomization.asp
см. IDocHostUIHandler::ShowContextMenu + ICustomDoc
|
|
GIZMO |
Отправлено: 30.09.2005, 09:01 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE |
А как запихивать в wb свои строки? И извлекать созданные тела из wb?
|
IHTMLDocument2::write, IHTMLDocument2::toString
http://msdn.microsoft.com/workshop/browser...2/document2.asp
например вставить таблицу:
CODE |
TStringStream *str = new TStringStream("");
str->WriteString("<html>\n");
str->WriteString("<head><title>");
str->WriteString("Заголовок");
str->WriteString("</title></head>\n");
str->WriteString("<body>\n");
str->WriteString("<table border=\"1\" cellpadding=\"5\"cellspacing=\"0\">\n");
str->WriteString(" <tr>\n");
str->WriteString(" <td>\n");
str->WriteString(" ");
str->WriteString(String("Значение 1") + "\n");
str->WriteString(" </td>\n");
str->WriteString(" </tr>\n");
str->WriteString(" <tr>\n");
str->WriteString(" <td>\n");
str->WriteString(" ");
str->WriteString(String("Значение 2") + "\n");
str->WriteString(" </td>\n");
str->WriteString(" </tr>\n");
str->WriteString("</table>");
str->WriteString("</body>\n");
str->WriteString("</html>");
LPDISPATCH DocDispatch = WB->ControlInterface->get_Document();
if (!DocDispatch)
{
return;
}
IHTMLDocument2 *docInterface;
HRESULT hr = S_OK;
hr = DocDispatch->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&docInterface);
if (!SUCCEEDED(hr))
{
return;
}
VARIANT *param;
SAFEARRAY *sfArray;
sfArray = SafeArrayCreateVector(VT_VARIANT, 0, 1);
if (sfArray)
{
SafeArrayAccessData(sfArray, (LPVOID*) ¶m);
param->vt = VT_BSTR;
param->bstrVal = WideString(str->DataString);
SafeArrayUnaccessData(sfArray);
docInterface->write(sfArray);
SafeArrayDestroy(sfArray);
}
delete str;
|
это в целом в документ, но каждый тэг представлен своим интерфейсом и у него есть индивидуальные методы для заполнения. Например IHTMLTextAreaElement::value и т.п.
QUOTE |
Не могли бы провести теоретический ликбез, чтобы было понятна каждая строка кода..., параметры функций и т.д. Или что (и где) можно почитать по этому поводу.
|
Нет не могу, работать надо. Ссылки дал. Там все есть.
|
|
Guest |
Отправлено: 30.09.2005, 21:08 |
|
Не зарегистрирован
|
2GIZMO
А можно ли вставить таблицу в документ таким же способом, как вы вставляли рисунок в своем примере (m_spOleCmdTarg->Exec), а не прописывая все теги для таблицы? |
|
** klyaksa |
Отправлено: 01.10.2005, 07:51 |
|
Не зарегистрирован
|
А зачем заморочки с массивами при запихивании текста в браузер? Как-то запутано. |
|
GIZMO |
Отправлено: 01.10.2005, 18:18 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (Guest @ 30/09/2005, 21:08) | 2GIZMO
А можно ли вставить таблицу в документ таким же способом, как вы вставляли рисунок в своем примере (m_spOleCmdTarg->Exec), а не прописывая все теги для таблицы? |
хз...посмотри mshtmcid.h
|
|
Guest |
Отправлено: 02.10.2005, 18:13 |
|
Не зарегистрирован
|
2GIZMO
QUOTE | посмотри mshtmcid.h |
Это я сделал первым делом. Там есть консанты IDM_TABLE и IDM_TABLEINSERT, но их использование при вызове метода exec ничего не дало. В MSDN эти константы я не нашел. |
|
GIZMO |
Отправлено: 03.10.2005, 09:12 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (Guest @ 02/10/2005, 18:13) | 2GIZMO
QUOTE | посмотри mshtmcid.h |
Это я сделал первым делом. Там есть консанты IDM_TABLE и IDM_TABLEINSERT, но их использование при вызове метода exec ничего не дало. В MSDN эти константы я не нашел. |
Думаю в 4-ый параметр надо передать, что-то...
Exec(
const GUID *pguidCmdGroup, // Pointer to command group
DWORD nCmdID, // Identifier of command to execute
DWORD nCmdExecOpt, // Options for executing the command
VARIANTARG *pvaIn, // Pointer to input arguments
VARIANTARG *pvaOut // Pointer to command output
);
а что Я не знаю...
|
|
GIZMO |
Отправлено: 04.10.2005, 10:09 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (GIZMO @ 03/10/2005, 09:12) | Думаю в 4-ый параметр надо передать, что-то...
Exec(
const GUID *pguidCmdGroup, // Pointer to command group
DWORD nCmdID, // Identifier of command to execute
DWORD nCmdExecOpt, // Options for executing the command
VARIANTARG *pvaIn, // Pointer to input arguments
VARIANTARG *pvaOut // Pointer to command output
);
а что Я не знаю... |
А передать туда наверное надо шаблон типа как в print template с описанием структуры стилей и.т.п. геморой не меньший, вот еще вариант:
CODE |
void __fastcall TForm1::AddTable(short cols, short rows)
{
if ((cols <= 0) || (rows <= 0))
return;
LPDISPATCH DocDispatch = WB->ControlInterface->get_Document();
if (!DocDispatch)
{
return;
}
IHTMLDocument2 *spDoc;
HRESULT hr = S_OK;
hr = DocDispatch->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&spDoc);
if (!SUCCEEDED(hr))
{
return;
}
//Create table
CComPtr<IHTMLTable> spTable;
CComPtr<IHTMLElement> spElm;
spDoc->createElement(CComBSTR(OLESTR("TABLE")), &spElm);
spElm->QueryInterface(IID_IHTMLTable, (LPVOID*)&spTable);
//insert row
for (int r = 0; r < rows; r++)
{
CComPtr<IHTMLTableRow> spRow;
spTable->insertRow(r, (IDispatch**)&spRow);
for (int c = 0; c < cols; c++)
{
CComPtr<IHTMLTableCell> spCell;
spRow->insertCell(c, (IDispatch**)&spCell);
}
}
//Add other attributes to current table
VARIANT vBorder;
vBorder.vt = VT_BSTR;
vBorder.bstrVal = WideString("2");
if (FAILED(spTable->put_border(vBorder)))
return;
//Add table where the cursor is
CComPtr<IHTMLSelectionObject> spSelObj;
spDoc->get_selection(&spSelObj);
CComPtr<IHTMLTxtRange> spTxtRng;
spSelObj->createRange((IDispatch**)&spTxtRng);
BSTR tableHtml;
spElm->get_outerHTML(&tableHtml);
spTxtRng->pasteHTML(tableHtml);
SysFreeString(tableHtml);
}
|
тоже не простой, но показательный — похоже что так можно создать любой
объект ...
|
|
Guest |
Отправлено: 05.10.2005, 19:56 |
|
Не зарегистрирован
|
GIZMO, большое спасибо за помощь. |
|
GIZMO |
Отправлено: 06.10.2005, 08:08 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (Guest @ 05/10/2005, 19:56) | GIZMO, большое спасибо за помощь. |
Не за что.
|
|