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

стр.: (2) < [1] 2 >
компонетны для редактирования html
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)
А мона это только в виде проекта, а то по куску кода сложновато?

А сам чего?

User Attached Image Скачать файл
Temp.rar


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, кликнуть правой кнопкой мыши...
или так

Обновил маленько, загрузка из ресурсов и т.п.


User Attached Image Скачать файл
EditCommands.rar


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, большое спасибо за помощь.

Не за что.
стр.: (2) < [1] 2 >
Вернуться в Вопросы программирования в C++Builder