Delphi TWebBrowser Emulasyonu

Merhabalar, bilindiği üzere delphi uygulamalarında ki TWebBrowser bileşeni varsayılan olarak internet explorer 6 ile çalışmaktadır. Bu yazıda sizlere kendi uygulamalarınız içerisinde ki TWebBrowser bileşenin varsayılan internet explorer sürümünü değiştirmeyi göstereceğim.

Microsoft, registry’de işletim sistemi üzerinde çalışan programların kendi içlerinde activex denetimi olarak kullandıkları browser sürümlerini emule edebileceği bir değer dizisi tutmaktadır. Bizde bu değer dizisine kendi uygulama adımızı ekleyerek hangi browser sürümünü kullanacağını söyleyebiliriz.

Regedit e girip;
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
altında sağ tıklayıp “Yeni”->“DWORD32 Bit Değer” tıkladıktan sonra Değer Adına “UygulamanızınAdı.exe” yazıp
Değer verisinede ondalıklı olarak aşağıda belirttiğim, kullanmak istediğiniz internet explorer sürümüne karşılık gelen değerlerden birini yazabilirsiniz. Bu işlemi yaptıktan sonra kendi programınızı kapatıp tekrar açmanız gerekmektedir. Program tekrar açıldığında TWebBrowser belirttiğiniz Internet Explorer sürümü ile çalışacaktır.

Internet Explorer 7: 7000
Internet Explorer 8: 8000
Internet Explorer 8 !DOCTYPE: 8888
Internet Explorer 9:9000
Internet Explorer 9 !DOCTYPE: 9999
Internet Explorer 10: 10000
Internet Explorer 10 !DOCTYPE: 10001
Internet Explorer 11: 11000
Internet Explorer 11 !DOCTYPE: 11001

MSDN

Örneğin uygulamanızın adı Tarayici.exe olsun ve bu uygulama internet explorer 11 ile çalışmak istesin. Registry kaydı aşağıdaki gibi olacaktır.

Browser Emulasyonu
Internet Explorer Emulasyonu Registry Görüntüsü

Delphi Attribute

Bu yazımda Delphi de Attribute kullanımını anlatacağım. Daha önce C# veya Java ile uğraşanlar attribute kavramını bilirler. Fakat bilmeyenler için kısaca açıklayalım; Attribute: özellik, nitelik demektir. Kullanıldıkları yerde ayırt edici, niteleyici, gruplayıcı veya ekstra nitelik kazandırıcı bir etki gösterirler. Delphi de attribute tanımlamak için köşeli parantez operatörleri kullanılır.

Örneğin:
[xml (‘AdSoyad’)]
[donusum (TDonusumEnum.json)]

Not: Attribute’ler TCustomAttribute sınıfından türetilmelidir.
Not: Attribute kavramı Delphi 2010 ve sonra ki sürümlerde mevcuttur.

Şimdi bir örnek ile kendimize özel bir attribute tanımlayalım ve RTTI yardımı ile kullandığımız yerlerde ki değerlerini okuyalım.

Yeni bir proje açın ve yukardaki uPersonel.pas dosyasını projenize ekleyin ardından projenize bir adet TButton ve TMemo nesnesi ekleyin ve alttaki kodları da button1.click event’ına yazın.

Butonu tıkladığınızda TPersonel sınıfının elemanlarının xml ve json formatında çıktılarını göreceksiniz. Bu örnek, Attribute ve RTTI sisteminin nasıl çalıştığını anlatmak için özet bir uygulamaydı. İsteğinize göre geliştirip sınıfı komple json yada xml formatına çeviren parser da yazabilirsiniz.

Ekran çıktısı;

Bu örneği Delphi xe7 versiyonunda yazdım. Delphi 2010 ve sonrasında da sorunsuz çalışacaktır.

DLL DEBUGGING

Delphi ile yazdığımız DLL kütüphanelerini Debug etmek ilk başta karmaşık yada çok zor gibi algılansa da ne kadar basit olduğunu göstereceğim.

Öncelikle Delphi sağ tıklayıp “Yönetici” olarak çalıştırın. DLL projenizi açın. “Project Manager” dan projeyi sağ tıklayın “Options” menüsene girin. Solda ki listeden “Debugger” ı tıklayın. Sağ tarafta açılan menüde “Host Application” a DLL i kullanan uygulamayı (exe) seçin. Ok tıklayıp çıkın. F9 ile DLL projenizi çalıştırın. DLL derlendikten sonra Host uygulaması çalışacaktır ve delphi debug moda geçecektir. Artık DLL içersinde herhangi bir yere breakpoint ekleyip debug işlemlerine başlayabilirsiniz.

