Mayıs 2009 Arşivi

System.Object.ReferenceEquals

// 15 Mayıs 2009 // Yorum Yok » // .Net, Delphi, Programlama

Delphi tanımı:

class function ReferenceEquals (objA : System.Object; objB : System.Object) : Boolean;

C# tanımı :

public static bool ReferenceEquals (Object objA, Object objB);

Her iki sınıfa ait nesnenin aynı referansa sahip olup olmadığına yada her ikisininde nil (Null) olup olmadığına bakar.Eğer her iki nesnede aynı referansa sahip ise yada her ikisi de nil(Null) ise true aksi taktirde false döndürür. Şimdi Referans diyoruz da nedir bu referans ? Aslında buraya C++ için yapılmış olan tanımıda yazmak istiyorum müsaadenizle.

public: static bool ReferenceEquals(
Object* objA,
Object* objB
);

Bu tanımda her iki paremetrenin tipide Object* biçiminde.Yani bu paremetreler aslında Object tipini işaret eden işaretçiler(Pointer). Aslında Delphi de tanımladığımız pek çok şeyin işaretçi olması gibi bir gerçek bu.
(more…)

System.Object.ToString

// 15 Mayıs 2009 // Yorum Yok » // .Net, Delphi, Programlama

Delphi tanımı :

function ToString : String; virtual;

C# tanımı :

public virtual string ToString();

Mevcut sınıf ile alakalı bilgi döndürmek amacı ile kullanılmaktadır. .Net ortamında kullanılan herşey bir nesne olduğundan mevcut tüm sınıflarda ve işin ilginç ve yararlı tarafı değişkenler de de bu metodu kullanabilirsiniz. (Gerçi pek çok değişken tipi class değil record olarak tanımlanmıştır ama şimdilik bu konumuz değil oralarada geleceğiz). Peki bu varsayılan tutumu değiştiremezmiyiz dediğinizi duyar gibiyim ? Çoğu zaman sınıfın adının metin olarak döndürülmesi (“System.Object” gibi) pek anlamlı ve yararlı olmayacaktır bizler adına.Biz belli bir sınıfı miras alan kendi sınıflarımızda sınıfımıza ait bazı özel bilgileri bu metod ile döndürmek isteyebiliriz.Örnekleri çeşitlendirmek mümkün..İhtiyacınıza göre değişecektir. Peki bunu nasıl yapacağız.? Şimdi System.Object sınıfının ToString metod tanımına bir göz atalım birlikte. ToString metodu tüm nesnelerin atası olan System.Object sınıfında virtual anahtar kelimesi ile işaretlenmiştir. Bunun anlamı, bu metodun istenildiği taktirde herhangi bir sınıfta tekrar tanımlanabilmesine (override) imkan tanımaktır. Şimdi biz bunun Delphi’cesini yapacağız. C# programcıları bize kızmasınlar lütfen, C# syntax’ini Delphi kadar bilmediğim için bu dille yapmayacağım örneklerimi.Zaten burasıda bir Delphi Blog’u ;)

Şimdi System.Object sınıfından miras alan bir sınıfımız olsun.
(more…)

Nedir bu Reqursive(Özyinelemeli fonksiyon) , ne işe yarar, nerede kullanabiliriz ?

// 15 Mayıs 2009 // Yorum Yok » // Delphi, Programlama

Reqursive fonksiyon kendi kendisini çağıran fonksiyonlara verilen genel addır. Alt alta hiyerarşik yapılarda yada içinden çıkılması zor bazı matematiksel hesaplamalarda çok kullanışlı bir yapıdır.Örneğin en bilinen örneği faktoriyel hesabıdır.Bilindiği üzere faktöriyel hesabı birbirini takip eden sayıların çarpımları ile yapılmaktadır ve ünlem (!) işareti ile ifade edilir. Örneğin 3 faktöriyel (3!) = 1 * 2 * 3 = 6 dır.
5! = 1 * 2 * 3 * 4 * 5 = 120 dir. Gelin bu faktöriyel hesabını yapabilen bir fonksiyonun Delphi’de ne kadar kolay kodlanabildiğine hep beraber göz atalım.

function Factoriel(Value : Smallint) : Longint;
begin
  if Value < = 1
  then Result := 1
  else Result := Value * Factoriel(Value - 1);
end;

İlginç bir kullanım öyle değil mi ? Fonksiyonun çalışma prensibine bir göz atalım. Diyelim ki Factoriel(1) biçiminde çağırdınız o zaman fonksiyon 1 değerini döndürüyor ve fonksiyondan çıkıyor. Diyelim ki Factoriel(5) biçiminde çağırdınız o zaman fonksiyonumuz şu hali alıyor:
(more…)

SQL Server-DTS(Data Transformation Services)

// 15 Mayıs 2009 // 7 Yorum » // Delphi, Programlama, Veritabanı

