Dnes opustíme na čas téma DLL knihoven a podíváme se opět po čase na komponentu WebBrowser. Tentokrát budeme zkoumat, do jaké zóny patří načtený dokument.
Používáte-li Internet Explorer, jistě víte, že se na stavovém řádku okna zobrazuje informace o tom, v jaké zóně se právě nacházíme. Může to být
Internet,
Tento počítač,
Místní intranet a další možnosti. Kromě popisu má každá zóna i svou ikonu. Z komponenty
WebBrowser pochopitelně tyto údaje lze pro načtený dokument získat rovněž, neboť se prakticky jedná o Internet Explorer. A právě to se dnes naučíme.
Naše aplikace bude velmi jednoduchá. Na prázdný formulář nejprve umístíme komponentu WebBrowser, dále Edit, tlačítko, Image a dvakrát Label. Aplikace bude pracovat tak, že po zadání požadované adresy (lokálního dokumentu či webové adresy) do Editu a odeslání stiskem tlačítka bude dokument načten do WebBrowseru a poté se zobrazí název zóny (první Label) a její popis (druhý Label). Do komponenty Image se pak načte příslušející ikona.
Důležitý je pro nás unit URLMon, ve kterém je definován typ TZoneAttributes, který potřebné údaje popisuje. S využitím dalších funkcí tohoto unitu pak získáme požadovaná data včetně ikony. Po načtení dokumentu je v události OnNavigateComplete2 spuštěna celá akce.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, StdCtrls, URLMon, ExtCtrls;
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure WebBrowser1NavigateComplete2(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure GetZoneIcon(IconPath: string; var Icon: TIcon);
var
FName, ImageName: string;
h: hInst;
begin
FName := Copy(IconPath, 1, Pos(`#`, IconPath) - 1);
ImageName := Copy(IconPath, Pos(`#`, IconPath), Length(IconPath));
h := LoadLibrary(Pchar(FName));
try
if h <> 0 then Icon.Handle := LoadImage(h, Pchar(ImageName), IMAGE_ICON, 16, 16, 0);
finally
FreeLibrary(h);
end;
end;
function GetZoneAttributes(const URL: string): TZoneAttributes;
var
dwZone: Cardinal;
ZoneAttr: TZoneAttributes;
var
ZoneManager: IInternetZoneManager;
SecManager: IInternetSecurityManager;
begin
ZeroMemory(@ZoneAttr, SizeOf(TZoneAttributes));
if CoInternetCreateSecuritymanager(nil, SecManager, 0) = S_OK then
if CoInternetCreateZoneManager(nil, ZoneManager, 0) = S_OK then
begin
SecManager.MapUrlToZone(PWideChar(WideString(URL)), dwZone, 0);
ZoneManager.GetZoneAttributes(dwZone, Result);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate(Edit1.Text);
end;
procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
var
ZoneAttr: TZoneAttributes;
ZoneIcon: TIcon;
begin
ZoneAttr := GetZoneAttributes(Webbrowser1.LocationURL);
ZoneIcon := TIcon.Create;
try
GetZoneIcon(ZoneAttr.szIconPath, ZoneIcon);
Label1.Caption := ZoneAttr.szDisplayName;
Label2.Caption := ZoneAttr.szDescription;
Image1.Picture.Icon := ZoneIcon;
finally
ZoneIcon.Free;
end;
end;
end.
A k čemu nám tahle informace vlastně může sloužit? Určitě na něco přijdete sami. V dnešních aplikacích je často integrován nějaký miniprohlížeč (kupříkladu pro zobrazení stránek výrobce programu) a kontrolovat, ve které zóně se pohybujeme, může být užitečné třeba z bezpečnostních důvodů.
To bude pro dnešek vše. Jako obvykle, ukázkový projekt můžete stahovat zde.