//---------------------------------------------------------------------------
void __fastcall TForm1::FillForm()
{
TCppWebBrowser *newBrowser;
newBrowser = Browser1;
LPDISPATCH DocDispatch_2 = newBrowser->ControlInterface->get_Document();
IHTMLDocument2 *HTMLDocument = NULL;
if(!newBrowser->Busy && newBrowser->Document && AnsiString(newBrowser->LocationURL) != "about :blank" &&
SUCCEEDED(newBrowser->Document->QueryInterface( IID_IHTMLDocument2, (LPVOID*)&HTMLDocument)))
{
wchar_t *wstr;
WideString wstr1;
WideString wstr2 = "submit";
WideString wstr3 = "reset";
WideString wstr12 = "<SELECT name=namelist> <OPTION value=0 selected></OPTION><OPTION value=1>pole_1</OPTION> <OPTION value=2>pole_2</OPTION><OPTION value=3>pole_3</OPTION></SELECT>";
IHTMLElementCollection* pElements;
IHTMLElement *pElem;
IHTMLSelectionObject *spSelObj = NULL;
IHTMLTxtRange *spTxtRng = NULL;
IHTMLInputElement *pInput = NULL;
HTMLDocument->get_all(&pElements);
long plongnumberofelements;
HRESULT hr3 = pElements->get_length( &plongnumberofelements);
if ( hr3 == S_OK )
for ( int i=0; i < plongnumberofelements; i++ )
{
VARIANT varIndex;
varIndex.vt = VT_UINT;
varIndex.lVal = i;
VARIANT var2;
VariantInit( &var2 );
IDispatch* pDisp;
pElements->item( varIndex, var2, &pDisp );
if ( SUCCEEDED ( pDisp -> QueryInterface ( IID_IHTMLInputElement, ( LPVOID* )&pInput ) ) && pInput )
{
pInput->get_type(&wstr1);
pInput->get_name(&wstr);
if (wstr1!= wstr2 && wstr1!= wstr3)
{
pInput -> put_value ( wstr );
// Здесь добавляется мой Лист бокс
HTMLDocument->get_selection(&spSelObj);
spSelObj->createRange((IDispatch**)&spTxtRng);
spTxtRng->pasteHTML(wstr12);
spTxtRng->put_text(WideString("(") + wstr + WideString(")\n"));
}
}
}
spTxtRng->Release();
spSelObj->Release();
}
}
//---------------------------------------------------------------------------
CppWebBrowser, заполнение форм, добавить свой ListBox рядом с элементами формы
Вопрос в следующем:
Как можно вставлять с определенными данными свой ListBox в форму рядом с элементами
InputElement и TextAreaElement?
Т.е. загружается в CppWebBrowser HTML страница с формой и по нажатии
клавиши появляется с определенными данными ListBox под InputElement
или рядом в зависимости от кучности элементов в форме...
Заранее спасибо.
Вопрос в следующем:
Как можно вставлять с определенными данными свой ListBox в форму рядом с элементами
InputElement и TextAreaElement?
Т.е. загружается в CppWebBrowser HTML страница с формой и по нажатии
клавиши появляется с определенными данными ListBox под InputElement
или рядом в зависимости от кучности элементов в форме...
Заранее спасибо.[/QUOTE]
Если я правильно понял вопрос - ты хочешь в код страницы его добавить? Тогда только ответ очевиден - переформировать страницу - т.е. загрузить страницу - парсить ее и добавлять необходимые элементы. Тогда возможно будет проще получать страницу через обычный сокет, в в компоненте показывать уже готовую страницу.
Другой способ - создать фрейм (или просто форму) с нужными тебе элементами и всплывать над нужной тебе страницей. По идее это будет проще и корректней.
[/QUOTE]
Спасибо но код страницы меня не интересует.
[QUOTE=kot_]
Тогда только ответ очевиден - переформировать страницу - т.е. загрузить страницу - парсить ее и добавлять необходимые элементы.
[/QUOTE]
Помнится мне в самом начале предлагали парсить страницу когда мне нужно было заполнять поля формы... но меня это не устраивает и я заполняю форму без всякого парсинга через QueryInterface, pHTMLDocument и put_value...
Аналогичным образом хотелось бы и добавлять один единственный листбок рядом с элементами InputElement и TextAreaElement.
Помнится мне в самом начале предлагали парсить страницу когда мне нужно было заполнять поля формы... но меня это не устраивает и я заполняю форму без всякого парсинга через QueryInterface, pHTMLDocument и put_value...
[/QUOTE]
Помнится у Мольера один из героев был удивлен что он говорит прозой :)
[QUOTE=creater]
Аналогичным образом хотелось бы и добавлять один единственный листбок рядом с элементами InputElement и TextAreaElement.[/QUOTE]
Ну так и добавляй - ты же получаешь список элементов страницы - все что тебе нужно найти интерфейс который ты можешь для этого вызвать - если таковой существует. Поищи среди СОМ-обектов офиса.
[/QUOTE]
Извлеки всю страницу в буфер (...через QueryInterface, pHTMLDocument),
распарси вставь в нужное место нужный ТЭГ и загони все обратно через pHTMLDocument->write().
[QUOTE=creater]
Аналогичным образом хотелось бы и добавлять один единственный листбок рядом с элементами InputElement и TextAreaElement.[/QUOTE]
И кто тебе мешает? См. MSDN:
Создание элемента - IHTMLElement, IHTMLDocument2::createElement;
Вставка "в нужное место" - IHTMLSelectionObject, IHTMLTxtRange.
P.S. Что-то по CppWebBrowser стало много вопросов? Что делать?
P.S.S. Стало красиво, но немного не привычно.
распарси вставь в нужное место нужный ТЭГ и загони все обратно через pHTMLDocument->write().
И кто тебе мешает? См. MSDN:
Создание элемента - IHTMLElement, IHTMLDocument2::createElement;
Вставка "в нужное место" - IHTMLSelectionObject, IHTMLTxtRange.
[/QUOTE]
Спасибо, уже ближе кистине, я вообще расчитывал на хоть какой-нибудь пример в виде кода т.к. сабжем раньше не приходилось сталкиваться.
[QUOTE=GIZMO]
P.S. Что-то по CppWebBrowser стало много вопросов? Что делать?
P.S.S. Стало красиво, но немного не привычно.[/QUOTE]
Ну так Веб кругом... ;-)
К сожалению конкретно для твоего случая ничего нет, надо писать, а это сам понимаешь ... минимум "FAX de Luxe" емкостью 1 л. :)
На данный момент удалось добавить свой ЛистБокс но, он почему то появляется не рядом с IID_IHTMLInputElement а в левом верхнем углу html страницы.
Делаю так:
Код:
На данный момент удалось добавить свой ЛистБокс но, он почему то появляется не рядом с IID_IHTMLInputElement а в левом верхнем углу html страницы.
Делаю так:
Код:
//---------------------------------------------------------------------------
void __fastcall TForm1::FillForm()
{
TCppWebBrowser *newBrowser;
newBrowser = Browser1;
LPDISPATCH DocDispatch_2 = newBrowser->ControlInterface->get_Document();
IHTMLDocument2 *HTMLDocument = NULL;
if(!newBrowser->Busy && newBrowser->Document && AnsiString(newBrowser->LocationURL) != "about :blank" &&
SUCCEEDED(newBrowser->Document->QueryInterface( IID_IHTMLDocument2, (LPVOID*)&HTMLDocument)))
{
wchar_t *wstr;
WideString wstr1;
WideString wstr2 = "submit";
WideString wstr3 = "reset";
WideString wstr12 = "<SELECT name=namelist> <OPTION value=0 selected></OPTION><OPTION value=1>pole_1</OPTION> <OPTION value=2>pole_2</OPTION><OPTION value=3>pole_3</OPTION></SELECT>";
IHTMLElementCollection* pElements;
IHTMLElement *pElem;
IHTMLSelectionObject *spSelObj = NULL;
IHTMLTxtRange *spTxtRng = NULL;
IHTMLInputElement *pInput = NULL;
HTMLDocument->get_all(&pElements);
long plongnumberofelements;
HRESULT hr3 = pElements->get_length( &plongnumberofelements);
if ( hr3 == S_OK )
for ( int i=0; i < plongnumberofelements; i++ )
{
VARIANT varIndex;
varIndex.vt = VT_UINT;
varIndex.lVal = i;
VARIANT var2;
VariantInit( &var2 );
IDispatch* pDisp;
pElements->item( varIndex, var2, &pDisp );
if ( SUCCEEDED ( pDisp -> QueryInterface ( IID_IHTMLInputElement, ( LPVOID* )&pInput ) ) && pInput )
{
pInput->get_type(&wstr1);
pInput->get_name(&wstr);
if (wstr1!= wstr2 && wstr1!= wstr3)
{
pInput -> put_value ( wstr );
// Здесь добавляется мой Лист бокс
HTMLDocument->get_selection(&spSelObj);
spSelObj->createRange((IDispatch**)&spTxtRng);
spTxtRng->pasteHTML(wstr12);
spTxtRng->put_text(WideString("(") + wstr + WideString(")\n"));
}
}
}
spTxtRng->Release();
spSelObj->Release();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FillForm()
{
TCppWebBrowser *newBrowser;
newBrowser = Browser1;
LPDISPATCH DocDispatch_2 = newBrowser->ControlInterface->get_Document();
IHTMLDocument2 *HTMLDocument = NULL;
if(!newBrowser->Busy && newBrowser->Document && AnsiString(newBrowser->LocationURL) != "about :blank" &&
SUCCEEDED(newBrowser->Document->QueryInterface( IID_IHTMLDocument2, (LPVOID*)&HTMLDocument)))
{
wchar_t *wstr;
WideString wstr1;
WideString wstr2 = "submit";
WideString wstr3 = "reset";
WideString wstr12 = "<SELECT name=namelist> <OPTION value=0 selected></OPTION><OPTION value=1>pole_1</OPTION> <OPTION value=2>pole_2</OPTION><OPTION value=3>pole_3</OPTION></SELECT>";
IHTMLElementCollection* pElements;
IHTMLElement *pElem;
IHTMLSelectionObject *spSelObj = NULL;
IHTMLTxtRange *spTxtRng = NULL;
IHTMLInputElement *pInput = NULL;
HTMLDocument->get_all(&pElements);
long plongnumberofelements;
HRESULT hr3 = pElements->get_length( &plongnumberofelements);
if ( hr3 == S_OK )
for ( int i=0; i < plongnumberofelements; i++ )
{
VARIANT varIndex;
varIndex.vt = VT_UINT;
varIndex.lVal = i;
VARIANT var2;
VariantInit( &var2 );
IDispatch* pDisp;
pElements->item( varIndex, var2, &pDisp );
if ( SUCCEEDED ( pDisp -> QueryInterface ( IID_IHTMLInputElement, ( LPVOID* )&pInput ) ) && pInput )
{
pInput->get_type(&wstr1);
pInput->get_name(&wstr);
if (wstr1!= wstr2 && wstr1!= wstr3)
{
pInput -> put_value ( wstr );
// Здесь добавляется мой Лист бокс
HTMLDocument->get_selection(&spSelObj);
spSelObj->createRange((IDispatch**)&spTxtRng);
spTxtRng->pasteHTML(wstr12);
spTxtRng->put_text(WideString("(") + wstr + WideString(")\n"));
}
}
}
spTxtRng->Release();
spSelObj->Release();
}
}
//---------------------------------------------------------------------------
Думаю, что при переборе елементов формы выделение так и остается в начале документа. Надо как-то перести его на/за "нужный" тебе инпут и тогда уже получать IHTMLSelectionObject (только как это сделать к сожалению сейчас не подскажу). Еще в цикле надо делать pInput -> Release(); и для IDispatch тоже.
Посмотри IHTMLTxtRang::moveToBookmark(...), IHTMLTxtRange::findText(...), IHTMLTxtRange::select() может чего придумаешь.