Perşembe, Eylül 28, 2006

Delphi IDE'sinde bulunan imajlara nasıl ulaşılır ?

Delphiciler olarak GUI programlar yazmak için genellikle Delphi IDE'sini kullanırız.
Ancak bu IDE içindeki imajlara nasıl ulaşırız ?
Bunları kaydetmek mümkün mü ?

Bu sorular sanırım pek çok kimsenin aklına gelmez ya da işimize yaramadığı için pek önemsemeyiz.

Delphide yüklü imajlara ulaşmak için Delphide tanımlı olan (ToolsApi.pas) servislerden faydalanırız.
Bunun için işimizi gören servis INTAServices dır.
Bu servis aslında yalnızca IDE'de bulunan imajlara erişmemizi sağlamaz, ek olarak Ana Menu, ToolBar, ActionList gibi.
Bunlara ulaştığımızda bunlarla istediğimiz gibi oynayabiliriz.

Bu örnekte imaj için kullanacağımız INTAServices.ImageList değişkenidir.
Şöyleki:

var
  imgList : TCustomImageList;
begin
  if not BorlandIDEServices.SupportsService(INTAServices) then Exit;
  imgList := (BorlandIDEServices as INTAServices).ImageList;
end;

imgList içinde artık Delphi IDE'si içinde kullanılan imajlar saklıdır.
Devamı için http://yusufcelik.googlepages.com/delphiota_ideimages
sitesinden bilgi alabilirsiniz.
Kaynak kod için : TestPIn_Img.zip

Kolay gelsin...
Yusuf ÇELİK

Perşembe, Eylül 21, 2006

Turbo ve BDS2006 ürünleri için acil yamalar

Borland tarafından ücretsiz olarak sunulan Turbo ürün ailesi ve ücretli BDS 2006 (Borland Developer Studio 2006) için acil yamalar (Hotfix) çıktı.
Yamaları http://cc.borland.com/item/24132 adresinden indirip install edebilirsiniz.

Bu yamaların içeriği kısaca:
  1. Hotfix 7: C++ ve Delphi.NET ile ilgili.
  2. Hotfix 8: Bir database field'ını incelerken 'DataSet.FieldByName('ALAN').As...' değerinden ziyade Access Violation hatası vermekteydi. Düzeltildi.
  3. Hotfix 9: Memory problemi ile ilgili. Editör içinde birden fazla dosya açık iken bunların arasında dolaşmak memoride allocate edilen bazı alanları Free edemiyordu. Düzeltildi.
Yamalar hakkında daha fazla ayrıntı için Borland'ın resmi sitesinden bilgi alabilirsiniz.

Kolay gelsin...
Yusuf ÇELİK

Çarşamba, Eylül 20, 2006

İki işlem arasında geçen süre

İki işlem arasında geçen yaklaşık süre için bu sayfadaki örnek kullanılabilir.
Ancak burada milisaniyeler(saliseler) bazında da olsa hata olabilir.
Sürenin doğruluğu sizin için çok önemli ise örneğin saliseler bazında, o zaman başka yönteme bakmanızı öneririm.
Bu güncede anlatacağım sanırım sizi ilgilendiriyor.

İki işlem arasında geçen süre genellikle GetTickCount ya da timeGetTime adlarıyla bilinen Windows API fonksiyonları tarafından ölçülür, ancak bu fonksiyonlar bir kaç milisaniyelik (salise) de olsa hata yapabilirler.
Onun yerine daha kesin sonuç veren QueryPerformansCounter Windows API fonksiyonunu kullanma taraftarıyım.
Ancak QueryPerformansCounter Windows API fonksiyonu QueryPerformansFrequency Windows API fonksiyonu ile birlikte kullanılır.
QueryPerformansFrequency : Her bir saniyede, bilgisayarın donanımındaki timer’ın artan değeridir yani frekansı da diyebiliriz. Bu fonksiyondan dönen değeri, baz olarak alacağız. (Her donanım desteklemeyebilir.)
QueryPerformansCounter : Sistem (Windows) başladığından beri geçen sürenin milisaniye cinsinden değerini de verir.
Yapılması gereken şey öncelikler, bilgisayarın donanımının frekansının bulunması, dönen değer 64-bit yani Int64 değerindedir.

var
  tmpFreq : Int64Rec;
  Freq : Cardinal;
....
....
  Freq := 0;
  if not QueryPerformanceFrequency(TLargeInteger(tmpFreq)) then
  begin
    ShowMessage('Donanım desteklemiyor');
    Exit;
  end;
  if tmpFreq.Lo = 0 then Exit;
  Freq := tmpFreq.Lo div 1000;

Burada frekansın ilk 32-bitlik değerin 0 olması işimize yaramaz, çünkü bu değeri 1000 sayısına böleceğiz. Yukardaki işlemi 1 kere kullanmak yeterlidir, çünkü bu donanımsal bir değerdir, hiçbir zaman değişmez.
Daha sonra işimizi asıl QueryPerformansCounter fonksiyonu çözecektir.
var
  counter : TLargeInteger;
  donen_ms : Cardinal;
....
....
  if Freq <> 0 then
  begin
    QueryPerformanceCounter(counter);
    donen_ms := counter div Freq;
  end;

