15 Mayıs 2009 Arşivi

Bir TStringList türevi..

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

Bir istek üzerine , mevcut VCL sınıflarından birisine onun bünyesinde barındırmadığı bir event yazma ile ilgili bir makale yayınlayacağım.Düşündüm taşındım hangi nesneye ne eklesem diye, VCL’in üreticileri sağolsunlar pek çok şeyi düşünmüşler.Benimde aklıma TStringList sınıfına birkaç olay eklemek geldi. Zaten amaç genel olarak ne yapıldığını anlayabilmek ondan sonrasında siz değerli arkadaşlarım kendi isteklerinize göre istediğiniz sınıfı özelleştirirsiniz. Bu yazım da OnBeforeAdd, OnAfterAdd olaylarını eklemeyi düşündüm önce.Ama daha sonra aklıma, filtreleme özelliği de eklemek geldi.Nasıl yani filtreleme ? Biz istediğimiz kadar kötü kelime (badword) belirtebilseydik, ve TStringList nesnemize ekleme yaparken sınıfımız eklemek istediğimiz metnin içerisinde kötü bir kelime geçiyor ise bize bir event’le cevap verseydi , sonra bizde o eventte “Evet, kabul ediyorum” yada “hadi oradan..!” diyebilseydik ne güzel olurdu değil mi ? Eh o zaman demek ki birde OnBadwordFind diye bir olay daha oluşturmalıyız. Sınıfın anafikrini sizlerle paylaştığımıza göre, gelin TStringList sınıfı etrafında biraz dolanalım..Araştırma yapmadan olmuyor bu işler.. ;) Yine her zamanki gibi Delphi Help’i açtık ve yazdık TStringList diye..Metodlarına bakıyoruz. Evet bizim kullanmamız gereken metodu Add metodu..Gelin tanımına şöyle bir bakalım:
(more…)

Absolute (votka değil!)

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

Absolute direktifi bir değişkenin kendisinden önce tanımlanmış bir başka değişken ile aynı hafıza bloğunu kullanmasını sağlar.

var
  iValue : Cardinal;
  iOther : Cardinal absolute iValue;
begin
 iValue := 250;
 ShowMessage(InttoStr(iValue) + ‘-’ + InttoStr(iOther)); // 250-250

 iOther := 555;
 ShowMessage(InttoStr(iValue) + ‘-’ + InttoStr(iOther)); // 555-555
end;

Yukarıda görüldüğü üzere iki değişken de aynı hafıza bölgesini paylaşıyorlar ve birinde yapılan değişiklik diğerine otomatikman yansıyor.Ancak absolute direktifini gösterdiği tip ile aynı tipte vermeyebilirsiniz.Şöyle ki:
(more…)

Protected özellikleri Hack’leyelim ;)

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

Delphi sınıflarının benden çekeceği var :) Ne yapsalar nasıl saklasalar değişkenleri bir şekilde ulaşıyoruz. :) Private özellikleri değiştirme yönteminden sonra daha değişik bir konu olan protected özelliklere ulaşmayı anlatacağım bu makalemde..

Delphi’de en yaygın olarak kullanılan 4 adet erişim belirleyicisi vardır.Bunlar private, protected, public, ve published‘dır. Bunların ne işe yaradıklarından detaylıca bahsetmeyeceğim.Konumuz protected. Protected bloğunda tanımlanmış olan tüm üyeler sınıfın tasarımcısı tarafından sınıf kullanıcılarından gizlenmiştir. Ancak bu sınıfı miras alan sınıflarda erişime açıktırlar. Mesela bir formumuz olsun ve üzerinde 3 adet TEdit nesnemiz olsun. Edit bileşenlerimizin hepsinin OnClick yordamını aynı yere ayarlayalım ve OnClick yordamında aktif olan kontrolün rengini kırmızı yapmak isteyelim. Hadi bakalım kodlamaya başlayalım:

procedure TForm1.Edit1Click(Sender : TObject);
var
  cControl : TWinControl;
begin
  cControl := Screen.ActiveControl;
  cControl.Color := clRed;
end;

Yukarıdaki kodu çalıştırmayı denediğimizde “Undeclared identifier:Color” diye bir hata mesajı alıyoruz. İyide bu hata da ne ki şimdi..Hemen Delphi Help’i açıyoruz ve TEdit’e bakıyoruz..Hiyerarşiye bir bakıyoruz şöyle:
(more…)

Delphi, ilginçlikler diyarı..!

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

