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();
}
}
}
}
|