Haziran 2009 Arşivi

TThread.WaitFor Bug..

// 26 Haziran 2009 // 7 Yorum » // Delphi

Yakın bir zamanda TThread sınıfına yine işim düşmüştü. Yazacağım bir kod parçasında bir thread’in işinin bitmesini beklemem gerekiyordu. Kodumu bu şekilde geliştirirken Delphi’nin bir bug’una rastladım ve bu hatayı Delphi ürün müdürü Nick Hodges‘a ilettim. Sorunun bir sonraki Delphi sürümünde ortadan kalkacağına inanıyorum.

Kısaca sorunun ne olduğundan bahsettikten sonra, mail yazışmalarımızı ilgilenenler için paylaşacağım. Bildiğiniz gibi TThread sınıfının WaitFor metodu bir thread’in işinin bitmesini beklemek için tasarlanmıştır. Ve görevini layıkı ile yerine getirir. Ancak, eğer thread kendi constructor’ında işi bittikten sonra yok edilsin ayarına set edildi ise o zaman bu bug ile karşılaşacaksınız. Thread’inizin constructor ‘ında FreeOnTerminate := true gibi bir satır kod yazdı iseniz ve thread’inizin bitmesini WaitFor ile bekliyorsanız, thread’inizin bitmesine müteakip hata ile karşılaşacaksınız. Bunun nedeni, Thread sınıfının destructor’ında işletim sistemi tarafından ayrılmış olan thread handle’ının CloseHandle ile serbest bırakılmasına karşılık WaitFor metodu içinde bu handle’ın kullanılmaya çalışılmasıdır. Sizlere bu sorun düzeltilinceye kadarki tavsiyem WaitForSingleObject(myThread.Handle, INFINITE) kodu ile bekleme yapmanızdır.

Delphi ürün müdürü ile yazışmalarımız aşağıdaki gibidir:
(more…)

