Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
TWebBrowser Lafınızı Dinlesin, HTML 5'ten anlasın
#1
AyXzq0.gifMerhaba,

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 bi 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;
                                                              // Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
     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;
                                                              // Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
     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
Cevapla
#2
İçimin büyük bölümü web manipülasyon olduğu için benim adıma çok yararlı bir paylaşım olmuş geniş bir zamanda deneyeceğim...
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#3
(12-11-2017, Saat: 11:39)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olİşimin büyük bölümü web manipülasyon olduğu için benim adıma çok yararlı bir paylaşım olmuş geniş bir zamanda deneyeceğim...

Yararlı bir tekniktir, tavsiye ederim, bu teknikle HTML kod editörü bile yapılabilir. Disk işlemlerine başvurmadığı için daha hızlı çalışır. Ben daha ziyade About Box tarzı işlerde kullanıyorum.

Örnek olması açısından şu linklerdeki HTML 5 demolarını kendi yazdığınız uygulama içinden çalıştırabilirsiniz;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#4
Çok güzel bir çalışma. Emeğinize sağlık.
There's no place like 127.0.0.1
WWW
Cevapla
#5
Ellerinize sağlık.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#6
Elinize sağlık, teşekkürler...
Cevapla
#7
Hocm XP de neden satır arası hatası verir?
Cevapla
#8
Hata mesajını paylaşır mısınız
Cevapla
#9
(13-11-2017, Saat: 19:56)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlHata mesajını paylaşır mısınız

o6qzpX.png
XP, IE sürümü: 8

WİN7 de sıkıntı yok IE Sürüm: 11
Oy8dQ5.png
Cevapla
#10
IE'nin eski sürümlerinde HTML5 komutları desteklenmiyor. Hatta İE'nin mevcut sürümünde de HTML5'in bütün özellikleri desteklenmiyor aslında... Yani sorun XP'deki İE'nin eski bir sürüm olmasından kaynaklanıyor.

Aşağıdaki linkten HTML5 ve CS3'ün hangi özelliklerini hangi tarayıcı destekliyor görmek mümkün;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Web Sitesine Login Olma ve HTML Parse SimaWB 8 659 02-01-2018, Saat: 10:58
Son Yorum: SimaWB
  Web Sitesine Login Olma ve HTML Parse - 2 SimaWB 6 402 13-11-2017, Saat: 10:37
Son Yorum: klavye
  Tüm Platformlar için (cross-platform) HTML Dosyası Oluşturma Fesih ARSLAN 0 979 21-10-2016, Saat: 11:53
Son Yorum: Fesih ARSLAN



Konuyu Okuyanlar: 1 Ziyaretçi