TWebBrowser Lafınızı Dinlesin, HTML 5’ten Anlasın

Created with Sketch.

TWebBrowser Lafınızı Dinlesin, HTML 5’ten Anlasın

Merhaba, Bu yazımızda TWebBrowser nesnesinde doğrudan HTML kodlarını nasıl çalıştıracağımızı, bir resmi, fotoğrafı disk işlemlerini kullanmadan doğrudan nasıl HTML koduna gömebileceğimizi, HTML5 ile birlikte gelen bazı yenilikleri nasıl kullanabileceğimizi, bu çerçevede bir vektör grafiği nasıl oluşturabileceğimizi inceleyeceğiz. Tüm bunları yapabilmek için önce TWebBrowser nesnesinde doğrudan nasıl HTML kodları çalıştırabileceğimizin alt yapısını kurmayı ve IE’nin HTML5 anlar hale nasıl getirileceği gibi sorunları nasıl aşabileceğimize bakacağız.

Makalemizdeki örnek kodların düzgün çalışabilmesi için XE2 ve üzeri bir Delphi sürümü kullanmanız gerekecek. Eğer daha eski Delphi sürümlerini kullanıyorsanız üzülmeyin, aşağıda paylaşacağım linklerde sizin sürümlere uyan örnek kodlar bulmanız da mümkün olabilir. Lazarus için henüz bir denemem olmadı. (Muhtemelen Lazarus’ta çalışmayacaktır)

Haydi başlayalım;

TWebBrowser’in HTML kodlarını doğrudan çalıştırabilmesi ve ekranda gösterebilmesi için IPersistStreamInit arabiriminden faydalanacağız. Kodların taşınabilirliğini arttırmak ve gereksiz WITH kullanımını önlemek adına biz bu kodları CLASS HELPER tekniğini kullanarak yazacağız. Gerekli açıklamalar kod içerisinde yer alacağı için ayrıca açıklama yapılmayacak. Şahsen yazılan kodun karmaşık olmasını sevmem ve tercih de etmem, ahengin basitlikte yattığına inanır ve o doğrultuda ilerlemeyi tercih ederim. Dolayısıyla kodlar olabildiğince sade ve basit tutulmaya çalışıldı.

...
...
interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    WebBrowser1: TWebBrowser;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  // BU KISMI AYRI BİR UNIT'E ALABİLİRSİNİZ...

  TWebBrowserHelper = class helper for TWebBrowser                         // Sınıf hizmetçisi
    public
      procedure RunHTML(aHTMLCode: String; aApplication: TApplication);    // Doğrudan HTML kodlarını çalıştıracak olan yordamımız
      function GetHTML: String;                                            // TWebBrowser nesnesindeki HTML kodu
      function GetTEXT: String;                                            // TWebBrowser nesnesinde gösterilen sayfadaki text (HTML kodu içermez, düz metindir...)
  end;
  TIEMode = (iemUnknown, iemIE7, iemIE8, iemIE9, iemIE10, iemIE11);
  function SetupIEMode(aAyarla: Boolean; IE_Kipi: TIEMode): LongInt;       // Internet Explorer'in hangi versiyon kipinde çalışacağını YÖNETİR
  function SetIEMode(Mode: TIEMode): boolean;                              // Internet Explorer'in hangi versiyon kipinde çalışacağını BELİRLER
  function GetIEMode: TIEMode;                                             // Internet Explorer'in hangi versiyon kipinde çalıştığını OKUR

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
    Winapi.ActiveX        //  IPersistStreamInit
  , MSHTML                //  IHTMLElement
  , System.Win.Registry   //  TRegistry
  ;

{ TWebBrowserHelper }

procedure TWebBrowserHelper.RunHTML(aHTMLCode: String; aApplication: TApplication);
var
  SS: TStringStream;                             // HTML KodlarımızıTWebBrowser'a aktarmak için kullanacağız