Hep Delphi hep Delphi olmasın dedim, Delphi + SQL Server lı bir makale yazayım. :) Bu makalem daha bir renkli olacak galiba çünkü dosya upload etmenin yolunu buldum sanırım.En azından deneyeceğim , Screen capture’lı falan anlatacağım.Daha akılda kalıcı olur.Bu makalemizde SQL Server’ın çok akıllı bir servisinden yani DTS’den bahsetmek istiyorum.DTS(Data Transformation Services) SQL Serverı kullanan pek çok programcı arkadaşımızın SQL Server’dan herhangi bir başka kaynağa, yada herhangi bir başka kaynaktan SQL Server’a veri aktarma yollarından bir tanesi ancak en hızlısı. İnanılmaz bir hızda veri aktarımı yapabiliyor.Ben hala şaşırıyorum bu duruma ya neyse. Bulk Insert tabir edilen aktarma metodunu kullanıyor. Şimdi burasının formatını bozmamak adına (ne de olsa bir Delphi blog’undayız) bu DTS olayını biraz Delphi’ce anlatacağım. Yani Delphi’den DTS paketi çalıştırmayı anlatacağım kısaca. DTS paketi ise SQL Server üzerinde sihirbaz yardımı ile tasarlanan bir aktarım işlevinin SQL Server üzerine bir dosya gibi saklanmasıdır. Gelin bunu grafiklerle adım adım anlatalım.
(more…)

Tuşa basma işkencesi..

// 15 Mayıs 2009 // Yorum Yok » // Delphi, Programlama

Diyelim ki bir program yazdınız ve programınızın içine sürpriz yumurta koymak istiyorsunuz.Yada kullanıcılara feci eziyet etmek istiyorsunuz. Bu amaçla çok zorlu bir tuş kombinasyonu kullanmak istiyorsunuz. Mesela biz bu örneğimizde Ctrl + Shift + F5 + 7 + 8 tuşlarına basılınca birşeyler yapacağız. (Tabii bu tuşlara aynı anda basmayı becerebilirsek :) )

Yine herzaman ki gibi ne yapıyoruz. Tabii ki önce Help’e bir uğruyoruz. Ve Help’imize GetKeyState yazıyoruz. O da ne TDragObject diye abuk bir class’a ait bir yardım çıktı.Yok yok biz bunu aramıyoruz. Windows API helpinden bakacağız.Heh şimdi bulduk istediğimiz fonksiyonu.Fonksiyondan görebildiğimiz kadarı ile dönüş değeri SHORT diye bir tip. Bu SHORT’da ne ola, diyorsanız o zaman hemen yolumuzu windows.pas’a çeviriyoruz.Ve GetKeyState aratıyoruz. Ve 20.853 ‘üncü satırda şöyle bir tanımlama ile karşılaşıyoruz.

  function GetKeyState(nVirtKey: Integer): SHORT; stdcall;

Eee burada da SHORT diyor. Biz merak ediyoruz, programcı meraklı olur ;) SHORT neye tekabül ediyor diye ve en sonunda buluyoruz.
Yine Windows.pas satır 155 de şöyle bir tanım var.
(more…)

Yüzen kontroller.. :)

// 15 Mayıs 2009 // Yorum Yok » // Delphi, Programlama

Başlığa aldanmayın bizim kontroller yüzmeyecek tabii, ama form gibi başlıkları(yani caption’ları) olacak.Bu da demek olacak ki, siz kontrollerinizi runtime sırasında hareket ettirebilecek, boyutları ile oynayabileceksiniz.

Peki bunun için ne yapmalıyız.. Yine sevgili Delphi’mizin Help’ini açıyoruz ve CreateParams yazıyoruz..Birde bakıyoruz ki bu metodu uygulayan temel sınıf TWinControl. Dolayısı ile TWinControl sınıfından miras almış tüm sınıflarda bu metodu ezebileceğiz. ;) Eh o zaman biz ne yapalım ne yapalım..Yüzme bilen bir TEdit bileşeni geliştirelim sizlerle..

TMyEdit = class(TEdit)
public
	procedure CreateParams(var Params : TCreateParams); override;
end;

Tanımlama bu kadar basit.Şimdi bu CreateParams ne yapar..Help’den okumuşsunuzdur elbette ama kısaca şunu yapar.Biliyorsunuz Windows ortamındaki handle’ı (HWND) si olan tüm karesel bölgelere (bazende bu alanlar karesel olmayabiliyor, bknz. SetWindowRgn API) pencere deniliyor. Ve bu pencereler CreateWindow yada CreateWindowEx API’leri ile oluştuluyor. Eh Delphi tam bu noktada oluşturulacak olan bu pencerenin bazı stil ayarlarını değiştirebilmemize olanak sağlıyor.Sağolsun. :) Pencere oluşturulduktan sonra bu özellikleri değiştirmek isterseniz de bknz. SetWindowLong API sini kullanabiliyoruz. Herneyse lafı fazla uzatmadan CreateParams metodunun gövdesini yazalım..
(more…)

DefineProperties nedir, nasıl kullanılır..?

// 15 Mayıs 2009 // 3 Yorum » // Delphi, Programlama

