From: Jingcheng on
IHTMLInputElement::put_value doesn't set editbox value?


I want to set a the editbox in a html-form.
IHTMLInputElement::put_value returns S_OK, but the text of the
editbox is not set, instead it's just cleared. Can you please help me
take a look?

The following is my C++ code:

CString filename = _T("C:\\temp\\test.htm");

_variant_t varFlags(0L);
_variant_t varMissing(0L);
m_browser.Navigate(filename, &varFlags, &varMissing, &varMissing,
&varMissing);

LPUNKNOWN lpUnk = m_browser.GetControlUnknown();
IWebBrowser2Ptr ipWebCtrl(lpUnk);

VARIANT_BOOL bBusy = VARIANT_TRUE;
while (bBusy == VARIANT_TRUE)
ipWebCtrl->get_Busy(&bBusy);

IDispatchPtr ipDispatch;
HRESULT hr = ipWebCtrl->get_Document(&ipDispatch);

IHTMLDocument2Ptr ipHtmlDoc2(ipDispatch);
if (!ipHtmlDoc2)
return;

IHTMLElementCollectionPtr ipElements;
ipHtmlDoc2->get_all(&ipElements);

if (!ipElements)
return;

long count = 0;
ipElements->get_length(&count);

for(long i = 0; i < count; i++)
{
LPDISPATCH lpItem;
ipElements->item(CComVariant(i), CComVariant(i), &lpItem);

IHTMLInputElementPtr ipInput(lpItem);
if(!ipInput)
continue;

// Edit-Field?
BSTR bstrType;
ipInput->get_type(&bstrType);
if (CString(bstrType) == "text")
{ // Fill in Text
CString sTemp (_T("TestVal"));
BSTR bstrNewValue = sTemp.AllocSysString ();
ipInput->put_value (bstrNewValue);
SysFreeString(bstrNewValue);
}
}

The following is my test.htm:

<html>

<head>
</head>

<body>

<script language="JScript"><!--
function GoNext()
{
id = document.all.userID.value;
window.external.GoNext("$#pageName:#UserIDPage.htm$#userID:#" + id +
"$#");
}
//--></script>

<table border="0" width="60%" align="center">
<tr>
<td width="100%">

<form>
<p><input type="text" name="myEditBox" size="20"> Edit</p>
</form>
<form>
<p><input type="checkbox" name="myCheck1" value="ON">
Chk1&nbsp;&nbsp;&nbsp;
<input type="checkbox" name="myCheck2" value="ON"
checked>Chk2&nbsp;&nbsp;&nbsp;&nbsp;
<input type="checkbox" name="myCheck3" value="ON">Chk3</p>
</form>
<form">
<p><input type="radio" value="V1" checked name="myRadio"> Op1&nbsp;
<input type="radio" name="myRadio" value="V2">
Op2&nbsp;&nbsp; <input type="radio" name="myRadio" value="V3">Op3</
p>
</form>
<form>
<p><select size="1" name="myDropDown">
<option selected>Sel 1</option>
<option>Sel 2</option>
<option>Sel 3</option>
</select> Sel</p>
</form>

<form>
<p align="center"><input type="text" name="userID" size="20"></p>
</form>

<form>
<p align="center"><input type="button" onclick="GoNext();"
value="Next >>" name="NextBtn"></p>
</form>

</td>
</tr>
</table>

</body>

</html>
From: Hector Santos on
Two things:

1) You need to wait until the DocumentComplete() before you edit it.
So you would you edit in the OnDocumentComplete() handler for the
web component.

2) I presume the control element you wish to change is this?

<input type="text" name="myEditBox" size="20"> ???

If so, you don't look for "text", you normally look for the element
attribute

id <INPUT id="myEditBoxId">
class <INPUT class"colorClass" ...>
tagName <INPUT>

The typical way is to use the element id attribute:

<input id="myEditboxId" type="text" name="myEditBox" size="20">

and try to use an easy HTML interface like IHTMLDocument3 that allows
you to use the function:

IHTMLDocument3::getElementById(idName)

which is what JavaScript programmers uses to find elements in DOM.

While you can have a collection of the same id's, that is generally
bad html/javascript programming since the above POWERFUL function only
return one element.

via C/C++, you would add this to your DocumentComplete() handler:

HRESULT hr;
CComQIPtr<IHTMLDocument3> dom = m_web.get_Document();
if (dom != NULL)
{
TRACE("GOT DOM!\n");
}