begin
  Navigate('about:blank');                       // TWebBrowser nesnesine temiz bir sayfa açıyoruz.
  try
    while (ReadyState < READYSTATE_INTERACTIVE)  // TWebBrowser'in işinin bitmesini bekliyoruz. Bu arada ana thread'imizin rutinine devam etmesini sağlıyoruz.
       do aApplication.ProcessMessages;          // ProcessMessage'nin bu tarz kullanımı pek önerilmeyebiliyor OnDocumentComplete ve READYSTATE_COMPLETE kullanımı
                                                 // da önerilmektedir fakat bizim örneğimiz için ProcessMessage kullanmak yeterli olacaktır.
                                                 // Daha kompleks, daha sağlamcı yapılar kurmak isterseniz yukarıda değindiğim olay işleyici
                                                 // ve durum bayrağını kullanmak faydalı olabilir...
  finally
    if (Assigned(Document) = TRUE) then begin    // TWebBrowser boş sayfamızı işlemeye hazır ise yükleme işlemine başlayabiliriz...
        SS := TStringStream.Create;
        SS.WriteString(aHTMLCode);               // HTML kodlarımızı StringStream'ımıza yüklüyoruz.
        try
          SS.Seek(0, 0);                         // StringStream'in ilk baytına pozisyonumuzu alıyoruz.
          (Document as IPersistStreamInit)
          .Load(TStreamAdapter.Create(SS));      // TWebBrowser'in Document nesnesine IPersistStreamInit arabirimi vasıtasıyla HTML içeriğimizi yüklüyoruz.
        finally
          SS.Free;                               // Bitti, hepsi bu kadar. Artık HTML kodlarınının sonucunu bir web sayfası olarak görebiliriz...
        end;
    end;
  end;
end;

function TWebBrowserHelper.GetHTML: String;
Var
  E: IHTMLElement;
begin
  Result := '';
  if (Assigned(Document) = TRUE) then begin
      E := (Document as IHTMLDocument2).body;
      while (E.parentElement <> nil) do E := E.parentElement;
      Result := E.outerHTML;
  end;
end;

function TWebBrowserHelper.GetTEXT: String;
var
  Bodi : IHTMLElement;
begin
  Result := '';
  if  (Assigned(Document) = TRUE)
  then Result := (Document as IHTMLDocument2).body.innerText;
end;

TWebBrowser nesnemize doğrudan HTML kodlarını çalıştırma yeteneği kazandırmış olduk. Fakat IE varsayılan olarak HTML5 diyalektiğini kullanmaya ayarlanmadığı için HTML5 kodlarını çalıştırmak istediğinizde boş bir sayfa ile karşılaşabilir veya HTML5 komutlarının gözardı edildiğini görebilirsiniz. Bu sorunu aşmak için ise Registry’de bir ayarlama yapmamız gerekir. Bunu yapsak bile bu ayarı TWebBrowser nesnesini barındıran formun SHOW edilmeden önce gerçekleştirilmesi işletim sistemi tarafından beklenir…
Dolayısıyla aşağıda yer alan örnek kodları kullanmak için formun create edildiği fakat henüz show edilmediği bir noktada bu kodları çağırmanız gerekecektir. Esasen bu kodların tüm uygulama yaşam döngüsü boyunca sadece 1 defa çalıştırılması yeterli olacaktır.

function SetupIEMode(aAyarla: Boolean; IE_Kipi: TIEMode): LongInt;
const
  REG_KEY = 'Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION';
var
  Reg     : TRegistry;
  Value   : LongInt;
  I       : LongInt;
  Uygulama: String;