Önemli bir nokta var belirtmek istediğim. Beni baya uğraştırmıştı ilk başta. Delphiyi Yönetici olarak çalıştırmazsanız F9 yaptığınızda “Unable to create process: İstenen işlem için yükseltme gerekiyor.” hata mesajının benzeri ile karşılaşabilirsiniz. Vista ve üzeri sistemlerde Delphiyi yönetici olarak çalıştırmayı unutmayın.

Yönetici Olarak Çalıştırmak (UAC)

Sizlerde Delphi ile yazdığımız programlarda windows vista ve sonrasında yetki sıkıntıları yaşamışsınızdır. Örneğin registry erişimi, windows klasörlerine yazma okuma, bilgisayar saatini değiştirme, parasal ve ondalık ayracı değiştirme, tarih saat formatı değiştirme gibi. Özellikle Windows 8 ve 8.1 de daha fazla kısıtlama getirilmiş, doğrudan sistem kurulu olan sürücüye yazmak için yönetici hakkı istemektedir. “C:\ altına”, “C:\Program Files”, “C:\Program Files(x86)” gibi…

Yetki sıkıntısını aşmanın yolu manifest dosyasından geçiyor. Delphi 2010 ve önce ki sürümlerinde. IDE varsayılan bir manifest dosyası oluşturuyor ve derleme esnasında bu dosya kullanılıyor. Bu dosya üzerinde işletim sisteminden yönetici yetkisi istenmiyor, uygulama varsayılan seviyede çalıştırılıyor.

Şimdi kendi manifest dosyamızı oluşturup proje içersine ekleyerek Delphinin oluşturduğu manifest dosyasını ezelim.

Aşağıda ki dosyaları bir klasör içersine kaydediniz.

WinUAC.manifest

 “equireAdministrator” ile yönetici olarak çalışacağını belirttik. Burda ki önemli noktalardan birisi de <dependency> tanımlama kısmıdır. “Microsoft.Windows.Common-Controls” tanımlaması ile kontrollerin modern windows teması şeklinde görüntülenmesini sağlar. Bu tanımlama olmaz ise uygulamadaki kontroller win 98 stili şeklinde görünecektir. (Delphi 6 da olduğu gibi).

WinUAC.rc

rc dosyamızda ID si 1 olan ve tipi 24 olan bir resource oluşturuyoruz. ID si 1 olan resource delphi içersinde gömülü olan masnifest dosyasıdır. Bizde onu ezecek olan dosyayı oluşturmuş olduk.

Compile.bat

rc dosyasını brcc32.exe ile resource haline getiriyoruz.

Şimdi bu res dosyasını delphi projemize eklemek kaldı.

Öncelikle “Project Options” dan Enable Runtime Themas ın işaretini kaldırıyoruz. Proje dosyamıza alttaki kodu ekleyerek res dosyasını programa dahil etmiş oluyoruz.

Şimdi projeyi derlediğimiz zaman UAC açık ise programı açmaya çalıştığınızda yönetici hakları isteyen windows penceresi ile karşılaşacaksınız. UAC kapalı ise her hangi bir pencere gelmeden program direk yönetici olarak çalışacaktır.

Not: Eğer Delphi Xe 2 ve sonrası sürümlerini kullanıyorsanız. “Project Options” altında “Use Custom Manifest” seçeneğinden yukarıda oluşturduğumuz WinUAC.manifest dosyasını göstermeniz yeterli olacaktır. Res haline çevirip projeye koymanıza gerek kalmayacak bu işlemi bizim yerimize Delphinin kendisi halledecektir.

Google Text to Speech API

Bu yazımda Google Text to Speech kullanarak Delphi ile yazıları ses dosyalarına dönüştürmeyi ve bu ses dosyalarını delphi içersinden çalıştırmayı göstereceğim. Bunun için öncelikle geliştirmiş olduğum uGTTS.pas kütüphanesine ihtiyacımız olacak. Kütüphaneyi geliştirirken içersinde dökümantasyonu bolca kullanmaya çalıştım. Methodların üzerine gelerek ne işe yaradıklarını ve dikkat edilmesi gereken hususları görebilirsiniz.

Bu kütüphane kullanımı internet bağlantısı gerektirir. Ön bellekleme mekanizması ile daha önce çağrılmış olan yazıları tekrar google servislerine göndermez. İsterseniz bu özelliği devre dışı bırakabilirsiniz.

Şimdi kullanım ile ilgili küçük bir örnek yazalım projenize uGTTS.pas kütüphanesini ekleyin.Yeni bir form açın ve üzerine yeni bir button ekleyin. Örnekte ki gibi sınıfı create edip SpeechNow ile direk yazıyı okutabilir yada TextToSpeech methodu ile mp3 dosyası olarak dosya yolunu alıp dilediğiniz gibi kullanabilirsiniz.