CComPtr<IHTMLElement> pElem = 0;

CComBSTR bs = "myEditBoxId";
hr = dom->getElementById(bs,&pElem);
if (SUCCEEDED(hr) && pElem != NULL)
{
TRACE("GOT IT!\n");

CString sTemp (_T("TestVal"));
BSTR bstrNewValue = sTemp.AllocSysString ();
pElem->put_innerText(bstrNewValue);
SysFreeString(bstrNewValue);

// add some color
pElem->put_className(L"clRed");

}

For adding the color class, add this to your <HEAD></HEAD> block:

<style>
..clRed { color: red; font-weight: bold;}
</style>

--
HLS


Jingcheng wrote:

> IHTMLInputElement::put_value doesn't set editbox value?
>
>
> I want to set a the editbox in a html-form.
> IHTMLInputElement::put_value returns S_OK, but the text of the
> editbox is not set, instead it's just cleared. Can you please help me
> take a look?
>
> The following is my C++ code:
>
> CString filename = _T("C:\\temp\\test.htm");
>
> _variant_t varFlags(0L);
> _variant_t varMissing(0L);
> m_browser.Navigate(filename, &varFlags, &varMissing, &varMissing,
> &varMissing);
>
> LPUNKNOWN lpUnk = m_browser.GetControlUnknown();
> IWebBrowser2Ptr ipWebCtrl(lpUnk);
>
> VARIANT_BOOL bBusy = VARIANT_TRUE;
> while (bBusy == VARIANT_TRUE)
> ipWebCtrl->get_Busy(&bBusy);
>
> IDispatchPtr ipDispatch;
> HRESULT hr = ipWebCtrl->get_Document(&ipDispatch);
>
> IHTMLDocument2Ptr ipHtmlDoc2(ipDispatch);
> if (!ipHtmlDoc2)
> return;
>
> IHTMLElementCollectionPtr ipElements;
> ipHtmlDoc2->get_all(&ipElements);
>
> if (!ipElements)
> return;
>
> long count = 0;
> ipElements->get_length(&count);
>
> for(long i = 0; i < count; i++)
> {
> LPDISPATCH lpItem;
> ipElements->item(CComVariant(i), CComVariant(i), &lpItem);
>
> IHTMLInputElementPtr ipInput(lpItem);
> if(!ipInput)
> continue;
>
> // Edit-Field?
> BSTR bstrType;
> ipInput->get_type(&bstrType);
> if (CString(bstrType) == "text")
> { // Fill in Text
> CString sTemp (_T("TestVal"));
> BSTR bstrNewValue = sTemp.AllocSysString ();
> ipInput->put_value (bstrNewValue);
> SysFreeString(bstrNewValue);
> }
> }
>
> The following is my test.htm:
>
> <html>
>
> <head>
> </head>
>
> <body>
>
> <script language="JScript"><!--
> function GoNext()
> {
> id = document.all.userID.value;
> window.external.GoNext("$#pageName:#UserIDPage.htm$#userID:#" + id +
> "$#");
> }
> //--></script>
>
> <table border="0" width="60%" align="center">
> <tr>
> <td width="100%">
>
> <form>
> <p><input type="text" name="myEditBox" size="20"> Edit</p>
> </form>
> <form>
> <p><input type="checkbox" name="myCheck1" value="ON">
> Chk1&nbsp;&nbsp;&nbsp;
> <input type="checkbox" name="myCheck2" value="ON"
> checked>Chk2&nbsp;&nbsp;&nbsp;&nbsp;
> <input type="checkbox" name="myCheck3" value="ON">Chk3</p>
> </form>
> <form">
> <p><input type="radio" value="V1" checked name="myRadio"> Op1&nbsp;
> <input type="radio" name="myRadio" value="V2">
> Op2&nbsp;&nbsp; <input type="radio" name="myRadio" value="V3">Op3</
> p>
> </form>
> <form>
> <p><select size="1" name="myDropDown">
> <option selected>Sel 1</option>
> <option>Sel 2</option>
> <option>Sel 3</option>
> </select> Sel</p>
> </form>
>
> <form>
> <p align="center"><input type="text" name="userID" size="20"></p>
> </form>
>
> <form>
> <p align="center"><input type="button" onclick="GoNext();"
> value="Next >>" name="NextBtn"></p>
> </form>
>
> </td>
> </tr>
> </table>
>
> </body>
>
> </html>



--
HLS