FAQ VCL
Компоненты\WebBrowser

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как разобрать загруженную страницу?

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.Navigate('http://ya.ru');
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; const [Ref] URL: OleVariant);

  procedure Build(collection: OleVariant; Root: TTreeNode);
  var
    elem: OleVariant;
    i: integer;
    tag: WideString;
  begin
    for i := 0 to collection.length-1 do
    begin
      elem := collection.item(i, tag);
      tag := elem.tagName;
      TreeView1.Items.AddChild(Root, tag);
      Build(elem.children, TreeView1.Items[TreeView1.Items.Count-1]);
    end;
  end;

var
  doc: OleVariant;
begin
  doc := WebBrowser1.Document;
  TreeView1.Items.Clear;
  Build(doc.all.item(0, '').children, TreeView1.TopItem);
  Build(doc.all.item(1, '').children, TreeView1.TopItem);
end;


Как вызвать скрытые команды в TWebBrowser?

const
  // Command IDs Handled by 'Shell DocObject View'
  ID_IE_FILE_PAGESETUP           = 259;
  ID_IE_FILE_PRINT               = 260;
  ID_IE_FILE_NEWWINDOW           = 275;
  ID_IE_FILE_PRINTPREVIEW        = 277;
  ID_IE_FILE_NEWMAIL             = 279;
  ID_IE_FILE_SENDPAGE            = 282;
  ID_IE_FILE_SENDLINK            = 283;
  ID_IE_FILE_SENDDESKTOPSHORTCUT = 284;
  ID_IE_HELP_VERSIONINFO         = 336;
  ID_IE_HELP_HELPINDEX           = 337;
  ID_IE_HELP_WEBTUTORIAL         = 338;
  ID_IE_HELP_FREESTUFF           = 341;
  ID_IE_HELP_PRODUCTUPDATE       = 342;
  ID_IE_HELP_FAQ                 = 343;
  ID_IE_HELP_ONLINESUPPORT       = 344;
  ID_IE_HELP_FEEDBACK            = 345;
  ID_IE_HELP_BESTPAGE            = 346;
  ID_IE_HELP_SEARCHWEB           = 347;
  ID_IE_HELP_MSHOME              = 348;
  ID_IE_HELP_VISITINTERNET       = 349;
  ID_IE_HELP_STARTPAGE           = 350;
  ID_IE_HELP_NETSCAPEUSER        = 351;
  ID_IE_FILE_IMPORTEXPORT        = 374;
  ID_IE_HELP_ENHANCEDSECURITY    = 375;
  ID_IE_FILE_ADDTRUST            = 376;
  ID_IE_FILE_ADDLOCAL            = 377;
  ID_IE_FILE_NEWPUBLISHINFO      = 387;
  ID_IE_FILE_NEWPEOPLE           = 390;
  ID_IE_FILE_NEWCALL              =395;
  // Command IDs Handled by 'Internet Explorer_Server'
  ID_IE_CONTEXTMENU_NEWWINDOW    = 2137;
  ID_IE_CONTEXTMENU_ADDFAV       = 2261;
  ID_IE_CONTEXTMENU_REFRESH      = 6042;

function GetIEHandle(WebBrowser: TWebbrowser; ClassName: string): HWND;
var
  hwndChild, hwndTmp: HWND;
  oleCtrl: TOleControl;
  szClass: array [0..255] of Char;
begin
  oleCtrl := WebBrowser;
  hwndTmp := oleCtrl.Handle;

  while True do
  begin
    hwndChild := GetWindow(hwndTmp, GW_CHILD);
    GetClassName(hwndChild, szClass, SizeOf(szClass));
    if string(szClass) = ClassName then
    begin
      Result := hwndChild;
      Exit;
    end;
    hwndTmp := hwndChild;
  end;

  Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Вызов диалога "Add To Favorite"
  SendMessage(GetIEHandle(WebBrowser1, 'Internet Explorer_Server'),
              WM_COMMAND, ID_IE_CONTEXTMENU_ADDFAV, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // Вызов диалога "Import/Export Wizard"
  SendMessage(GetIEHandle(WebBrowser1, 'Shell DocObject View'),
              WM_COMMAND, ID_IE_FILE_IMPORTEXPORT, 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.decoding.dax.ru');
end;


Как очистить кэш в TWebBrowser?

uses
  WinInet;

procedure EmptyIECache;
var
  lpEntryInfo: PInternetCacheEntryInfo;
  hCacheDir: LongWord;
  dwEntrySize: LongWord;
  dwLastError: LongWord;
begin
  dwEntrySize := 0;
  FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
  GetMem(lpEntryInfo, dwEntrySize);

  try
    hCacheDir := FindFirstUrlCacheEntry(nil, lpEntryInfo^, dwEntrySize);
    if hCacheDir <> 0 then
      DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName);
  finally
    FreeMem(lpEntryInfo);
  end;

  try
    repeat
      dwEntrySize := 0;
      FindNextUrlCacheEntry(hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize);
      dwLastError := GetLastError;
      if GetLastError = ERROR_INSUFFICIENT_BUFFER then
      begin
        GetMem(lpEntryInfo, dwEntrySize);
        if FindNextUrlCacheEntry(hCacheDir, lpEntryInfo^, dwEntrySize) then
          if not DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName) then
          begin
            UnlockUrlCacheEntryFile(lpEntryInfo^.lpszSourceUrlName, 0);
            DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName);
          end;
        FreeMem(lpEntryInfo);
      end;
    until (dwLastError = ERROR_NO_MORE_ITEMS) or (dwLastError = ERROR_INVALID_PARAMETER);
  finally
    FindCloseUrlCache(hCacheDir);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EmptyIECache;
