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;

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