 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Lun 18 Ago, 2008 2:59 pm Asunto: Controlar una pagina con CppWebBrowser |
|
|
Hola,
Estoy creando una aplicación y usando el componente CppWebBrowser,
para rellenar un formulario de una pagina web de forma automatica.
Por ejemplo tengo el siguiente fichero html, y quiero recoger o
asignar un nombre al campo Nombre, cuyo nombre en el fichero html es "no" y despues simular la pulsación del boton Aceptar..
| Código: |
Form id="frmBusqueda1" name="frmBusqueda1" action="/jsp/resultados.jsp" method="GET" class="bordes" onSubmit="return validarDatosPersonas(this);">
<div id="particulares" style="padding-left:10px;">
<fieldset style="width:178px;height:auto;padding:6px 0 0 6px;border:1px solid #8894B8; background-color:#D5E3FF;">
<div class="notas">Rellena, al menos, 1 de los 3 campos:</div>
<fieldset>
Nombre de la Persona
<input type="text" name="no" style="background-color:#FFFFFF"/>
</fieldset>
<fieldset>
Primer apellido
<input type="text" name="ap1" />
</fieldset>
<fieldset>
Segundo apellido
<input type="text" name="ap2" />
</fieldset>
</fieldset>
<fieldset style="margin-left:5px;width:176px;height:auto;padding:6px 0 0 5px; ">
<div class="notas">Indica, al menos, la provincia: </div>
<fieldset>
Provincia
<select name="sec" style="background-color:#FFFFFF">
<script>rellenaComboProvincias()</script>
</select>
</fieldset>
<fieldset>
Localidad
<input id="loca" type="text" name="lo" />
</fieldset>
<fieldset>
Calle
<input id="call" type="text" name="calle" style="width:132px;\width:134px;w\idth:132px" />
</fieldset>
<fieldset style="padding-left:8px">
Nº
<input id="nume" type="text" name="numero" style="width:25px;\width:23px;w\idth:25px;" />
</fieldset>
</fieldset>
<span class="oculto">
<input type="hidden" id="pgpv" name="pgpv" value="1" />
<input type="hidden" value="0" name="tbus" id="tbus" />
<input type="hidden" value="" name="nomprov" id="nomprov" />
<input type="hidden" value="spa" name="idioma" id="idioma" />
<input type="hidden" id="pext" name="pext" value="" />
</span>
<fieldset style="clear:both; margin:0;float:none">
<input name="encontrar" type="submit" class="b90" value="Encontrar " style="margin-left:285px"/>
</fieldset>
</div><!--/particulares-->
</form>
|
He intentado varias cosas, pero no ha funcionado, alguna idea ?
obrigado!! |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 19 Ago, 2008 12:55 am Asunto: |
|
|
Prueba con lo siguiente:
| Código: | //Añadir: #include<utilcls.h> #include<atl\atlbase.h> #include<mshtml.h>
CComQIPtr<IHTMLDocument2> doc(CppWebBrowser1->Document);
CComPtr<IHTMLElementCollection> forms;
doc->get_forms(&forms);
CComPtr<IDispatch> disp;
HRESULT hr = forms->item(CComVariant("frmBusqueda1"), CComVariant(), &disp);
if (SUCCEEDED(hr) && disp)
{
CComQIPtr<IHTMLFormElement> form(disp);
disp = 0;
if (SUCCEEDED(form->item(CComVariant("no"), CComVariant(), &disp)) && disp)
{
CComQIPtr<IHTMLInputElement> field(disp);
field->put_value(L"prueba");
form->submit();
}
} |
o bien con lo siguiente si no estas usando alguna de las ultimas versiones:
| Código: | //Añadir: #include<mshtml.h>
IHTMLDocument2* doc = 0;
CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&doc);
IHTMLElementCollection* forms = 0;
if (SUCCEEDED(doc->get_forms(&forms)))
{
IDispatch* disp = 0;
HRESULT hr = forms->item(TVariant("frmBusqueda1"), TVariant(), &disp);
if (SUCCEEDED(hr) && disp)
{
IHTMLFormElement* form = 0;
disp->QueryInterface(IID_IHTMLFormElement, (LPVOID*)&form);
disp->Release();
disp = 0;
hr = form->item(TVariant("no"), TVariant(), &disp);
if (SUCCEEDED(hr) && disp)
{
IHTMLInputElement* field = 0;
disp->QueryInterface(IID_IHTMLInputElement, (LPVOID*)&field);
disp->Release();
field->put_value(L"prueba");
form->submit();
field->Release();
}
form->Release();
}
forms->Release();
}
doc->Release(); |
|
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Mar 19 Ago, 2008 9:26 am Asunto: |
|
|
Efectivamente si funciona, lo único que tengo que quitar la linea
form->submit();
porque me inicializa de nuevo la pagina y me borra los campos que he rellenado.
En el código HTML que puse, existe un "submit", de un boton que se llama "encontrar" que es el que lanza la busqueda o ejecución de los datos introducidos.
Pongo aqui el cachito de codigo del final del formulario.
| Cita: |
<FIELDSET>Calle <INPUT id=call style="WIDTH: 132px" name=calle> </FIELDSET>
<FIELDSET style="PADDING-LEFT: 8px">Nº <INPUT id=nume style="WIDTH: 25px" name=numero> </FIELDSET> </FIELDSET> <SPAN class=oculto><INPUT id=pgpv type=hidden value=1 name=pgpv> <INPUT id=tbus type=hidden value=0 name=tbus> <INPUT id=nomprov type=hidden name=nomprov> <INPUT id=idioma type=hidden value=spa name=idioma> <INPUT id=pext type=hidden name=pext> </SPAN>
<FIELDSET style="CLEAR: both; FLOAT: none; MARGIN: 0px"><INPUT class=b90 style="MARGIN-LEFT: 285px" type=submit value="Encontrar " name=encontrar> </FIELDSET> </DIV><!--/particulares-->
</FORM>
|
He intentado simular la pulsación del bóton "encontrar", de la siguiente forma:
| Código: |
.....
.....
disp = 0;
if (SUCCEEDED(form->item(CComVariant("encontrar"), CComVariant(), &disp)) && disp)
{
CComQIPtr<IHTMLInputElement> field(disp);
// field->put_value(L"Hola"); // cambia el caption del botton
// field->put_name(L"encontrar");
field->select();
tagVARIANT pT;
// field->put_onselect(pT);
field->put_start(L"encontrar");
// form->submit();
}
|
Pero de momento ninguna de las formas probadas funciona!!
Alguna Idea!!
Gracias. |
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Mar 19 Ago, 2008 2:30 pm Asunto: |
|
|
He probado tambien ....
| Código: |
disp = 0;
if (SUCCEEDED(form->item(CComVariant("encontrar"), CComVariant(), &disp)) && disp)
{
CComQIPtr<IHTMLInputElement> field(disp);
DISPID idMethod[ 1 ];
LPOLESTR FnName[ 1 ] = { L"onClick" };
if( field->GetIDsOfNames(IID_NULL, FnName, 1, LOCALE_SYSTEM_DEFAULT, idMethod ) == 0 )
{
DISPPARAMS dpNoArgs = {NULL, NULL, 0, 0};
field->Invoke(idMethod[ 0 ], IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dpNoArgs, NULL, NULL, NULL);
}
}
|
y tampoco funciona, Alguien tiene alguna idea!! |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 19 Ago, 2008 9:50 pm Asunto: |
|
|
Con el código que puse anteriormente quedaría algo así:
| Código: | CComQIPtr<IHTMLDocument2> doc(CppWebBrowser1->Document);
CComPtr<IHTMLElementCollection> forms;
doc->get_forms(&forms);
CComPtr<IDispatch> disp;
HRESULT hr = forms->item(CComVariant("frmBusqueda1"), CComVariant(), &disp);
if (SUCCEEDED(hr) && disp)
{
CComQIPtr<IHTMLFormElement> form(disp);
disp = 0;
if (SUCCEEDED(form->item(CComVariant("no"), CComVariant(), &disp)) && disp)
{
CComQIPtr<IHTMLInputElement> field(disp);
field->put_value(L"prueba");
}
///////////////////////////////////////////////////////////////////////////
disp = 0;
if (SUCCEEDED(form->item(CComVariant("encontrar"), CComVariant(), &disp)) && disp)
{
CComQIPtr<IHTMLElement> field(disp);
field->click();
}
///////////////////////////////////////////////////////////////////////////
} |
|
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Mie 20 Ago, 2008 10:59 am Asunto: |
|
|
Evidentemente funciona!!
Siguiendo con el Hilo, si el boton no esta dentro de un formulario el acceso a este es mas complicado, no?
Por ejemplo al lanzar una busqueda puede dar como resultado varias paginas encontradas, algunas de las veces te las muestra como un boton siguiente y otras como 1,2,3,4,5... etc.
Si Muestra como un boton siguiente, al que hay que buscar la clase "nav" para ejecutar el onclick, tal y como ...
| Cita: |
Listado de 1 al 10 [Siguiente]
|
... Parte del codigo HTML seria ...
| Cita: |
<DIV class=ESTADILLO>
<SPAN style="FLOAT: right">
Listado de
<STRONG>1</STRONG>
al
<STRONG>10</STRONG>
<A class=nav onclick="return pagSigAnt(urlSig)" href="#">
<B>Siguiente</B>
</A>
</SPAN>
<B>Encontrados</B>
<STRONG> 106</STRONG>
</DIV>
|
Otras de las veces te encuentras que en lugar de un boton existe un acceso directo pulsando 1,2,3,4,5
| Cita: |
Resultados Encontrados: 104 Divididos en 5 páginas 1 2 3 4 5
|
... Codigo HTML ...
| Cita: |
<TD width="50%">
<DIV align=left><SPAN class=txt_otrosx id=UcInfoResultados1_lblResultadosEncontrados>Resultados Encontrados: </SPAN><SPAN class=txt_otrosx id=UcInfoResultados1_lblNumeroResultados>104</SPAN> </DIV></TD>
<TD width="50%">
<DIV align=right><SPAN class=txt_otrosx id=UcInfoResultados1_lblDivididos>Divididos en </SPAN><SPAN class=txt_otrosx id=UcInfoResultados1_lblPaginas>5</SPAN> <SPAN class=txt_otrosx id=UcInfoResultados1_Label1>páginas</SPAN> </DIV></TD></TR>
<TR>
<TD width="50%">
<DIV align=left></DIV></TD>
<TD align=right width="50%"><SPAN class=txt_otrosx id=UcInfoResultados1_lblNavegadorPaginas><FONT face=VERDANA color=#000000 size=1><B>1</B></FONT> <A class="" onmouseover="window.status='Ir a la página 2';return true;" title="Ir a la página 2" onclick="Nave('UcFiltroResultadoAvanzadas1_',25,0);return false;" onmouseout="window.status=' ';return true;" href=".">2</A> <A class="" onmouseover="window.status='Ir a la página 3';return true;" title="Ir a la página 3" onclick="Nave('UcFiltroResultadoAvanzadas1_',50,0);return false;" onmouseout="window.status=' ';return true;" href=".">3</A> <A class="" onmouseover="window.status='Ir a la página 4';return true;" title="Ir a la página 4" onclick="Nave('UcFiltroResultadoAvanzadas1_',75,0);return false;" onmouseout="window.status=' ';return true;" href=".">4</A> <A class="" onmouseover="window.status='Ir a la página 5';return true;" title="Ir a la página 5" onclick="Nave('UcFiltroResultadoAvanzadas1_',100,0);return false;" onmouseout="window.status=' ';return true;" href=".">5</A> </SPAN></TD></TR></TBODY></TABLE></DIV></DIV></DIV>
<DIV id=UcResultados1_pnlResultados><?xml version="1.0" encoding="utf-8"?>
<DIV align=center>
<DIV class=hiloGris></DIV>
|
La pregunta seria como acceder al elemento "class" para ejecutar su "onclick" ? |
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Mie 20 Ago, 2008 7:20 pm Asunto: |
|
|
Bueno tras toda la tarde probando al final he conseguido que funcione la primera parte, es decir, buscar el boton Siguiente, funciona correctamente, tambien se puede aplicar a otros botones.
Dejo código completo por si le puede ayudar a alguien.
( esta un poco adornado, pero es para probar algunos valores )
| Código: |
CComQIPtr<IHTMLDocument2> pHTMLDoc2(CppWebBrowser1->Document);
CComPtr<IHTMLElement> pDocElem;
CComPtr<IHTMLElementCollection> pElemCollections;
pHTMLDoc2->get_all(&pElemCollections);
CComVariant varName; // COleVariant varName;
long lLen=0;
varName = SysAllocString(L"A");
CComPtr<IDispatch> spDispEmbed;
pElemCollections->tags(varName, &spDispEmbed);
{
CComPtr<IHTMLElementCollection> spCollectEmbed;
spDispEmbed->QueryInterface(IID_IHTMLElementCollection, (void**)&spCollectEmbed);
if (spCollectEmbed)
{
spCollectEmbed->get_length(&lLen);
for (int i = 0; i < lLen; i++)
{
CComPtr<IDispatch> pItem;
CComVariant vt = (long)i; // COleVariant vt = (long)i;
spCollectEmbed->item(vt, vt, &pItem);
CComPtr<IHTMLElement> spElement;
pItem->QueryInterface(IID_IHTMLElement, (void**)&spElement);
wchar_t *bsHTML; // BSTR bsHTML;
spElement->get_innerHTML(&bsHTML);
wchar_t *bsNOMBRE;
wchar_t *bsCLASE;
wchar_t *bsSiguiene=L"<B>Siguiente</B>";
wchar_t * bsTitulo;
wchar_t * bsIdentifi;
wchar_t *bsTEXTO;
if(!bsHTML)
continue;
if(wcsncmpi(bsHTML,bsSiguiene,12)==0)
{
spElement->get_title(&bsTitulo);
spElement->get_id(&bsIdentifi);
spElement->get_innerText(&bsTEXTO);
spElement->get_className(&bsCLASE);
spElement->get_tagName(&bsNOMBRE);
spElement->click();
break;
}
// parse for <embed>
SysFreeString(bsHTML);
}
}
}
|
Seguro que ese pedazo de codigo se puede reducir... pero de momento funciona perfectamente!!
Ahora estoy con la segunda forma de acceder a las paginas siguientes de una busqueda, ahora me muestra en lugar de botones, unos números que son las paginas encontradas en la busqueda .... paginas 1, 2, 3, 4 ,5.
Esto va en relación cuando realizas una busqueda, y te aparece que existen 5 paginas de las cosas que estas buscando y te da opción a verlas directamente pulsando con el click del raton al número 1,2,3,4 o 5.
| Cita: |
Resultados Encontrados: 104 Divididos en 5 páginas 1 2 3 4 5
|
Si Alguien ya lo sabe, podria echarme un cable, no?
Gracias _Leo!! |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 21 Ago, 2008 9:44 am Asunto: |
|
|
Pulsar 'Siguiente':
| Código: | // Buscamos entre todos los enlaces de la página
// el que contenga el texto "Siguiente" y lo pulsamos
CComQIPtr<IHTMLDocument2> doc(CppWebBrowser1->Document);
CComPtr<IHTMLElementCollection> links;
HRESULT hr = doc->get_links(&links);
if (SUCCEEDED(hr) && links)
{
long count = 0;
links->get_length(&count);
for (int i = 0; i < count; i++)
{
CComPtr<IDispatch> disp;
links->item(CComVariant(i), CComVariant(i), &disp);
CComQIPtr<IHTMLElement> link(disp);
CComBSTR text;
link->get_innerText(&text);
if (!CompareText(String(text.m_str).Trim(), "Siguiente"))
{
link->click();
break;
}
}
} |
Ver los enlaces de los números de página y pulsarlos:
| Código: | CComQIPtr<IHTMLDocument2> doc(CppWebBrowser1->Document);
CComPtr<IHTMLElementCollection> all;
doc->get_all(&all);
// Buscamos <SPAN ... id=UcInfoResultados1_lblNavegadorPaginas>
// que contiene la lista de enlaces a las páginas
CComPtr<IDispatch> disp;
HRESULT hr = all->item(CComVariant("UcInfoResultados1_lblNavegadorPaginas"),
CComVariant(), &disp);
if (SUCCEEDED(hr) && disp)
{
CComQIPtr<IHTMLElement> element(disp);
disp = 0;
// Obtenemos el conjunto de elementos que contiene <SPAN...
element->get_children(&disp);
CComQIPtr<IHTMLElementCollection> children(disp);
disp = 0;
// De ellos sacaremos la lista de enlaces
children->tags(CComVariant("a"), &disp);
CComQIPtr<IHTMLElementCollection> links(disp);
// Averiguamos el número de enlaces (en este caso de páginas)
long count = 0;
links->get_length(&count);
// Recorremos la lista de enlaces y mostramos su texto
CComQIPtr<IHTMLElement> link;
String textLinks = "Texto enlaces:\n";
for (int i = 0; i < count; i++)
{
disp = 0;
links->item(CComVariant(i), CComVariant(i), &disp);
link = disp;
CComBSTR text;
link->get_innerText(&text);
textLinks += text.m_str;
textLinks += "\n";
}
ShowMessage(textLinks);
// Como ejemplo hacemos click en el primero de ellos
disp = 0;
links->item(CComVariant(0), CComVariant(), &disp);
link = disp;
link->click();
} |
Sería mucho más sencillo localizar los elementos que necesites si utilizas los atributos 'id' o 'name' en las etiquetas html.. |
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Jue 21 Ago, 2008 3:06 pm Asunto: |
|
|
Funciona perfectamente _Leo!!!
Ya siguiendo un poco mas con este Hilo, pongo un ejemplo de como
Identificarse en una Pagina con su Usuario/Pass.
La prueba se realiza desde el link http://mail.yahoo.com
| Código: |
CComQIPtr<IHTMLDocument2> doc(CppWebBrowser1->Document);
CComPtr<IHTMLElementCollection> pColl;
wchar_t *bsUser=L"UserMiNombre";
wchar_t *bsPW=L"PassMiPassword";
HRESULT hr = doc->get_all(&pColl);
if (SUCCEEDED(hr) && pColl)
{
LONG celem;
// Busca el Numero de Elementos!!
hr = pColl->get_length( &celem );
for ( int i=0; i< celem; i++ )
{
VARIANT varIndex;
varIndex.vt = VT_UINT;
varIndex.lVal = i;
VARIANT var2;
VariantInit( &var2 );
IDispatch* pDisp;
hr = pColl->item( varIndex,
var2, &pDisp );//Get an element
if ( hr == S_OK )
{
IHTMLElement* pElem;
hr = pDisp->QueryInterface(
IID_IHTMLElement,
(void **)&pElem);
if ( hr == S_OK )
{
BSTR bstr;
//Coge el nombre tag del elemento!!
hr = pElem->get_tagName(&bstr);
String strTag;
strTag = bstr;
//Comprobamos que existe elementos de Entrada!!
IHTMLInputTextElement* pUser;
hr = pDisp->QueryInterface(
IID_IHTMLInputTextElement,
(void **)&pUser );
if ( hr == S_OK )
{
String mStr;
pUser->get_name(&bstr);
mStr=bstr;
if(mStr=="login") // Si es campo Login!!
pUser->put_value(bsUser);
else if(mStr=="passwd") // Si es campo Password!!
pUser->put_value(bsPW);
pUser->Release();
}
else{
// Buscamos un Boton, de Aceptación de Entrada!!
IHTMLInputButtonElement* pButton;
hr = pDisp->QueryInterface(
IID_IHTMLInputButtonElement,
(void **)&pButton);
if ( hr == S_OK )
{
/* CComBSTR text;
CComBSTR valor;
CComBSTR tipo;
pButton->get_name(&text);
pButton->get_value(&valor);
pButton->get_type(&tipo); */
IHTMLFormElement* pForm;
hr=pButton->get_form(&pForm);
if ( hr == S_OK )
{ // aceptar la entrada de User/Pass
pForm->submit();
pForm->Release();
break;
}
pButton->Release();
}
}
pElem->Release();
}
pDisp->Release();
}
}
}
|
Bueno el siguiente paso es intentar asignar un valor a un comboBox, que funciona bien la asignación, pero cuando le asigno el municipio no aparece nada!!
Es decir, existen dos comboBox, el primero seleccionas la ciudad y
despues de seleccionar el de forma automatica carga los pueblos de esa ciudad, si se hace directamente sobre la pagina con el ratón funciona perfectamente, visualiza un cartel de "Cargando" y despues te deja seleccionar cualquier pueblo de los que tiene en la lista,
pero si lo hago directamente atraves de codigo, no me enseña los pueblos, me muestra la lista en blanco.
Pongo Codigo HTML
| Cita: |
<TR>
<TD><SPAN class=txt_titulos_ id=UcBuscador1_lblDonde>Seleccione</SPAN> </TD>
<TD class=h7 style="VERTICAL-ALIGN: middle; WIDTH: 70px; COLOR: rgb(0,51,102); TEXT-ALIGN: right"><STRONG><SPAN id=UcBuscador1_lblProvincia>Provincia</SPAN></STRONG> </TD>
<TD style="VERTICAL-ALIGN: middle; WIDTH: 286px; TEXT-ALIGN: left" width=311><SELECT class=txt_otrosx9 id=UcBuscador1_cboProvincias style="FONT: 10px verdana,arial,sansserif; WIDTH: 265px; HEIGHT: 20px; font-size-adjust: none; font-stretch: normal" onchange="javascript:jsCargando('mb');setTimeout('__doPostBack(\'UcBuscador1$cboProvincias\',\'\')', 0)" name=UcBuscador1$cboProvincias> <OPTION value=0 selected>Todas</OPTION> <OPTION value=015>A Coruña</OPTION> <OPTION value=001>Álava</OPTION> <OPTION value=002>Albacete</OPTION> <OPTION value=003>Alicante</OPTION> <OPTION value=004>Almería</OPTION> <OPTION value=033>Asturias</OPTION> <OPTION value=005>Ávila</OPTION> <OPTION value=006>Badajoz</OPTION> <OPTION value=007>Baleares</OPTION> <OPTION value=008>Barcelona</OPTION> <OPTION value=009>Burgos</OPTION> <OPTION value=010>Cáceres</OPTION> <OPTION value=011>Cádiz</OPTION> <OPTION value=039>Cantabria</OPTION> <OPTION value=012>Castellón</OPTION> <OPTION value=051>Ceuta</OPTION> <OPTION value=013>Ciudad Real</OPTION> <OPTION value=014>Córdoba</OPTION> <OPTION value=016>Cuenca</OPTION> <OPTION value=017>Girona</OPTION> <OPTION value=018>Granada</OPTION> <OPTION value=019>Guadalajara</OPTION> <OPTION value=020>Guipúzcoa</OPTION> <OPTION value=021>Huelva</OPTION> <OPTION value=022>Huesca</OPTION> <OPTION value=023>Jaén</OPTION> <OPTION value=026>La Rioja</OPTION> <OPTION value=035>Las Palmas</OPTION> <OPTION value=024>León</OPTION> <OPTION value=025>Lleida</OPTION> <OPTION value=027>Lugo</OPTION> <OPTION value=028>Madrid</OPTION> <OPTION value=029>Málaga</OPTION> <OPTION value=052>Melilla</OPTION> <OPTION value=030>Murcia</OPTION> <OPTION value=031>Navarra</OPTION> <OPTION value=032>Ourense</OPTION> <OPTION value=034>Palencia</OPTION> <OPTION value=036>Pontevedra</OPTION> <OPTION value=037>Salamanca</OPTION> <OPTION value=040>Segovia</OPTION> <OPTION value=041>Sevilla</OPTION> <OPTION value=042>Soria</OPTION> <OPTION value=038>Sta Cruz De Tenerife</OPTION> <OPTION value=043>Tarragona</OPTION> <OPTION value=044>Teruel</OPTION> <OPTION value=045>Toledo</OPTION> <OPTION value=046>Valencia</OPTION> <OPTION value=047>Valladolid</OPTION> <OPTION value=048>Vizcaya</OPTION> <OPTION value=049>Zamora</OPTION> <OPTION value=050>Zaragoza</OPTION></SELECT> </TD>
<TD class=Ayuda style="VERTICAL-ALIGN: top; TEXT-ALIGN: center" width=118><INPUT id=UcBuscador1_btnAyuda onclick='javascript:jAyudaBlancas();return false;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("UcBuscador1$btnAyuda", "", true, "", "", false, false))' tabIndex=2 type=submit value=Ayuda name=UcBuscador1$btnAyuda> </TD></TR>
<TR>
<TD style="VERTICAL-ALIGN: middle; WIDTH: 15px" rowSpan=3></TD>
<TD class=h7 style="VERTICAL-ALIGN: middle; WIDTH: 70px; COLOR: rgb(0,51,102); HEIGHT: 19px; TEXT-ALIGN: right"><STRONG><SPAN id=UcBuscador1_lblMunicipio>Municipio</SPAN></STRONG> </TD>
<TD style="VERTICAL-ALIGN: middle; WIDTH: 286px; HEIGHT: 19px; TEXT-ALIGN: left"><SELECT class=txt_otrosx9 id=UcBuscador1_cboMunicipios style="FONT: 10px verdana,arial,sansserif; WIDTH: 265px; HEIGHT: 20px; font-size-adjust: none; font-stretch: normal" onchange="javascript:jsCargando('lb');setTimeout('__doPostBack(\'UcBuscador1$cboMunicipios\',\'\')', 0)" name=UcBuscador1$cboMunicipios></SELECT> </TD>
<TD class=Borrar style="VERTICAL-ALIGN: middle; TEXT-ALIGN: center" rowSpan=2><INPUT id=UcBuscador1_btnBorrar onclick='javascript:Borrar();return false;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("UcBuscador1$btnBorrar", "", true, "", "", false, false))' tabIndex=3 type=submit value=Borrar name=UcBuscador1$btnBorrar> </TD>
</TR>
|
Código en fase de pruebas!!
| Código: |
IDispatch *pDisp = CppWebBrowser1->Document;
IHTMLDocument2 *pDoc = NULL;
pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc);
pDisp->Release();
IHTMLElementCollection *pColl = NULL;
pDoc->get_all(&pColl);
IHTMLInputElement *pTextInput = NULL;
pDisp->QueryInterface(IID_IHTMLInputElement, (void**)&pTextInput);
IHTMLElement *pEle = (IHTMLElement*)pTextInput;
pColl->item(CComVariant("UcBuscador1_cboProvincias"), CComVariant(0L), &pDisp);
IHTMLSelectElement *pSelect = NULL;
pDisp->QueryInterface(IID_IHTMLSelectElement, (void**)&pSelect);
pSelect->put_selectedIndex(29); // 28-Madrid, 29-Malaga
//cboMunicipios , UcBuscador1_cboMunicipios
pColl->item(CComVariant("UcBuscador1_cboMunicipios"), CComVariant(0L), &pDisp);
IHTMLSelectElement *pSelect2 = NULL;
pDisp->QueryInterface(IID_IHTMLSelectElement, (void**)&pSelect2);
pSelect2->put_selectedIndex(1); // No me carga el Primer Municipio
pDisp->Release();
|
Al poner Malaga en Provincias, el de forma automatica rellena el ComboBox de Municipios de los pueblos de Malaga, pero no lo hace bien
pues si abro el combobox de Municipios me muestra la lista en blanco.
Gracias _Leo!!, te debo Una!!  |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 21 Ago, 2008 10:33 pm Asunto: |
|
|
Abreviando un poco lo de Yahoo:
| Código: | // A las cabeceras anteriores añadimos: #include<map>
typedef std::map<CComVariant, CComBSTR> MapField;
MapField mf;
mf["login"] = L"MiUser";
mf["passwd"] = L"MiPassword";
CComQIPtr<IHTMLDocument2> doc(CppWebBrowser1->Document);
CComPtr<IHTMLElementCollection> forms;
doc->get_forms(&forms);
CComPtr<IDispatch> disp;
HRESULT hr = forms->item(CComVariant("login_form"), CComVariant(), &disp);
if (SUCCEEDED(hr) && disp)
{
CComQIPtr<IHTMLFormElement> form(disp);
CComQIPtr<IHTMLInputElement> field;
for (MapField::iterator ite = mf.begin(); ite != mf.end(); ite++)
{
disp = 0;
if (SUCCEEDED(form->item(ite->first, CComVariant(), &disp)) && disp)
{
field = disp;
field->put_value(ite->second);
}
}
form->submit();
} |
En un rato miro el resto... |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 22 Ago, 2008 2:11 am Asunto: |
|
|
| _Andrew escribió: | Al poner Malaga en Provincias, el de forma automatica rellena el ComboBox de Municipios de los pueblos de Malaga, pero no lo hace bien
pues si abro el combobox de Municipios me muestra la lista en blanco. |
El problema está en que al seleccionar el elemento en el combo por código no se dispara el evento 'onchange' del mismo. Un ejemplo disparando el evento 'onchange':
| Código: | CComQIPtr<IHTMLDocument2> doc(CppWebBrowser1->Document);
CComPtr<IHTMLElementCollection> all;
doc->get_all(&all);
CComPtr<IDispatch> disp;
HRESULT hr = all->item(CComVariant("UcBuscador1_cboProvincias"),
CComVariant(), &disp);
if (SUCCEEDED(hr) && disp)
{
// Seleccionamos el elemento del primer combo
CComQIPtr<IHTMLSelectElement> element(disp);
element->put_selectedIndex(29);
// Ahora el problema es que cuando se selecciona
// por código no se dispara el evento 'onchange'.
// Disparamos el evento 'onchange' del siguiente modo:
CComVariant ret(0);
CComPtr<IHTMLWindow2> win;
doc->get_parentWindow(&win);
win->execScript(CComBSTR(L"document.getElementById("
"'UcBuscador1_cboProvincias').onchange();"),
CComBSTR(L"Javascript"), &ret);
// Seleccionamos el segundo elemento del segundo combo
disp = 0;
HRESULT hr = all->item(CComVariant("UcBuscador1_cboMunicipios"),
CComVariant(), &disp);
if (SUCCEEDED(hr) && disp)
{
element = disp;
element->put_selectedIndex(1);
}
} |
|
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Vie 22 Ago, 2008 1:02 pm Asunto: |
|
|
Eres un crack!! _Leo
Verdaderamente funciona, solo que existe un pequeño fallo, y es que
al hacerlo todo tan seguido, es tan rápido que no le da tiempo a cargar
los municipios de la provincia seleccionada.
El tiempo que tarda al disparar el evento "onchange', hasta que
carga el combobox de municipios, tanda unos instantes.
es decir, estas indicandole que seleccione el municipio cuando todavia
no se ha cargado su lista.
Habria que esperar uno pequeño tiempo desde que se dispara el evento
hasta que se seleccione el municipio. o esperar de alguna manera
a que haya terminado el combobox de rellenarse.
He probado con un Sleep(100); pero no funciona!!
voy a probar si existe alguna propiedad del combobox que diga
que todavia esta cargando. |
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Vie 22 Ago, 2008 1:51 pm Asunto: |
|
|
Seria algo así como ... despues de lanzar el evento onChange y antes de seleccionar el municipio.
Esperar a que termine de rellenar el comboBox.
| Código: |
bool Wait_Loaded (int nTimeout)
{
READYSTATE result;
DWORD nFirstTick = GetTickCount ();
wchar_t *resultado;
do
{
doc->get_readyState(&resultado);
if (resultado != "complete") // "READYSTATE_COMPLETE"
Sleep (250);
if (nTimeout > 0)
{
if ((GetTickCount () - nFirstTick) > nTimeout)
break;
}
} while (resultado != "complete"); // "READYSTATE_COMPLETE"
if (result == "complete") // READYSTATE_COMPLETE
return true;
else
return false;
}
|
Claro esto funciona para la pagina web, y no para el combo!! |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 26 Ago, 2008 6:38 am Asunto: |
|
|
Este es el código que he usado yo para hacer las pruebas. Aunque introduzca retardos sigue funcionando. Quizás es porque en tu código usas ASP.NET y "WebForm_PostBackOptions/__doPostBack" hacen la llamada de manera asíncrona.. (realmente no tengo ni idea ya que no utilizo ASP.NET) prueba con las propiedades "ReadyState" o "Busy" del TCppWebBrowser.
| Código: | <form action="" method="post" name="buscar_form">
Provincia: <select name="provincia" id="UcBuscador1_cboProvincias"
onChange="javascript:formar(this.options.selectedIndex);">
<option value="9999999" selected>[seleccionar]</option>
<option value="001">Opción 1</option>
<option value="029">Málaga</option></select>
Localidad:<select name="localidad" id="UcBuscador1_cboMunicipios">
<option value="9999999" selected>[seleccionar]</option></select>
<script language="javascript">
var num_departamentos = document.buscar_form.provincia.options.length;
var depart = new Array(num_departamentos);
for (var i=0; i<num_departamentos; i++)
depart[i]= new Array();
depart[0][0] = new Option ('[seleccionar]','9999999');
depart[1][0] = new Option ('Prueba','1');
depart[2][0] = new Option ('Municipio 1','1');
depart[2][1] = new Option ('Municipio 2','2');
function formar(x)
{
var temp=document.buscar_form.localidad;
for (m=temp.options.length-1;m>0;m--)
temp.options[m]=null;
for (i=0;i<depart[x].length;i++)
temp.options[i] = new Option(depart[x][i].text,depart[x][i].value);
temp.options[0].selected=true;
}
formar(document.buscar_form.provincia.options.selectedIndex);
</script></form>
<font color="gray" size="1">(Ejemplo modificado de: tufuncion.com)</font> |
Es difícil verlo sin tener la web con la que estas probando.. si tienes alguna web de ejemplo con lo de las provincias donde pueda hacer pruebas podría mirarlo.. |
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Mar 26 Ago, 2008 10:18 am Asunto: |
|
|
_Leo,
Te dejo el enlace de ejemplo
http://blancas.qdq.com/Index.aspx?Lang=es
Fijate que cuando seleccionas la provincia, el campo municipio
pone "Cargando", y tarda unos instantes antes de mostrarte
los municipios y si intentas abrir no te lo permite, hasta
que ha acabado de cargar que es cuando aparece el rotulo de "Todos".
_Gracias. |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|