begin

  Result := 0;
  if  (aAyarla = TRUE )
  and ( IE_Kipi = iemUnknown ) then Exit;                     // IE'nin bilinmeyen (muhtemelen daha yeni) bir sürümüyse çık...

  Uygulama := ExtractFileName(ParamStr(0));                   // Kendi uygulamamızın EXE adı (Mesela "Project1.exe" gibi...)

  Value := 0;
  if (aAyarla = TRUE ) then begin                             // Aşağıdaki kısım ile ilgili olarak şu linki incelemenizi tavsiye ederim;
                                                              // http://www.ahmetaltay.com.tr/2016/02/delphi-twebbrowser-emulasyonu/
     case IE_Kipi of                                          // IE'nin ne şekilde çalışacağını seçiyoruz...
          iemIE7 : Value := 7000;
          iemIE8 : Value := 8888;                             // IE 8  + DOCTYPE spesifikasyonunu destekler
          iemIE9 : Value := 9999;                             // IE 9  + DOCTYPE spesifikasyonunu destekler
          iemIE10: Value := 10001;                            // IE 10 + DOCTYPE spesifikasyonunu destekler
          iemIE11: Value := 11001;                            // IE 11 + DOCTYPE spesifikasyonunu destekler
          else     Value := 11001;                            // IE 11 ve üzeriise IE11 + DOCTYPE spesifikasyonunu destekler
      end;
  end;

  Reg := nil;
  try
    // Bu noktada uygulamamız için REGISTRY'de bir ayarlama yapıyoruz
    // Bu ayarlama uygulamamızın hangi IE sürümüyle çalışacağını
    // İşletim sistemine söylemiş olacak...
    Reg := TRegistry.Create();
    Reg.RootKey := HKEY_CURRENT_USER;
    if (Reg.OpenKey(REG_KEY, True) ) then begin
        if (aAyarla = TRUE) then begin
            Reg.WriteInteger(Uygulama, Value);
            Result := Value;
        end else begin
            Value := Reg.ReadInteger( Uygulama );
        end;
        Reg.CloseKey;
    end;
  except;
    // Herhangi bir hata mesajı görmek istemiyoruz...
  end;

  if (Assigned(Reg) = TRUE) then FreeAndNil(Reg);             // REG nesnesinin Temizliği...

  if (aAyarla = FALSE) and (Value > 0) then begin
      I := Value div 1000;
      if (I >= 7) and (I <= 11) then begin           case I of            7000 : Result := Byte(iemIE7);            8888 : Result := Byte(iemIE8);            9999 : Result := Byte(iemIE9);            10001: Result := Byte(iemIE10);            11001: Result := Byte(iemIE11);           else    if (I >= 12) then Result := Byte(iemIE11);
          end;
      end;
  end;
end;

function SetIEMode(Mode: TIEMode): boolean;
begin
  Result := ( SetupIEMode(TRUE, Mode) > 0 );
end;

function GetIEMode: TIEMode;
begin
  Result := TIEMode( Byte( SetupIEMode(FALSE, iemUnknown) ) );
end;

Bu noktadan sonra uygulamanızın ana formunun en alt satırını şu şekilde düzenlemeniz HTML5 kodlarını TWebBrowser üzerinde çalıştırmanıza imkan tanıyacaktır.

initialization
  SetIEMode( iemIE11);
end.

Örnek uygulama için boş bir VCL Projesi oluşturup form üzerine bir adet TWEBBROWSER ve bir adet TButton nesnesi ekleyin. Button1 nesnesinin onclick olayına aşağıdaki kodu yazıp çalıştırın. Butona bastığınzıda WebBrowser1’de yazdığınız HTML kodlarının derlendiğini göreceksiniz.

Kod bütünlüğünün bozulmaması adına .pas ve .dfm dosya içeriğini aşağıda paylaşıyorum;

