1 Haziran 2009 Arşivi

Delphi & JavaScript Kardeşliği

// 1 Haziran 2009 // 7 Yorum » // Delphi, Internet, Programlama

Son zamanlarda bir raporlama aracının Delphi’ye adaptasyonu ile uğraşıyorum. Bu aracın adı Fusion Charts. Son derece şık ve yetenekli bir araç. Arka planında Flash animasyonları kullanan, kendisine veriyi XML üzerinden alabilen , HTML & JavaScript kullanarak flash nesnelerinin erişimine müsaade eden bir raporlama aracı. Bu hali ile Fusion Charts aracı; Delphi üzerinde TWebBrowser nesnesi vasıtası ile rahatlıkla kullanılabiliyor. Yeterki uygulamanızın çalıştığı klasörde ihtiyaç duyduğu dosyalar olsun. Benim ileride yazacağım Fusion Charts & Delphi entegrasyonunda XML, HTML ve JavaScript dosyalarına gerek olmayacak. Ama bu raporlama aracı üzerinde çalışırken, JavaScript’e amiyane tabir ile biraz bulaşmak durumunda kaldım.

Meraklı bir mizacım olduğu için, Delphi üzerinde TWebBrowser nesnesi vasıtası ile bir JavaScript sınıfını yada metodunu kullanıp kullanamayacağımı araştırdım. Ve gördüm ki, bizim sevgili Delphi’mizin yapamayacağı şey yok :) Delphi üzerinden TWebBrowser nesnesi vasıtası ile(daha doğru bir ifade ile COM vasıtası ile) JavaScript’e ulaşmak ve JavaScript kodları çalıştırmak mümkün. Öncelikle söylemek isterim ki; JavaScript konusunda pek bilgili sayılmam. Dolayısı ile yazacağım örnekler sizlere basit gelirse yahut bazı hatalarım olursa şimdiden affınıza sığınırım.

Herşeyden evvel, TWebBrowser nesnesi kendisine yükleyeceği bir HTML dosya alır. Bu dosya disk üzerinde yada internet üzerinde bir yerdedir ve TWebBrowser’ın Navigate metoduna parametre olarak aktarılır. Navigate metodu, kendisine verilen HTML dosyayı yada linkin gösterdiği verileri parse eder ve TWebBrowser üzerinde gösterir. Buraya kadar herşey normal. Lâkin ben yapım gereği disk üzerinde bulunan dosyalar ile çalışmayı pek sevmem. Bu dosyaların bozulabilme ihtimalleri yada silinebilme ihtimallerinin olması programınızın doğru çalışmasını engelleyeceği için dosya erişimli yöntemlerden mümkün mertebe uzak kalmanızı tavsiye ederim. Bu bağlamda yaptığım araştırma sonucu, pek çok kaynakta HTML kaynak kodlarının herhangi bir dosyaya ihtiyaç duymadan TWebBrowser nesnesinde gösterilebildiğini öğrendim. Bulduğum metod aşağıdaki gibidir:

procedure LoadHTML(WebBrowser: TWebBrowser; HTMLCode: String);
var
  sl: TStringList;
  ms: TMemoryStream;
begin
  WebBrowser.Navigate('about:blank') ;

  if Assigned(WebBrowser.Document) then
  begin
     sl := TStringList.Create;
     try
        ms := TMemoryStream.Create;
        try
           sl.Text := HTMLCode;
           sl.SaveToStream(ms);
           ms.Seek(0, 0);
           (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
        finally
           ms.Free;
        end;
     finally
        sl.Free;
     end;
  end;
end;

(more…)