end;


Как проверить доступность команды в TWebBrowser?

procedure TForm1.Button1Click(Sender: TObject);
var
  Flags: TOleEnum; // OLECMDF
  s: string;
begin
  Flags := WebBrowser1.QueryStatusWB(OLECMDID_OPTICAL_ZOOM);

  s := '';
  if Flags and OLECMDF_SUPPORTED = OLECMDF_SUPPORTED then
    s := s + 'Команда поддерживается'#13;
  if Flags and OLECMDF_ENABLED = OLECMDF_ENABLED then
    s := s + 'Команда поддерживается и разрешена'#13;
  if Flags and OLECMDF_LATCHED = OLECMDF_LATCHED then
    s := s + 'Команда – переключатель и сейчас включена'#13;
  if Flags and OLECMDF_NINCHED = OLECMDF_NINCHED then
    s := s + 'Зарезервировано'#13;
  ShowMessage(s);
end;


Как изменить коэффициент масштабирования страницы в TWebBrowser?

// IE 7 и выше
procedure TForm1.Button1Click(Sender: TObject);
var
  ZoomFac: OLEVariant;
begin
  ZoomFac := 140;
  WebBrowser1.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, ZoomFac);
end;


Как узнать коэффициенты границ масштабарования шрифта в TWebBrowser?

procedure TForm1.Button1Click(Sender: TObject);
var
  ZoomFac: OLEVariant;
  MinZoom, MaxZoom: Word;
begin
  WebBrowser1.ExecWB(OLECMDID_GETZOOMRANGE,
    OLECMDEXECOPT_DONTPROMPTUSER, Null, ZoomFac);

  MinZoom := LoWord(ZoomFac);
  MaxZoom := HiWord(ZoomFac);
end;


Как узнать коэффициенты границ масштабарования страницы в TWebBrowser?

// IE 7 и выше
procedure TForm1.Button2Click(Sender: TObject);
var
  ZoomFac: OLEVariant;
  MinZoom, MaxZoom: Word;
begin
  WebBrowser1.ExecWB(OLECMDID_OPTICAL_GETZOOMRANGE,
    OLECMDEXECOPT_DONTPROMPTUSER, Null, ZoomFac);

  MinZoom := LoWord(ZoomFac);
  MaxZoom := HiWord(ZoomFac);
end;


Как изменить HTML-код в TWebBrowser?

uses
  MSHTML;

// В данном примере в страницу внедряется стиль, который при выводе
// на печать поворачивает содержимое страницы на 90° (хорошо
// подходит для разворота отфтрматированных одностраничных документов)

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.Navigate('http://ya.ru');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Document: IHTMLDocument2;
  Collection: IHTMLElementCollection;
  Element: IHTMLElement;
begin
  Document := WebBrowser1.Document as IHtmlDocument2;
  Collection := Document.All.Tags('HEAD') as IHTMLElementCollection;
  Element := Collection.Item(NULL, 0) as IHTMLElement;
  // Первый параметр insertAdjacentHTML может быть:
  //  • afterBegin  — вставляет строку после открывающего тега элемента
  //  • beforeBegin — вставляет строку перед открывающим тегом элемента
  //  • afterEnd    — вставляет строку после закрывающего тега элемента
  //  • beforeEnd   — вставляет строку перед закрывающим тегом элемента
  Element.insertAdjacentHTML(
    'afterBegin',
    ''
  );
  // В некоторых случаях при повороте могут потребоваться масштабирование и сдвиг:
  // 
  // Кроме того можно вставлять простой текст с помощью метода insertAdjacentText
end;