unit Ana_;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    WebBrowser1: TWebBrowser;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  // BU KISMI AYRI BİR UNIT'E ALABİLİRSİNİZ...

  TWebBrowserHelper = class helper for TWebBrowser                         // Sınıf hizmetçisi
    public
      procedure RunHTML(aHTMLCode: String; aApplication: TApplication);    // Doğrudan HTML kodlarını çalıştıracak olan yordamımız
      function GetHTML: String;                                            // TWebBrowser nesnesindeki HTML kodu
      function GetTEXT: String;                                            // TWebBrowser nesnesinde gösterilen sayfadaki text (HTML kodu içermez, düz metindir...)
  end;
  TIEMode = (iemUnknown, iemIE7, iemIE8, iemIE9, iemIE10, iemIE11);
  function SetupIEMode(aAyarla: Boolean; IE_Kipi: TIEMode): LongInt;       // Internet Explorer'in hangi versiyon kipinde çalışacağını YÖNETİR
  function SetIEMode(Mode: TIEMode): boolean;                              // Internet Explorer'in hangi versiyon kipinde çalışacağını BELİRLER
  function GetIEMode: TIEMode;                                             // Internet Explorer'in hangi versiyon kipinde çalıştığını OKUR

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
    Winapi.ActiveX        //  IPersistStreamInit
  , MSHTML                //  IHTMLElement
  , System.Win.Registry   //  TRegistry
  ;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1
  .RunHTML( '<!DOCTYPE html>'    // -> HTML5
          + '<html>'
          + '<body>'
          + '<svg height="150" width="400">'    // Bir vektörel Grafik (SVG)
          + '  <defs>'
          + '    <radialGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">'
          + '      <stop offset="0%" style="stop-color:rgb(255,255,0);stop-opacity:1" />'
          + '      <stop offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1" />'
          + '    </radialGradient>'
          + '  </defs>'
          + '  <rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" />'        // Dikdörtgen (Vektör bazlıdır...)
          + '  <ellipse cx="200" cy="70" rx="85" ry="55" stroke="black" stroke-width="4" fill="url(#grad1)" />'     // Elips
          + '  <text fill="#ffffff" font-size="20" font-family="Calibri" x="140" y="80">Uğur PARLAYAN</text>'       // metin
          + '  Maalesef, tarayıcınız satır içi SVG desteklemiyor.'
          + '</svg>'
          + '<canvas id="myCanvas" width="200" height="100" style="border:1px solid #000000;"></canvas>'            // Canvas bir dikdörtgen (pixel bazlıdır...)
          + '<img alt="32x32 Rubicube Logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdF' // bir PNG resim dosyası...
          + 'NvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAAUNSURBVEhLlZZ9UNNlAMcf3rKgSKFICSUUKoo/KvPy+sPyqn+EozquspArhMISeTFizHivMd7GeBsCG8OBUEAiDGy8CAxTYMaGsCGvEw4HHDBIEETkrWc9j7/9+G0D+t7nOI7bPp+D5z'
          + 'n2A+vb2/TiMv7uf25bgTrVfYtc6XtlctHwzBr+2Xa3daBieO7J/G7AuQlSr0PeKOr4vW9qeXW7oS0CRYP3TPndgKcAmRIUQBzIb8/uGl9cXsWvM7zNArm9M8Z5Co0dktFGDiB2c292Ty/gVxuYwUCt6r4RUiPSWyl2hLBH1dnZOTU1tbys/x'
          + 'boD6hUKp+yG1o7JK2FokYwSkXNYnF/f//AwMDExMTS0hJWPJ6ewMLCgkQiOZxZvSGgo0YwSnCA2NjY2OLiInbpBubn59VqdUNDg3NWg9bOlVO8BDAgbmrCbtJmZ2eRcEMA2eGEwkrb7BZsz5YBXyY4HgZ+4gOWWDfQpC8wPT2NnNrAysoKss'
          + 'MVFxeZczs0dmg5TrP3+vxZDy9wzBe4fw/8ksEvVRsCjY3YStrk5CTSagPwfLBereZweRo74wr4+LRHxNHBW2byVhMW3/Gd065Grr6a0ld0EHoB/kIw0KgvMD4+jrTawIMHD7Beraan5cD3m7n7xOW5qAfAaDfo/xtTX2vpxzz0/BeeMONwkp'
          + '7/RwU8MGwlDd5DpNUGiAMYHR2NYTA+/fHUldrd0A5RKbQBxG2JsaDEsb4mvEDAP0ens5KTRSJRb28v1vf3j4yMIK02AM8d2pVKZXx8fGKc54j8GWSH3JVTAwTJTI9guufZ0O+CAgNhqbCgQNreDgNDQ0NIqw3MzMzIpNKf6XTmUdfKdCfCDh'
          + 'nponoJ4jlOgWyn6KLXw88fCY35MjgoIDgoKCUlBR4M0uLA2tpaTU1NmP8ZoePhEvBCc8IT5MBwJ9VLEJdjiwKIKMGbdNaxbF4S/GMgMw7AO9pSXNps9dotsJcPbGQFpuTAUAfVS0AJPMZFcNV7dW1FG5i/JpFbOkM7JAM8N1BvTA7ckVG9BA'
          + 'YCGhYe/qMNjJ6NRXZIgpHVhMKIHBiUUr0EmwTUc5pzxoE7bt8QgXjrnWS7Ugr++hN0t1LVCE0gRX/g7lSnNtDz8hFkbwd2bBd8Qcdvg8ZKwM8Aeemar5cEoLkKKG5QAwEGAgOj13Bg7dGjTlMHFGgGL/I+soD2DjG4mKNR61KWD5qEQH59i0'
          + 'DXUBUOPOxVIjtEBPbw3MwrCqlSvVzg7aCx9wWw9AckvRdxYFZYj+xSsFcAbCLBrohdlnHvmqf5mHETjShSRCr7KVrinlNxB3yiHLzo9iejHGCGznMmB8RdWTgwmZQD7XXAFl7QJGCNYAKrWGAVYbIzxunpJPcdWWEm/6mN01L2hSTY+TH2e0'
          + 'c6eIXZn6BtwDvCwT/ZMSz3VRgQtTNxoO9b+FFiQ6gpJAJrBrCKNrPJSQrnZEZHxvn7RLxC8epCY78v7SPO4N6ssrpWHBJZ+PYHLFNqKdnCLtPtMy47NS+Px+XmZmZmsFKSIn8NDI76xPfcwRO0l8jeH2LfElRGDo7I4NWBZhwgb2l2TlldJw'
          + '6JKjz0IXf/watRTB6HA9W6ZGefT09PYyZG02K+zijy5/x2pqOnYWWV+vBCDVAGP4Xa2lovXy7n8/MoAURVlVChUMD/lfgNOtsiQAw+icB/8a2tLeXll2CstLRUJpMSjw6bbLsB8nSfrgxuff1fnEkfInYK53IAAAAASUVORK5CYII=">'
          + '</body>'
          + '</html>'
          , Application
          );