20.06.2014 de Sınıfta yaptığım bir değişlikle SpeechNow methoduna overload versiyon ekledim. Artık MediaPlayer’ı parametre olarak vermeden de sesleri çalabilirsiniz.

Delphi Object To JSON

Delphi ile JSON stringlerini parse etmek için 3. parti araçlar bulunmaktadır (superobject gibi). Bende bugüne kadar superobject yardımı ile JSON strinlerini parse ettim ve uygulamalarım da hep bu yöntemi kullandım. Fakat DBX  kütüphanelerini biraz karıştırdıktan sonra TJSONMarshal ve TJSONUnMarshal sınıfları ile tanıştım. Bu sınıflar yardımı ile çok kısa bir şekilde kendi sınıflarımızı(TObject) JSON strinlerine(TJSONValue) dönüştürebiliyor, JSON strinlerinide tekrar kendi sınıfımızın bir instance’ı haline getirebiliyoruz. Lafı fazla uzatmadan nasıl yapılacağını görelim…

Aşağıdaki örnek uygulamayı Delphi XE3 versiyonunda yazdım. 2010 ve sonrasında JSON sınıfları mevcuttur. 2009 ve alt versiyonlarda test yapmadığım için kesin birşey söyleyemiyorum ama Datasnap işlemleri 2010 ile birlikte geldiğinden dolayı, 2010’un alt sürümlerinde  bu sınıflar olmayabilir.

Uygulamanın ekran çıktısı

 

Delphi Compress Stream

Bu yazım da ZLib kütüphanesini kullanarak TStream sınıfından türetilmiş olan çeşitli stream sınıflarında ki verileri sıkıştırmayı ve sıkıştırılmış olan verileri tekrar eski hallerine getirmeyi anlatacağım.

Sıkıştırma işlemi bize ne gibi bir fayda sağlayacak? Derseniz, bir kaç madde ile aklıma gelen ilk faydalarını belirteyim.

  • Veritabanına kayıt edilecek bir dosya sıkıştırıldıktan sonra veritabanın da daha az yer tutacaktır.
  • Veritabanına kayıt etme hızı artacak ,kayıt işlemi sırasında daha az bekleme olacaktır.
  • Veritabanından kayda erişim, kaydı okuma hızı artacaktır.
  • Disk üzerinde tutulacak ise gene alandan kazanım sağlanacaktır.
  • Veri uzak noktalara iletilecek ise transfer hızında artış olacaktır. Kısa sürede büyük verilerin iletimi sağlanacaktır.
Kısacası veri iletişimi ve depolama maliyetleri azalacaktır.
Aşağıda yazdığım methodlar ile stream içeriğinin nasıl sıkıştırılacağını, sıkıştırılan verinin nasıl tekrar eski haline getirileceğini görebilirsiniz.
Veri sıkıştırma (TCompressionStream);

Veri çözümleme (TDecompressionStream);

Sıkıştırma seviyeleri (TCompressionLevel)

  • clNone = sıkıştırma yapılmaz (en hızlı işlem süresi)
  • clFastest = minimum sıkıştırma (hızlı işlem süresi)
  • clDefault = normal sıkıştırma (yavaş işlem süresi)
  • clMax = en iyi sıkıştırma (çok yavaş işlem süresi)

Delphi Stream İşlemleri

Bu yazıda delphi ile TStream abstract sınıfından türetilen çeşitli Stream sınıfları ile fazla kod yazmadan yapabileceğimiz pratik işlemlerden bahsedeceğim.

Öncelikle stream nedir? Sorusunu cevaplayalım. Stream türkçe terim karşılığı akım demektir. Programcılıkta akım verilerin bit düzeyinde bir yerden başka bir yere hızlı bir şekilde aktarılması, iletilmesi anlamında kullanılır. Bu yerlerden kasıt genellikle Disk üzerinden Belleğe yada Bellek üzerinden Diske aktarım şeklinde olabilir. Örneğin bir text dosyası üzerinde arama işlemi yapılacaksa bu dosyayı stream yardımı ile ilk önce belleğe aktarır, daha sonra arama algoritmalarını bellek üzerinde ki veriye uygularız. Eğer dosya aşırı büyük bir boyuta sahip değilse, uyguladığımız yöntem bize ciddi anlamda performans kazanımı sağlayacaktır.

Eee yazmaya başlayalım artık…

Yukarıdaki fonksiyon 1.parametre ile verilen dosyayı LoadFromFile methodu ile Stream içersine aktarır. 2.parametre ile verilen metini stream içinde arar. Bulunan metinleri 3.parametrediki metin ile değiştirir. İşlem bittikten sonra yeni oluşan stringi WriteString methodu ile stream içersine yazar. SaveToFile methodu ile de yeni çıktıyı mevcut dosya üzerine kayıt eder. Test case i aşağıdaki gibidir.

