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

 
Программное заполнение HTML формы, отказывается заполнять поля типа TEXTARE
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>
без всяких
CODE
<FORM name=
? В этом случае 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>
без всяких
CODE
<FORM name=
? В этом случае 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



А теперь большое спасибо!

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