C++ Builder Snippets  

TCppWebBrowser: aktuelle Auswahl oder die gesamte Seite in die Zwischenablage kopieren:
 
Weder die Copy-Funktion des MSIE-Kontextmenüs noch die ControlInterface->ExecWB()-Methode funktionieren mit der TCppWebBrowser-Komponente. Mit Hilfe folgender Routine kann die aktuelle Auswahl als Text oder als HTML-Code in die Zwischenablage kopiert werden. Der Code funktioniert auch auf den Seiten mit Frames.
#include <mshtml.h>

//---------------------------------------------------------------------------
// Funktion CopySelectionToClipboard() kopiert die aktuelle Auswahl im
// TCppWebBrowser in die Zwischenablage
//---------------------------------------------------------------------------
// Übergabeparameter:
//
// TCppWebBrowser* pCppWebBrowser: Zeiger auf die TCppWebBrowser-Instanz
// bool blHtml                   : Format der Daten
//                                 (true: HTML-Code, false: Plain Text)
//---------------------------------------------------------------------------
void CopySelectionToClipboard(TCppWebBrowser* pCppWebBrowser, bool blHtml)
{
  IHTMLDocument2 *HTMLDocument = NULL;
  LONG ilFramesCount = 0;
  wchar_t* wcpSelectedText;

  // Falls eine Seite geladen:
  if(SUCCEEDED(pCppWebBrowser->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 == 0)
      {
        IHTMLSelectionObject* pSelection;
        if(SUCCEEDED(HTMLDocument->get_selection(&pSelection)))
        {
          IHTMLTxtRange* pRange;
          if(SUCCEEDED(pSelection->createRange((LPDISPATCH*)&(pRange))))
          {
            if(blHtml)
            {
              if(SUCCEEDED(pRange->get_htmlText(&wcpSelectedText)))
                Clipboard()->SetTextBuf(AnsiString(wcpSelectedText).c_str());
            }
            else if(SUCCEEDED(pRange->get_text(&wcpSelectedText)))
              Clipboard()->SetTextBuf(AnsiString(wcpSelectedText).c_str());
            pRange->Release();
          }
          pSelection->Release();
        }
      }
      else
      {
        VARIANT vFrame;
        VARIANT ret;
        vFrame.vt = VT_UINT;
        // für jedes Frame:
        for(LONG ilFrameIndex = 0; ilFrameIndex < ilFramesCount; ilFrameIndex++)
        {
          vFrame.lVal = ilFrameIndex;
          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)))
              {
                IHTMLSelectionObject* pSelection;
                if(SUCCEEDED(pDoc->get_selection(&pSelection)))
                {
                  IHTMLTxtRange* pRange;
                  if(SUCCEEDED(pSelection->createRange((LPDISPATCH*)&(pRange))))
                  {
                    if(blHtml)
                    {
                      if(SUCCEEDED(pRange->get_htmlText(&wcpSelectedText)) &&
                        AnsiString(wcpSelectedText).Trim() != EmptyStr)
                        Clipboard()->SetTextBuf(AnsiString(wcpSelectedText).c_str());
                    }
                    else if(SUCCEEDED(pRange->get_text(&wcpSelectedText)) &&
                      AnsiString(wcpSelectedText).Trim() != EmptyStr)
                      Clipboard()->SetTextBuf(AnsiString(wcpSelectedText).c_str());
                    pRange->Release();
                  }
                  pSelection->Release();
                }
                pDoc->Release();
              }
              pWindow->Release();
            }
          }
        }
      }
      pFrames->Release();
    }
    HTMLDocument->Release();
  }
}
Auch der gesamte Inhalt einer Seite kann mit einem Mausklick in die Zwischenablage befördert werden:
TVariant vIn, vOut;
// Alles markieren:
CppWebBrowser->ControlInterface->ExecWB(Shdocvw_tlb::OLECMDID_SELECTALL,
  Shdocvw_tlb::OLECMDEXECOPT_DODEFAULT, &vIn, &vOut);
// Auswahl in die Zwischenablage kopieren:
CopySelectionToClipboard(CppWebBrowser, false);
// Auswahl aufheben:
CppWebBrowser->ControlInterface->ExecWB(Shdocvw_tlb::OLECMDID_CLEARSELECTION,
  Shdocvw_tlb::OLECMDEXECOPT_DODEFAULT, &vIn, &vOut);



Screenshot des Beispielprogramms
Screenshot des Beispielprogramms


  Download BCB6
Projekt-Quellcode
Download
Demo-Exe

© '99-2002 by S. Kreutzmann