Как распечатать страницу из TWebBrowser с ожиданием завершения печати?

uses
  MSHTML;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.Navigate('http://decoding.dax.ru');
end;

procedure WB_ShowPrintDialog(WB: TWebbrowser; ShowPrintDialog: Boolean = True);
var
  vIn, vOut: OleVariant;
  UserAction: Cardinal;
const
  PRINT_DONTBOTHERUSER    = $01; // Не беспокоить пользователя
  PRINT_WAITFORCOMPLETION = $02; // Дождаться завершения
  // Внимание, если указаны два значения - PRINT_DONTBOTHERUSER и OLECMDEXECOPT_PROMPTUSER,
  // PRINT_DONTBOTHERUSER имеет приоритет и диалоговое окно "печать" не отображается.
begin
  if ShowPrintDialog then
    UserAction := OLECMDEXECOPT_PROMPTUSER
  else
    UserAction := OLECMDEXECOPT_DONTPROMPTUSER;

  TVarData(vIn).VType := varSmallint;
  TVarData(vIn).VSmallInt := PRINT_WAITFORCOMPLETION;

  try
    WB.ExecWB(OLECMDID_PRINT, UserAction, vIn, vOut);
    ShowMessage('Печать окончена');
  except
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WB_ShowPrintDialog(WebBrowser1);
  // WB_ShowPrintDialog(WebBrowser1, False);
end;


Как убрать header и footer при печати страницы из TWebBrowser?

// Способ первый - через OLECMDID_PRINTPREVIEW (диалог предварительного просмотра)
uses
  Registry, MSHTML;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.Navigate('http://decoding.dax.ru');
end;

procedure WB_ShowPrintDialog(WB: TWebbrowser; ShowPrintDialog: Boolean = True);
var
  vIn, vOut: OleVariant;
  UserAction: Cardinal;
  Reg: TRegistry;
  Header, Footer: string;
begin
  if ShowPrintDialog then
    UserAction := OLECMDEXECOPT_PROMPTUSER
  else
    UserAction := OLECMDEXECOPT_DONTPROMPTUSER;

  Reg := TRegistry.Create;

  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('Software\Microsoft\Internet Explorer\PageSetup', False) then
    begin
      Header := Reg.ReadString('header');
      Footer := Reg.ReadString('footer');

      Reg.WriteString('header', '');
      Reg.WriteString('footer', '');

      WB.ExecWB(OLECMDID_PRINTPREVIEW, UserAction, vIn, vOut);
    end;
  finally
    Reg.WriteString('header', Header);
    Reg.WriteString('footer', Footer);
    Reg.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WB_ShowPrintDialog(WebBrowser1);
  // WB_ShowPrintDialog(WebBrowser1, False);
end;

// Способ второй - через OLECMDID_PRINT (диалог печати)
// Нужно дождаться окончания печати, и только после этого
// восстанавливать значения параметров реестра.
uses
  Registry, MSHTML;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.Navigate('http://decoding.dax.ru');
end;

procedure WB_ShowPrintDialog(WB: TWebbrowser; ShowPrintDialog: Boolean = True);
var
  vIn, vOut: OleVariant;
  UserAction: Cardinal;
  Reg: TRegistry;
  Header, Footer: string;
const
  PRINT_DONTBOTHERUSER    = $01; // Не беспокоить пользователя
  PRINT_WAITFORCOMPLETION = $02; // Дождаться завершения
  // Внимание, если указаны два значения - PRINT_DONTBOTHERUSER и OLECMDEXECOPT_PROMPTUSER,
  // PRINT_DONTBOTHERUSER имеет приоритет и диалоговое окно "печать" не отображается.
begin
  if ShowPrintDialog then
    UserAction := OLECMDEXECOPT_PROMPTUSER
  else
    UserAction := OLECMDEXECOPT_DONTPROMPTUSER;

  TVarData(vIn).VType := varSmallint;
  TVarData(vIn).VSmallInt := PRINT_WAITFORCOMPLETION;

  Reg := TRegistry.Create;

  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('Software\Microsoft\Internet Explorer\PageSetup', False) then
    begin
      Header := Reg.ReadString('header');
      Footer := Reg.ReadString('footer');

      Reg.WriteString('header', '');
      Reg.WriteString('footer', '');

      WB.ExecWB(OLECMDID_PRINT, UserAction, vIn, vOut);
    end;
  finally
    Reg.WriteString('header', Header);
    Reg.WriteString('footer', Footer);
    Reg.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WB_ShowPrintDialog(WebBrowser1);
  // WB_ShowPrintDialog(WebBrowser1, False);
end;

При использовании материала - ссылка на сайт обязательна