Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Controlar una pagina con CppWebBrowser
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Controlar una pagina con CppWebBrowser Responder citando

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&ordm;
        <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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Evidentemente funciona!! Smile

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>&nbsp; <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>&nbsp; <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>&nbsp; <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>&nbsp; <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>&nbsp; </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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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!! Smile
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_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
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.