end;

{ TWebBrowserHelper }

procedure TWebBrowserHelper.RunHTML(aHTMLCode: String; aApplication: TApplication);
var
  SS: TStringStream;                             // HTML KodlarımızıTWebBrowser'a aktarmak için kullanacağız
begin
  Navigate('about:blank');                       // TWebBrowser nesnesine temiz bir sayfa açıyoruz.
  try
    while (ReadyState < READYSTATE_INTERACTIVE)  // TWebBrowser'in işinin bitmesini bekliyoruz. Bu arada ana thread'imizin rutinine devam etmesini sağlıyoruz.
       do aApplication.ProcessMessages;          // ProcessMessage'nin bu tarz kullanımı pek önerilmeyebiliyor OnDocumentComplete ve READYSTATE_COMPLETE kullanımı
                                                 // da önerilmektedir fakat bizim örneğimiz için ProcessMessage kullanmak yeterli olacaktır.
                                                 // Daha kompleks, daha sağlamcı yapılar kurmak isterseniz yukarıda değindiğim olay işleyici
                                                 // ve durum bayrağını kullanmak faydalı olabilir...
  finally
    if (Assigned(Document) = TRUE) then begin    // TWebBrowser boş sayfamızı işlemeye hazır ise yükleme işlemine başlayabiliriz...
        SS := TStringStream.Create;
        SS.WriteString(aHTMLCode);               // HTML kodlarımızı StringStream'ımıza yüklüyoruz.
        try
          SS.Seek(0, 0);                         // StringStream'in ilk baytına pozisyonumuzu alıyoruz.
          (Document as IPersistStreamInit)
          .Load(TStreamAdapter.Create(SS));      // TWebBrowser'in Document nesnesine IPersistStreamInit arabirimi vasıtasıyla HTML içeriğimizi yüklüyoruz.
        finally
          SS.Free;                               // Bitti, hepsi bu kadar. Artık HTML kodlarınının sonucunu bir web sayfası olarak görebiliriz...
        end;
    end;
  end;
end;

function TWebBrowserHelper.GetHTML: String;
Var
  E: IHTMLElement;
begin
  Result := '';
  if (Assigned(Document) = TRUE) then begin
      E := (Document as IHTMLDocument2).body;
      while (E.parentElement <> nil) do E := E.parentElement;
      Result := E.outerHTML;
  end;
end;

function TWebBrowserHelper.GetTEXT: String;
var
  Bodi : IHTMLElement;
begin
  Result := '';
  if  (Assigned(Document) = TRUE)
  then Result := (Document as IHTMLDocument2).body.innerText;