Şimdi yukarıda anlattıklarımızı kod’a dökelim.

unit UntUtilities;

interface

function MSecEllapsed():Cardinal;

implementation

uses
  SysUtils, Windows;

var
  Freq : Cardinal;
  tmpFreq : Int64Rec;

function MSecEllapsed():Cardinal;
var
  counter : TLargeInteger;
begin
  if Freq <> 0 then
  begin
    QueryPerformanceCounter(counter);
    Result := counter div Freq;
  end
  else

    Result := GetTickCount;
end;

initialization
  Freq := 0;
  if not QueryPerformanceFrequency(TLargeInteger(tmpFreq)) then Exit;
  if tmpFreq.Lo = 0 then Exit;
  Freq := tmpFreq.Lo div 1000;
end.

Örnek kullanım:
....
....
uses
  Windows, //GetTickCount için
  UntUtilities, //MSecEllapsed
  MMSystem, //timeGetTime
  Dialogs; //ShowMessage
....
....
const
  SLP = 1024; //salise
var
  st, en : Cardinal;
begin
  st := timeGetTime();
  Sleep(SLP); //1024 salise bekleyelim
  en := timeGetTime();
  ShowMessage(Format('timeGetTime:%d', [en-st]));

  st := GetTickCount();
  Sleep(SLP); //1024 salise bekleyelim
  en := GetTickCount();
  ShowMessage(Format('GetTickCount:%d', [en-st]));

  st := MSecEllapsed();
  Sleep(SLP); //1024 salise bekleyelim
  en := MSecEllapsed();
  ShowMessage(Format('MSecEllapsed():%d', [en-st]));
end;


Kolay gelsin...
Yusuf ÇELİK

Cuma, Eylül 08, 2006

Borland Turbo ürünleri çıktı

Borland, ücretsiz beklenen Turbo ürünlerini piyasaya çıkardı.
Hepsi de ücretsiz olarak aşağıdaki aşağıdaki sitelerden indirilebilirler.
İndirdikten sonra Key için http://www.borland.com/downloads/download_turbo.html
adresinde Keys Only (If you have a CD) bölümünden alabilirsiniz.

Ücretsiz Turbo ürünleri ile paralılar arasında bir kaç fark var (Olmazsa şaşardım zaten).
Ücretsiz Turbo ürünlere aşağıdaki maddeleri eklemeyi unutmuşlar sanki (!)
  1. IDE'ye istediğiniz gibi ekleme yapamıyorsunuz, yani standar üründe olan OTA işlemlerini yapamıyorsunuz. OTA nedir diyorsanız adres: http://yusufcelik.googlepages.com/delphiota
  2. 3.parti componentları install edemiyorsunuz, ancak yazdığınız component'ları kod içinden kullanabilirsiniz. Tek eksik kısım, Drag-and-Drop olayını es geçmişler, eeee ne de olsa beleş et. Yahnisi de o kadar olur. En azından kod içinde kullanma olanağı sunuyor.
  3. Standart üründe var olan 3.parti ürünler bunlar kısaca, InterBase Express, Örnek componentlar , Uzaktan hata ayıklama (Remote Debugging), C++ için Expanded ActiveX/COM server özelliği, Rave Reports, IntraWeb ve Indy gibi.
Kısıtlamalara bakacak olursak, öğrenmek için bence o kadar da kötü değil.
En azından yazdığınız programları satabilme şansınız var.
Teşekkürler Borland
Nice Turbolu günlere...
Yusuf ÇELİK

Perşembe, Eylül 07, 2006

Delphi ThreadButton Component

Tekrar Merhaba,
TButton, TBitBtn, TCheckBox, TRadioButton componentleri, herkesçe bilindiği gibi OnClick event'i vardır.
Buton'a basıldığında butonun arkasındaki kod çalışır.
Ancak, button işini bitirene kadar beklemek zorundayız.
Bunun önüne geçebiliriz, şöyleki:
OnClick event'ini Thread ile çalıştırırsak, button işini bitirene kadar beklememize gerek yok.
Başlatıp, diğer taraftan işimize devam edebiliriz.
Arka planda çalışacak kodlara bazı örnekler:
  • Veri tabanında uzun süren bir Update/Insert/Delete çalıştırmak.
  • Uzun süren bir matematik işlemi.
  • Bir dosya oluşturmak.
Ancak dikkat etmemiz gereken bişey var burada.
OnClick event'ine görsel bişey koymamamız gerekir, yoksa program kilitlenebilir.
Bunun nedeni ise, hem Thread hem de MainThread (Threadsiz program) aynı nesneye erişmeye çalışabilir.
Burada örnek olarak TButton class'ı için bu işlemi oluşturacağız, aynı yöntem kullanılarak diğer button grupları için de yapılabilir.

Nasıl yapıldığı hakkında daha fazla bilgi için http://yusufcelik.googlepages.com/threadbutton adresinden kaynak kod dahil olmak üzere bilgi alabilirsiniz.

Thread'ler hakkında daha fazla bilgi için
http://www.midnightbeach.com/jon/pubs/MsgWaits/MsgWaits.html adresinden öğrenebilirsiniz.
Kolay gelsin...
Yusuf ÇELİK