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)
- https://grahamwideman.wikispaces.com/Delphi+TWebBrowser+notes
- http://delphidabbler.com/articles?article=14
- https://msdn.microsoft.com/en-us/library/aa752047(VS.85).aspx (C++)
- https://www.codeproject.com/KB/IP/parse_html.aspx?fid=3219 (C++)
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ış