Delphi gerçekten de çok güçlü bir dildir..Ama onu hepimiz yeterince iyi kullanabiliyormuyuz işte orası tatışılır. Sizlerle birkaç ilginç kullanımı paylaşmak ve dilim döndüğünce anlatmak istiyorum.Mesela hemen hemen her Delphi programcısı herhangi bir nesnenin OnClick olay yöneticisinde belli başlı kodlar yazmıştır.Tüm OnClickler şöyle görünür.

  procedure …Click(Sender : TObject);

Peki düşündük mü acaba , “yahu bu Sender : TObject de nereden geliyor ?” diye.. Bu tanım aslında TNotifyEvent adlı bir tanımdan gelmektedir. Delphi Help’i açar ve TNotifyEvent’de neymiş diyip bakarsanız şöyle bir tanım göreceksiniz:

  type TNotifyEvent = procedure (Sender: TObject) of object;

Hımm bu da ne şimdi ? TNotifyEvent diye bir şey tanımlanmış ve ona sen bir proceduresin denmiş TObject türünde de bir parametren var denilmiş. Ehh biraz anladık, iyi de o sondaki of object de ne oluyor ? Açıklayacağız meraklanmayın.Ancak ondan önce farkettiğimiz daha doğrusu aklımıza gelen bazı cinlikleri deneyelim.
(more…)

Class of ……

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

Interface’lerla ilgili örneğim de TRadioGroup nesnesi üzerinden yapılan bir seçimle çeşit çeşit veritabanına bağlanıyorduk.Bu benim aklıma başka bir şey daha getirdi.Onu da sizlerle paylaşmak istedim. Bazen çalışma anında(run-time) bazı nesnelerin üretilmesi kullanıcının yapacağı seçime bağlı olur. Hemen somut bir örnek verelim. Mesela TRadioGroup nesnemizde üç seçenek olsun, kullanıcı birinciyi seçerse bir adet TMemo oluşturmamız, ikinciyi seçerse TEdit ve üçüncüyü seçerse de TPanel oluşturmamız gereksin. Bu durum şimdiye kadar başınıza gelmedi ise bundan sonra gelmesi kuvvetle muhtemel bir durumdur. Eee bu durumda ne yapacağız ? Şöyle bir şey yapsak olur mu acaba :

var
 mem : TMemo;
 edt  : TEdit;
 pnl  : TPanel;
 begin
  case RadioGroup.ItemIndex of
    0 :
        begin
          mem := TMemo.Create(Self);
          mem.Left := 10;
          mem.Top := 10;
          mem.Width := 100;
          mem.Height := 100;
          mem.Parent := Self;
        end;
    1 :
        begin
          edt := TEdit.Create(Self);
          edt.Left := 10;
          edt.Top := 10;
          edt.Width := 100;
          edt.Height := 100;
          edt.Parent := Self;
        end;
    2 :
        begin
          pnl := TPanel.Create(Self);
          pnl.Left := 10;
          pnl.Top := 10;
          pnl.Width := 100;
          pnl.Height:= 100;
          pnl.Parent := Self;
        end;
  end; //case
end;

(more…)

Interface’ler ile bir senaryo..

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

Bu konu çok derin bir konu ancak kısaca bir giriş yapmak istiyorum. Aslında koddan çok kullanım amacını anlatmaya çalışacağım.O yüzden bir senaryo üreteceğim.Diyelim ki; siz component üreten bir firmada yazılım proje yöneticisisiniz. Her türlü tasarım sizden geçiyor ve diyelim ki veritabanı bağlantıları ile ilgili componentler geliştirmeniz gerekiyor.Ekibinizde yeterli sayıda programcınız var.Ancak programcıların çok başına buyruk marjinal insanlar olduklarını da deneyimlerinizle biliyorsunuz ve onlara da yeterince güvenmiyorsunuz ;) Mesela, daha somut örnekler verirsek. Diyelim ki, üretilecek olan componentler SQL Server’a, Sysbase’e , Oracle’a , Interbase’e , Informix’e , DB2′ya bağlanabilmeli diye bir zorunluluk var.Bunu sağlayabilmek adına ekibi topladınız ve programcılarınızın yetenekleri ölçüsünde her bir sınıfın tasarımını ilgili kişilere verdiniz.Ve biliyorsunuz ki herhangi bir veritabanına bağlanacak olan bir sınıfın temelde uygulaması gereken iki metod var Open ve Close ve siz de programcılarınıza bu tecrübenizi ve bilginizi aktardınız. Ama dedik ya programcılar marjinal insanlardır diye. Bakın programcılarımız ne yaptı:

TSQLConnection = class(TBaseConnection)
public
  procedure OpenConnection;
  procedure CloseConnection;
end;

TOracleConnection = class(TBaseConnection)
public
  procedure Open;
  procedure Close;
end;

TSybaseConnection = class(TBaseConnection)
public
  procedure Connect;
  procedure Disconnect;
end;

(more…)

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…)