SaveToFile methodu TCustomMemoryStream den, LoadFromFile methodu ise TMemoryStream den türetilmiş olan tüm Stream sınıfların da mevcuttur. FileStream sınıfı dosyalarla doğrudan ilgili olduğu için bu sınıf içersinde LoadFromFile ve SaveToFile methodlarını aramak mantıksızdır. Çünkü FileStream constructor ı yardımı ile doğrudan dosyalar üzerinde çalıştığı için bu metholara gerek görülmemiştir.

Şu noktayada dikkat edilmesini istiyorum, Yukarıda 16 satırda yaptığımız işlemi başka dillerde yapmaya kalkıştığımızda ciddi anlamda işkenceye dönüşüyor. Dosyadan okumak için buffer lar tanımlanır, looplar açılır byte byte yada satır satır okuma işlemleri yapılır. Tekrar kayıt etmek için gene aynı işlemler tekrarlanır. VCL’in bunları bize hazır olarak sunması bence mükemmel bir özellik 🙂

Delphide dosyalama işlemlerinden ziyade Stream kopyalama ve Stream dönüştürme işlemleride cok basit şekillerde yapılır.

Bir stream içeriğini başka bir stream e kopyalamak için sadece 2 satır yeterli 🙂

Bir çok sınıfta SaveToStream, LoadFromStream methodlarıda bulunmaktadır. Örneğin bir bitmap nesnesini Stream içersine aktarmak için sadece tek satır kod yazmak yeterli;

Yada bir Stream içeriğini TRichEdit yada TMemo içersine aktarmak için 2 satır kod yeterli;

Kısacası delphi diyorum ve aşağıdaki sınıflarıda incelemenizi öneriyorum.

VCL de bulunan Abstract Stream Sınıfları;

VCL de bulunan doğrudan kullanılabilir Stream Sınıfları;

Delphi Xe2 ImageEn

Delphi Xe2 ye geçiş yapan uygulama geliştiriciler için başlangıçta bileşen(component) bulmak oldukça zor bir iş. Bunu delphi 6 den beri her yeni versiyona geçiş sırasında kendimden yola çıkarak biliyorum. Hali hazırda bulunan bir takım açık kaynak kodlu bileşenler yeni versiyon çıkar çıkmaz güncelleniyor ve pekte sıkıntı çıkmıyor geçiş işleminde. Ama ImageEn bileşeni Delphi Xe versiyonundan sonra ücretli hale getirildi. Bu yüzden artık yeni versiyonlarda bir bedel ödemeden güncelleştirme alamayacağız.

Bende bu zorluktan dolayı ImageEn 3.1.2 versiyonunu (en son yayınlanan açık kaynak kodlu versiyon) Delphi Xe2 de çalışacak şekilde düzenledim. Bileşenin çalışmasını engelleyecek yada farklı davranışlar sergileyecek değişiklikler yapmadım. Sadece yeni IDE ye kurulabilmesi için derleyici direktiflerine Xe2 nin versiyon numarasını ekledim.

Eğer sizde Xe2 için açık kaynak ImageEn versiyonu arıyorsanız, şuan doğru yerdesiniz demektir 🙂

Uyumlu olduğu Delphi versiyonları: 1, 2, 3, 4, 5, 6, 7, 8, 2006, 2007, 2009, 2010, Xe, Xe2

Kaynak kodları ve Demo uygulamaları ile birlikte indirmek için tıklayın.

Sadece kaynak kodları için tıklayın.

Delphi Xe, SubVersion 1.7 sürümüne yükseltmek

Delphi Xe ile birlikte entegre olarak gelen SubVersion sistemini yeni çıkan versiyonları ile güncelleştirmek için aşağıdaki adımları sırası ile uygulayacağız. Anlatım Delphi Xe2 ve SubVersion 1.7.2 ye göre yapılacaktır. Versiyon numaralarının pek bir önemi yok sadece dosya isimleri farklılık gösterebilir.

  • CollabNet Subversion Command-Line Client v1.7.2 (for Windows 32-bit) linkinden SubVersionu indirin. (Not: indirme işlemi için üyelik istiyor 🙁 )
  • CollabNetSubversion-client-1.7.2-1-Win32.exe’yi bilgisayarınıza kurun.
  • “C:Program Files (x86)EmbarcaderoRAD Studio9.0binsubversion” klasoru içersindeki dll dosyalarını “C:Program Files (x86)CollabNet” klasoru içersindeki aynı isimde olan dll dosyaları ile güncelleştirin.
  • Delphiyi kapatıp tekrar açın.
  • Delphi Xe2 Sub versiyon 1.7 için kullanıma hazır.

Basit bir işlem herkese kolay gelsin 🙂