C++ Builder Snippets  

TCppWebBrowser: HTML-Formulare auf der geladenen Seite ausfüllen:
Dieses Beispiel wurde uns von Michael Vogt zugeschickt

--- E-Mail von Michael Vogt ---

Ich habe noch einen Code für den BCB, will aber nicht gleich im Gästebuch posten, da
der bis jetzt nur auf meinem Computer getestet ist. Es geht darum, auf Edit-Felder in
CppWebBrowser-Instanzen zugreifen zu können, ein Thema was, soweit ich weis, fast garnicht
im Internet zu finden ist. Nach wirklich monatelangen Recherchen hab ich mir das hier
zusammengebastelt:
#include <mshtml.h>

IHTMLDocument2 *HTMLDoc = NULL;
if(SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2,
  (LPVOID*)&HTMLDoc)))
{
  IHTMLElementCollection *pAll = NULL;
  if(SUCCEEDED(HTMLDoc->get_all(&pAll)))
  {
    TVariant name = "name";    //  hier kommt der name des Feldes hin (siehr HTML source)
    IDispatch *pDisp = NULL;
    TVariant index=0;
    if(SUCCEEDED(pAll->item(name, index, &pDisp)))
    {
      if(pDisp)
      {
        IHTMLInputElement *pInput = NULL;     // mshtml.h
        pDisp->QueryInterface(IID_IHTMLInputElement, (LPVOID*)&pInput);
        pDisp->Release();
        if(pInput)
        {
          WideString mybuffer;
          pInput->put_value (WideString("Hallo")); //hier der String, der zu schreiben ist.
        }
        pInput->Release();
      }
    }
  }
  pAll->Release();
}
HTMLDoc->Release();

Hoffe es funktioniert. MfG Michael Vogt ----------------------------------
Der Code von Michael funktioniert sehr gut. Eine davon abgeleitete Beispiel-Funktion haben wir in das TCppWebBrowser-Beispielprojekt eingebaut: sie lädt die Startseite der B&M-RAD Pages trägt den vom Anwender eingegebenen Suchtext in die RAD-Suchmaschine und startet die Suche. Aufrufbar ist diese Funktion über den Punkt "Bearbeiten->Auf www.bytesandmore.de/rad suchen..." des Programmhauptmenüs bzw. über Browser-Kontextmenü.

Da unser Layout 2 Frames beinhaltet, war die Realisierung etwas aufwendiger:
//---------------------------------------------------------------------------
// Durchsuchen der RAD-Seiten:
//---------------------------------------------------------------------------
void __fastcall TfrmMain::menuRadPagesSearchClick(TObject *Sender)
{
  // Zur Sicherheit die Seite annavigieren:
  CppWebBrowser->Navigate(WideString("http://www.bytesandmore.de/rad/"));
  while(!CppWebBrowser->Busy) Application->ProcessMessages();
  while(CppWebBrowser->Busy) Application->ProcessMessages();

  if(CppWebBrowser->LocationURL !=
    WideString("http://www.bytesandmore.de/rad/"))
  {
    ShowMessage("Seite http://www.bytesandmore.de/rad/ "
      "konnte nicht geladen werden !");
    return;
  }

  // Suchstring eingeben lassen:
  AnsiString slSearchString = InputBox("Suche auf RAD-Pages",
    "Bitte geben Sie den Suchbegriff ein:", "TRegistry");
  if(slSearchString == EmptyStr)
    return;

  IHTMLDocument2 *HTMLDocument = NULL;
  LONG ilFramesCount = 0;

  // Falls eine Seite geladen:
  if(SUCCEEDED(CppWebBrowser->Document->QueryInterface(
    IID_IHTMLDocument2, (LPVOID*)&HTMLDocument)))
  {
    // ggf. auch Frames-Code extrahieren:
    IHTMLFramesCollection2 *pFrames = NULL;
    if(SUCCEEDED(HTMLDocument->get_frames(&pFrames)))
    {
      // Anzahl der Frames bestimmen:
      pFrames->get_length(&ilFramesCount);

      if(ilFramesCount < 2)
        EnterSearchWordsAndSubmit(HTMLDocument, slSearchString,
          "terms", "SearchForm");
      else
      {
        VARIANT vFrame;
        VARIANT ret;
        vFrame.vt = VT_UINT;
        vFrame.lVal = 1;

        if(SUCCEEDED(pFrames->item(&vFrame, &ret)))
        {
          // Zeiger auf IHTMLWindow2 des Frames besorgen:
          IHTMLWindow2 *pWindow = NULL;
          if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2,
            (LPVOID*)&pWindow)))
          {
            // Zeiger auf IHTMLDocument2 des Frames besorgen:
            IHTMLDocument2 *pDoc = NULL;
            if(SUCCEEDED(pWindow->get_document(&pDoc)))
            {
              EnterSearchWordsAndSubmit(pDoc, slSearchString,
                "terms", "SearchForm");
              pDoc->Release();
            }
            pWindow->Release();
          }
        }
      }
      pFrames->Release();
    }
    HTMLDocument->Release();
  }
}

//---------------------------------------------------------------------------
// Funktion EnterSearchWordsAndSubmit() trägt den im Parameter slSearchString
// übergebenen Suchbegriff ins Eingabefeld (input) mit dem Namen slInputName
// des HTML-Formulars slHtmlFormName und startet die Suche.
//
// Im Parameter pHTMLDocument wird der Zeiger auf IHTMLDocument2-Interface
// des zu verwendenden HTMLDocuments übergeben.
//---------------------------------------------------------------------------
void EnterSearchWordsAndSubmit(IHTMLDocument2* pHTMLDocument,
  AnsiString slSearchString, AnsiString slInputName, AnsiString slHtmlFormName)
{
  if(pHTMLDocument != NULL)
  {
    IHTMLElementCollection *pAll = NULL;
    if(SUCCEEDED(pHTMLDocument->get_all(&pAll)) && pAll)
    {
      // Name des Eingabefeldes (sieh HTML source der Seite)
      TVariant vName = slInputName;
      TVariant vIndex = 0;
      IDispatch *pDisp = NULL;

      if(SUCCEEDED(pAll->item(vName, vIndex, &pDisp)) && pDisp)
      {
        IHTMLInputElement *pInput = NULL;     // mshtml.h
        if(SUCCEEDED(pDisp->QueryInterface(IID_IHTMLInputElement,
          (LPVOID*)&pInput)) && pInput)
        {
          // String in das Eingabefeld eintragen:
          pInput->put_value(WideString(slSearchString));
          pInput->Release();
        }
        pDisp->Release();
      }
      pAll->Release();

      // Formulareingaben abschicken (SUBMIT)
      IHTMLElementCollection *HTMLForms = NULL;
      if(SUCCEEDED(pHTMLDocument->get_forms(&HTMLForms)) && HTMLForms)
      {
        // Name des HTML-Formulars <form name="SearchForm"...>
        vName = slHtmlFormName;
        vIndex = 0;
        if(SUCCEEDED(HTMLForms->item(vName, vIndex, &pDisp)) && pDisp)
        {
          IHTMLFormElement *HTMLForm = NULL;
          if(SUCCEEDED(pDisp->QueryInterface(IID_IHTMLFormElement,
            (LPVOID*)&HTMLForm)) && HTMLForm)
          {
            HTMLForm->submit();
            HTMLForm->Release();
          }
          pDisp->Release();
        }
        HTMLForms->Release();
      }
    }
  }
}


Screenshot des Beispielprogramms
Screenshot des Beispielprogramms


  Download BCB6
Projekt-Quellcode
Download
Demo-Exe

© '99-2002 by S. Kreutzmann