Gotica |
Отправлено: 15.02.2005, 14:10 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 9
|
Программное заполнение HTML формы. С помощью следующего кода можно программно заполнить поля HTML форм и программно нажать Submit. Но не могу понять, почему данный код наотрез отказывается заполнять поля типа TEXTAREA.
CODE | // Upload file to server
void __fastcall TFMain::bUploadClick(TObject *Sender)
{
AnsiString slHtmlFormName = "UploadForm"; // <form name="UploadForm"...
IHTMLDocument2 *pHTMLDocument = NULL;
if(SUCCEEDED(CppWebBrowser->Document->QueryInterface(
IID_IHTMLDocument2, (LPVOID*)&pHTMLDocument)))
{
if(pHTMLDocument != NULL)
{
IHTMLElementCollection *pAll = NULL;
if(SUCCEEDED(pHTMLDocument->get_all(&pAll)) && pAll)
{
TVariant vName="userfile", vName2 = "passwd", vName0 = "MAX_FILE_SIZE";
TVariant vIndex=0;
// put into hidden field <hidden...
IDispatch *pDisp0=NULL;
if(SUCCEEDED(pAll->item(vName0, vIndex, &pDisp0)) && pDisp0)
{
IHTMLInputHiddenElement *pSize = NULL;
if(SUCCEEDED(pDisp0->QueryInterface(IID_IHTMLInputHiddenElement,
(LPVOID*)&pSize)) && pSize)
{
pSize->put_value(WideString("150000"));
pSize->Release();
}
pDisp0->Release();
}
// paste into file field <file...
IDispatch *pDisp=NULL;
if(SUCCEEDED(pAll->item(vName, vIndex, &pDisp)) && pDisp)
{
IHTMLInputFileElement* pFile = NULL;
if(SUCCEEDED(pDisp->QueryInterface(IID_IHTMLInputFileElement,
(LPVOID*)&pFile)) && pFile)
{
// Copy Full FileName To Clipboard
Clipboard()->SetTextBuf(sFile.c_str());
pFile->select();
// Paste from ClipBoard to "userfile"
CppWebBrowser->ControlInterface->ExecWB(Shdocvw_tlb::OLECMDID_PASTE,
Shdocvw_tlb::OLECMDEXECOPT_DODEFAULT, Variant("userfile"));
pFile->Release();
}
pDisp->Release();
}
// put into input element <input...
IDispatch *pDisp2=NULL;
if(SUCCEEDED(pAll->item(vName2, vIndex, &pDisp2)) && pDisp2)
{
IHTMLInputElement *pInput = NULL;
if(SUCCEEDED(pDisp2->QueryInterface(IID_IHTMLInputElement,
(LPVOID*)&pInput)) && pInput)
{
pInput->put_value(WideString("if5edU7dk4"));
pInput->Release();
}
pDisp2->Release();
}
}
pAll->Release();
}
// click SUBMIT()
IHTMLElementCollection *HTMLForms = NULL;
if(SUCCEEDED(pHTMLDocument->get_forms(&HTMLForms)) && HTMLForms)
{
// slHtmlFormName <form name="UploadForm"...>
TVariant vName3 = slHtmlFormName;
TVariant vIndex3 = 0;
IDispatch *pDisp3 = NULL;
if(SUCCEEDED(HTMLForms->item(vName3, vIndex3, &pDisp3)) && pDisp3)
{
IHTMLFormElement *HTMLForm = NULL;
if(SUCCEEDED(pDisp3->QueryInterface(IID_IHTMLFormElement,
(LPVOID*)&HTMLForm)) && HTMLForm)
{
HTMLForm->submit(); // нажимаем кнопку submit
HTMLForm->Release();
}
pDisp3->Release();
}
HTMLForms->Release();
}
pHTMLDocument->Release();
}
} |
Отредактировано Gotica — 15/02/2005, 15:42 |
|
Aptem |
Отправлено: 15.02.2005, 19:07 |
|
Мастер участка
Группа: Участник
Сообщений: 349
|
Для textarea нужно использовать тип IHTMLTextAreaElement
CODE |
if ( SUCCEEDED ( pAll -> item ( vName1, vIndex, &pDisp1 ) ) && pDisp1 )
{
IHTMLTextAreaElement *pInput = NULL;
if ( SUCCEEDED ( pDisp1 -> QueryInterface ( IID_IHTMLTextAreaElement, ( LPVOID* )&pInput ) ) && pInput )
{
pInput -> put_value ( Data );
pInput -> Release ();
}
pDisp1 -> Release ();
} |
|
|
Gotica |
Отправлено: 15.02.2005, 23:13 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 9
|
Спасибо! |
|
Gotica |
Отправлено: 15.02.2005, 23:59 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 9
|
Ещё один вопрос по этому коду. Как инициализировать форму, если в HTML коде не задано имя этой формы. Просто, например, CODE | <FORM action=/add.xml method=post> | без всяких ? В этом случае Submit программно нажиматься не будет. Подскажите, пожалуйста как поступить в таком случае.
Отредактировано Gotica — 16/02/2005, 01:03 |
|
GIZMO |
Отправлено: 16.02.2005, 11:03 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (Gotica @ 16/02/2005, 01:01) | Ещё один вопрос по этому коду. Как инициализировать форму, если в HTML коде не задано имя этой формы. Просто, например, CODE | <FORM action=/add.xml method=post> | без всяких ? В этом случае Submit программно нажиматься не будет. Подскажите, пожалуйста как поступить в таком случае. |
CODE |
...
TVariant vName3(IndexForm-ы); // = slHtmlFormName;
TVariant vIndex3; // = 0;
IDispatch *pDisp3 = NULL;
if(SUCCEEDED(HTMLForms->item(vName3, vIndex3, &pDisp3)) && pDisp3)
...
|
1. Первый параметр это либо индекс (VT_I4) , либо имя (VT_BSTR).
2. Можно перебрать все формы в колл. и распознать свою по какому-либо (...набору каких-либо) элементу. Типа: vName2 = "passwd"
Осторожно! С IE работаю вторую неделю.
|
|
Aptem |
Отправлено: 16.02.2005, 15:03 |
|
Мастер участка
Группа: Участник
Сообщений: 349
|
Gizmo говорит абсолютно правильно!
Если нет имени формы, то можно пользоваться ее индексом, то есть если на странице 3 формы, то у первой формы индекс будет = 0, у второй 1 и у третьей 2.
Только нужно быть осторожным, вот НЕПРАВИЛЬНЫЙ ПРИМЕР:
CODE | TVariant vName3 = "";
TVariant vIndex3 = 0;
IDispatch *pDisp3 = NULL;
if ( SUCCEEDED ( HTMLForms -> item ( vName3, vIndex3, &pDisp3 ) ) && pDisp3 )
{
IHTMLFormElement *HTMLForm = NULL;
if ( SUCCEEDED ( pDisp3 -> QueryInterface ( IID_IHTMLFormElement, ( LPVOID* )&HTMLForm ) ) && HTMLForm )
{
HTMLForm -> submit ();
HTMLForm -> Release ();
}
pDisp3 -> Release ();
} |
А вот ПРАВИЛЬНЫЙ ПРИМЕР:
CODE | TVariant vName3;
TVariant vIndex3 = 0;
IDispatch *pDisp3 = NULL;
if ( SUCCEEDED ( HTMLForms -> item ( vName3, vIndex3, &pDisp3 ) ) && pDisp3 )
{
IHTMLFormElement *HTMLForm = NULL;
if ( SUCCEEDED ( pDisp3 -> QueryInterface ( IID_IHTMLFormElement, ( LPVOID* )&HTMLForm ) ) && HTMLForm )
{
HTMLForm -> submit ();
HTMLForm -> Release ();
}
pDisp3 -> Release ();
} |
Отличие в том, что если инициализировать переменную TVariant vName3 = "", то будет искаться форма с именем name="", поэтому оставляем переменную не инициализированную.
|
|
Gotica |
Отправлено: 16.02.2005, 17:21 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 9
|
А теперь большое спасибо! |
|
|