Sevgili Sadettin’in güzel anlatılmış nesne kopyalama örneğinden sonra Furkan arkadaşımızın yorumu bana bu makaleyi yazma ihtiyacı hissettirdi.Diyelim ki bir class tasarladık süsledik püsledik, cillop gibi oldu. Ama bu class’ımızı istediğimiz zaman hafızadaki o anki görünümü ile saklamak ve tüm özellikleri ile yine istediğimiz bir anda tekrar yüklemek istedik. Programcı değilmiyiz isteriz biz herşeyi ;)

Bunun için başladık araştırmalara nasıl saklarım nasıl yüklerim vs. diye..Birde baktık ki Sadettin bunun için birşeyler yazmış sağolsun.Biraz da Delphi Help’i kurcaladık, eh güzel artık yazabiliriz. Yazdık bitirdik, save de ettik. Bir yükledik baktıkkı sadece published property’ler saklanmış dolayısı ile onlar okunmuş.Haydaa dedik bu da ne ki şimdi..Object Inspector’a ihtiyacım yok ki benim bütün property’lerimi published tanımlayayım.. Hatta ben mazoşist birisiyim, private olan property’lerim bile saklansın abi! dediniz. Eee ne olacak şimdi ?

“O zaman kendin yazacaksın kardeşim!” diyor Delphi böyle sorulara cevap olarak. İyide onu nasıl yapacağız derseniz, eh onuda ben nacizane bilgilerime dayanarak sizlerle paylaşmaya çalışayım.

Öncelikle hiçbir iş yapmayan basit bir sınıf tasarlayalım sağına soluna bir kaç property serpiştirelim. Ama önce ne yapalım, Help’den DefineProperties’in tanımlandığı en üst sınıf hangisi onu bir kontrol edelim.Öyle ya bu metodu ezeceğiz.Gördük ki TPersistent’te tanımlanmış tam tahmin ettiğimiz gibi.. O halde biz de TComponent kullanabiliriz rahatlıkla demekki class’ımızı miras almak için.
(more…)

Icon yükleyebilen bir SpeedButton türevi..

// 15 Mayıs 2009 // 2 Yorum » // Delphi, Grafik, Programlama

Delphi’nin kendi VCL’inde bulunan button sınıflarında Icon yüklenememesine hep kızmışımdır ama garip garip bitmap dosyaları ile hep idare etmiş ve aman sonra yazarım demiştim.Eh geçenlerde bir arkadaşımın da teşvikiyle oturdum yazdım.Sizlerle paylaşayım istedim. Buyrun; kodda anlaşılmayan sormak istediğiniz birşeyler olursa yardımcı olmaya çalışırım.
(more…)

Read-Only bir property’nin değerini nasıl değiştiririm ?

// 15 Mayıs 2009 // 3 Yorum » // Delphi, Programlama

Başlıktaki sorunun ne kadar gereksiz olduğunu düşündüğünüzü hisseder gibiyim ;) Kim sadece okuma yapılması için tasarlanmış bir property’nin değerini değiştirmek isteyebilir ki ? Zaten adı üstünde readonly. Ancak kazın ayağı pek de öyle değil. Buyurun okuyalım;

Şimdi size anlatacağım biraz tehlikeli bir duruma sebep olabilir..En azından programların yada tasarladığınız component’lerin sağlıklı çalışması açısından sıkıntılar doğurabilir. Bu açıdan şimdiden dikkatli olmakta fayda olduğu konusunda uyarmak isterim. Diyelim ki bir component tasarladık, component’imizi kullanacak arkadaşlarımız için bazı metodları ve property’leri public yaptık.Ancak değiştirilmesini istemediğimiz çok can alıcı bir özelliği de public kısmında sadece okunabilir yaptık. Ya bu değiştirilebilirse o zaman ne yaparız ? Lafla olmuyor, hemen koda geçelim:

TMyClass = class
private
	fMyString : String;
public
	constructor Create;
	property ReadOnlyProperty : String read fMyString;
end;

(more…)

Her türlü veritipini kıyaslamak için..

// 15 Mayıs 2009 // 2 Yorum » // Delphi, Programlama

Şimdi veritiplerinin kıyaslanması ile alakalı bir dökümana ne gerek var diye düşünebilirsiniz, haklı da olabilirsiniz :) Ama ben yine değişik bir yolla nasıl yapıldığını göstermeye çalışacağım.. Ve bu yol çok esnek bir yol olacak. Şimdi sizlerle bir fonksiyon yazacağız, bu fonksiyon; içerisine karşılaştırılacak veritiplerini alacak ve byte byte kıyaslama yapacak.(En sağlam yöntem :) ) Ardından da sonucu Boolean olarak döndürecek.

Yazmaya başlayalım..

function IsEqual(var Source , Dest ; Size : Integer) : Boolean;
type
	TBytes = array[0..MaxInt-1] of Byte;
var
	N : Integer;
begin
	N := 0;
  while (N < = Size) and (TBytes(Source)[N] = TBytes(Dest)[N]) do Inc(N);
  Result := (N = Size);
end;

Şimdi bu da nedir demeyin, açıklayalım..
(more…)