Win32 & .Net(Delphi->C#)

// 21 Haziran 2009 // 20 Yorum » // .Net, C#, Delphi, Programlama, Veritabanı, Win32

Aslında herşey Java adı verilen programlama dilinin doğuşuna kadar ilerliyor. Java, programlama dünyasına farklı bir perspektif katmıştı. Yazılan kodların applet’ler vasıtası ile web ortamlarında kullanılabilmesi yada Java Runtime ile değişik işletim sistemi platformlarında çalıştırılabiliyor olması onu günden güne daha popüler hâle getiriyordu.

Microsoft, kendi işletim sistemlerinin yeryüzündeki tüm bilgisayarlarda kullanılamayacağının farkına vardığında; Java’ya karşı bir önlem almak gerektiğini düşündü ve bu sayede veriye her ortamdan erişebilecek bir sistem planlamaya başladı. Ancak elbette Java’nın da hâla beceremediği gibi Microsoft’da platform bağımsızlığı hususunda başarılı olamadı. Zaten tasarımların gereği de bunu pek mümkün kılmıyordu. Java’da üretilen kodların bytecode’lara çevrilmesi ve JVM(Java Virtual Machine) adı verilen programlarla üzerinde çalıştığı platforma adapte edilmesindeki süreç, .Net’de de kendisine farklı isimlerle yer buldu.

.Net, ürettiği MSIL kodunu üzerinde çalıştığı platformun anlayacağı makina dili koduna ise JIT vasıtası ile çevirir. Bu tıpkı Java’nın JVM’ine benzer. Aradaki benzerlikleri saymaya kalksak emin olun sayfalarca yazı yazmamız gerekir. Benim bu makalede amacım bu iki platform bağımsız olduğunu iddia eden teknolojinin benzerliklerini ve farklılıklarını anlatmak değil. Bu bilgileri genel kültür amacı ile sunduktan sonra Delphi’nin bu teknolojiler ile iletişimi hakkında bilgi vermek ve gerçek platform bağımsız kodlamanın gelecekte Delphi ile olabileceğinin umudunu sizlerle paylaşmak.

Görüldüğü üzere gerek .Net gerekse de Java platform bağımsız native kod geliştiremiyorlar. Ürettikleri ara kodların, çeşitli işletim sistemlerinde yorumlanıp makina koduna çevrilmeleri gerekiyor. Dolayısı ile teoride bu teknolojileri kullanan uygulamaların, native uygulamalardan hızlı olması beklenmiyor.

.Net, bilindiği üzere programlama dillerinden bağımsız bir platform. Framework adı verilen kod kütüphanelerinin tüm programlama dilleri tarafından ortak bir şekilde kullanılabilmesi, CTS denilen ortak tip sınıflarının .Net içinde olması, herhangi bir .Net destekli dilin bir diğer .Net destekli dil ile iletişimini son derece sorunsuz ve kolay hale getirmekte. Büyük çaplı proje ekiplerinin pek çok programcıya sahip olduğu gerçeği göz önüne alındığında, bu ekip üyelerinin herhangi bir .Net dilini bilmesi ve bu dil ile geliştirme yapmasının projeye olumsuz bir etkisinin olmaması elbette son derece güzel bir durum.
(more…)

Delphi & Animated Flash Charts(Fusion Charts)

// 10 Haziran 2009 // 20 Yorum » // Delphi, Grafik, Programlama

fusioncharts

Infosoft Global firmasının animasyonlu(Flash destekli) pek çok ürünü var. Bu ürünlerin neler olduğunu ve ne gibi yetenekleri olduğuna buradan bakabilirsiniz. Ben elbetteki hepsini anlatmayacağım. Örneğimde Fusion Widgets kütüphanesine dahil olan silindir chart’ı anlatacağım. Lâkin burada izah edeceklerim diğer chart türleri içinde geçerli olacaktır.

Hepimiz yazdığımız uygulamaların vurucu gücünün; raporlar ve bu raporların ekrandaki sunum tarzının etkileyiciliği olduğunu biliriz. Programlarımızı pazarladığımız müşterilerimiz; genellikle programın alt yapısının ne kadar güçlü olduğu, stabilitesi gibi aslında son derece önemli olan hususlarla maalesef pek ilgilenmezler. Herşeyde olduğu gibi görsellik; programlarımız için de son derece önemlidir. Görselliğin günden güne önem kazandığını Microsoft’un Windows Presentation Foundation(WPF) yada SilverLight’a verdiği önem de kanıtlıyor sanırım.

Pek çok Delphi programcısı, hazırladığı raporların görselliğini genellikle TeeChart ile sunar. TeeChart açık kaynak kodlu ve güçlü bir görsel raporlama aracı olsa da; biz bu makalemizde Flash ile hazırlanmış bir raporlama aracı olan Fusion bileşenleri ile ilgileneceğiz.

Fusion bileşenleri; Fusion Charts, Fusion Widgets, Fusion Maps gibi ayrı ayrı pek çok grafiğin desteklenebildiği zengin bir kütüphaneden oluşuyor. En önemli özelliği; client tarafında sadece Flash Player’a ihtiyaç duyması. Genel olarak, Flash Action Script dilinde yazılmış olan chart kütüphaneleri, çalışabilmek için programlama ortamında XML, HTML ve JavaScript işbirliğinden yararlanıyor. Aşağıda makalemizde izah edeceğimiz silindir chart’ın bir örneğini görebilirsiniz. Elbette, bu örneği gözlemleyebilmeniz için makinanızda Flash Player’ın yüklü olması gerekiyor. Eğer Flash Player’ınız yüklü değil ise, buradan yükleyebilirsiniz.

Silindir Chart Örneği

 

 

(more…)

Delphi & Windows Firewall

// 7 Haziran 2009 // 8 Yorum » // Delphi, Internet, İşletim Sistemi, Programlama

Firewall temel anlamı ile işletim sistemlerini daha güvenli kılmak için tasarlanmış programlardır.Modern işletim sistemlerinin hemen hemen hepsinde gömülü olarak bulunan bir firewall vardır. Güvenlik duvarı, ateş duvarı gibi isimler alan firewall’lar; makinamızda çalışan uygulamaların internete çıkışlarını denetleyen, dışarıdan içeri gelen TCP/UDP paketlerini çeşitli kurallara göre filtrelemeye çalışan uygulamalardır. Kimi zamanlarda yazdığımız uygulamalar, firewall’lar tarafından güvensiz içerik olarak algılanırlar ve blok edilmeye çalışılırlar. Eğer programınız network ortamında çalışıyor ve ortam bilgisayarları ile çeşitli protokoller üzerinden haberleşiyor ise, yada programınız internet’e erişmek durumunda ise; firewall’larla sıkıntı yaşamış olabilirsiniz.

Yazdığınız bir uygulamanın, uygulamayı geliştirdiğiniz makinada çalıştığı, ancak müşterinin makinasında çalışmadığı; yada erişmek istediğiniz network kaynaklarına erişemediği, internete çıkamadığı durumlarla karşılaştı iseniz, bu makalemizden istifade edebilirsiniz demektir. İşletim sistemi ile birlikte gelen Windows Firewall, nispeten basit bir güvenlik duvarı. Pek fazla ayarı ve detayı yok, ancak yine de paralı muadillerinin yaptıklarını mümkün mertebe yerine getiren bir program.

Bizim makalemiz, işletim sistemi ile birlikte gelen güvenlik duvarının programlanmasına yönelik olacak. Sizde taktir edersiniz ki, piyasada gerek donanımsal gerekse de yazılımsal pek çok farklı firewall mevcut, bizim yazacaklarımız onlara destek vermiyor olacak.

firewall_delphi_1
(more…)

49.7 gün sonra GetTickCount !

// 6 Haziran 2009 // 3 Yorum » // Delphi, İşletim Sistemi, Programlama, Win32

Eğer sizlerde projelerinizde zamansal kontroller kullanıyorsanız, iki kod sürecinin arasındaki zaman dilimini hesaplıyorsanız muhtemelen GetTickCount API’sini kullanıyorsunuz demektir. Bu API, işletim sistemi açıldığı zaman sıfır(0)’a eşitlenen ve her milisaniyede bir değeri bir arttırılan işletim sistemine has bir değişkenin değerini bizlere geri verir. Win32 API Help’te tanımı aşağıdaki gibidir:

DWORD GetTickCount(VOID)

Görüldüğü üzere geri dönüş değeri DWord türünde. Delphi’de DWord, LongWord türüne eşitlenmiştir. LongWord ise 32 bit işaretsiz bir tamsayıdır. Yani bu sayının alabileceği değer aralığı; 0..4.294.967.295 dır. Bu değerlerin doğruluğunu aşağıdaki kod ile de kontrol edebilirsiniz:

var
  dw : DWord;
begin
  dw := Low(DWord);
  ShowMessage(InttoStr(dw));

  dw := High(DWord);
  ShowMessage(InttoStr(dw));
end;

Hatırlarsanız eğer, GetTickCount API’sinin her milisaniyede bir işletim sistemi içinde bir yerde bulunan bir değişkenin değerini bir arttırdığını ve bu değeri geri döndürdüğünü söylemiştik. Peki; 4.294.967.295 + 1 milisaniye sonra ne olacak ? İsterseniz bu milisaniyenin kaç güne tekabül ettiğine önce bir bakalım;

  • 4.294.967.295 ms = 4.294.967.295 ms / 1000 = 4.294.967,295 sn.
  • 4294967,295 sn = 4294967,295 sn / 60 = 71.582,78825 dk.
  • 71.582,78825 dk = 71.582,78825 dk / 60 = 1.193,04647083 saat
  • 1.193,04647083 saat = 1.193,04647083 saat / 24 = 49,71 gün
  • Gördüğünüz gibi 49.7 gün sonra GetTickCount API fonksiyonu uygulamamız için tehlike sinyalleri vermeye başlayacaktır. 49.7 günün sonunda işletim sistemindeki değişken maksimum değerine erişecek ve bir sonraki milisaniyede bu değişken otomatikman sıfırlanacaktır. Dolayısı ile yapacağımız zamansal kontroller hatalı neticeler üretecek, belkide beklemediğimiz durumlar ile karşılaşacağız.

    Peki ne yapmalıyız ? Aslında yapılabilecek şeyler sınırlı, ama ben size QueryPerformanceCounter‘a bakmanızı yada Vista işletim sistemi kullanıyorsanız GetTickCount’un 64 bit değer döndüren ve kernel32.dll içinde tanımlanmış ancak Delphi’de implemente edilmemiş GetTickCount64 fonksiyonunu kullanmanızı önerebilirim.

    49.7 gün bir bilgisayar açık kalmaz, benim programım da 49.7 gün sürekli açık kalacaksa patlarsa patlasın derseniz o zaman bu hususlara bakmayabilirsiniz tabii :)

    Saygılar, sevgiler..

    Delphi ve Google Maps API

    // 6 Haziran 2009 // 39 Yorum » // Delphi, Internet, Programlama

    google_maps Hepimizin bildiği üzere Google arama motorunun popüler haritalama hizmetidir Google Maps. Gelişen teknoloji ile iyice küçülen dünyamızı evlerinizde gözlerinizin önüne getiren faydalı bir hizmet. Hizmete girmesinden kısa bir zaman sonra popülerliğini arttıran Google Map, sunduğu API’ler ile daha da yaygınlaşacağa benzer.

    Artık hemen hemen her web sitesinde bir Google Map haritasına rastlamak mümkün. Ancak masaüstü uygulamalarda emsaline pek rastlanılmıyor henüz. Bizim makalemizin konusu ise masaüstü uygulamalarda Google Maps API’lerini kullanmak. Devasa bir hizmet kütüphanesi olma yolunda hızla ilerleyen Google Maps’in tüm özelliklerini detaylıca anlatmamız elbette mümkün değil; ancak makelemiz, Delphi’de TWebBrowser nesnesi vasıtası ile Google MAP API’lerinin kullanımını ve JavaScript – Delphi interaktif haberleşmesini anlatacak.

    Makalemizi okumakta ilerlemeden evvel, Delphi & JavaScript Kardeşliği isimli makalemizi okumanız faydalı olacaktır. Google’ın bizlere sunduğu bu harita hizmeti ile haberleşmenin temellerini “Delphi & JavaScript Kardeşliği” isimli makalemizde anlattığımız için bu kısımda haritalama hizmetini kullanacak olan JavaScript sınıf tanımını, bu sınıfın Delphi altından kullanımını ve karşılıklı etkileşimini göstereceğim.
    (more…)

    Delphi & JavaScript Kardeşliği

    // 1 Haziran 2009 // 6 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…)