end;

function SetupIEMode(aAyarla: Boolean; IE_Kipi: TIEMode): LongInt;
const
  REG_KEY = 'Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION';
var
  Reg     : TRegistry;
  Value   : LongInt;
  I       : LongInt;
  Uygulama: String;
begin

  Result := 0;
  if  (aAyarla = TRUE )
  and ( IE_Kipi = iemUnknown ) then Exit;                     // IE'nin bilinmeyen (muhtemelen daha yeni) bir sürümüyse çık...

  Uygulama := ExtractFileName(ParamStr(0));                    // Kendi uygulamamızın EXE adı (Mesela "Project1.exe" gibi...)

  Value := 0;
  if (aAyarla = TRUE ) then begin                             // Aşağıdaki kısım ile ilgili olarak şu linki incelemenizi tavsiye ederim;
                                                              // http://www.ahmetaltay.com.tr/2016/02/delphi-twebbrowser-emulasyonu/
     case IE_Kipi of                                          // IE'nin ne şekilde çalışacağını seçiyoruz...
          iemIE7 : Value := 7000;
          iemIE8 : Value := 8888;                             // IE 8  + DOCTYPE spesifikasyonunu destekler
          iemIE9 : Value := 9999;                             // IE 9  + DOCTYPE spesifikasyonunu destekler
          iemIE10: Value := 10001;                            // IE 10 + DOCTYPE spesifikasyonunu destekler
          iemIE11: Value := 11001;                            // IE 11 + DOCTYPE spesifikasyonunu destekler
          else     Value := 11001;                            // IE 11 ve üzeriise IE11 + DOCTYPE spesifikasyonunu destekler
      end;
  end;

  Reg := nil;
  try
    // Bu noktada uygulamamız için REGISTRY'de bir ayarlama yapıyoruz
    // Bu ayarlama uygulamamızın hangi IE sürümüyle çalışacağını
    // İşletim sistemine söylemiş olacak...
    Reg := TRegistry.Create();
    Reg.RootKey := HKEY_CURRENT_USER;
    if (Reg.OpenKey(REG_KEY, True) ) then begin
        if (aAyarla = TRUE) then begin
            Reg.WriteInteger(Uygulama, Value);
            Result := Value;
        end else begin
            Value := Reg.ReadInteger( Uygulama );
        end;
        Reg.CloseKey;
    end;
  except;
    // Herhangi bir hata mesajı görmek istemiyoruz...
  end;

  if (Assigned(Reg) = TRUE) then FreeAndNil(Reg);             // REG nesnesinin Temizliği...

  if (aAyarla = FALSE) and (Value > 0) then begin
      I := Value div 1000;
      if (I >= 7) and (I <= 11) then begin           case I of            7000 : Result := Byte(iemIE7);            8888 : Result := Byte(iemIE8);            9999 : Result := Byte(iemIE9);            10001: Result := Byte(iemIE10);            11001: Result := Byte(iemIE11);           else    if (I >= 12) then Result := Byte(iemIE11);
          end;
      end;
  end;
end;

function SetIEMode(Mode: TIEMode): boolean;
begin
  Result := ( SetupIEMode(TRUE, Mode) > 0 );
end;

function GetIEMode: TIEMode;
begin
  Result := TIEMode( Byte( SetupIEMode(FALSE, iemUnknown) ) );
end;

initialization
  SetIEMode( iemIE11);

end.

Bu da DFM dosyasıdır…

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 299
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  DesignSize = (
    635
    299)
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 8
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object WebBrowser1: TWebBrowser
    Left = 8
    Top = 39
    Width = 619
    Height = 252
    Anchors = [akLeft, akTop, akRight, akBottom]
    TabOrder = 1
    ControlData = {
      4C000000FA3F00000C1A00000000000000000000000000000000000000000000
      000000004C000000000000000000000001000000E0D057007335CF11AE690800
      2B2E126208000000000000004C0000000114020000000000C000000000000046
      8000000000000000000000000000000000000000000000000000000000000000
      00000000000000000100000000000000000000000000000000000000}
  end
end

 

Yorum yapılmamış

Yorumunuzu ekleyin