Protected özellikleri Hack’leyelim ;)

// 15 Mayıs 2009 // 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:

  • TObject
  • TPersistent
  • TComponent
  • TControl
  • TWinControl
  • TCustomEdit
  • TEdit
  • Güzel bir hiyerarşi :) Hemen TEdit’in Color özelliğine bakıyoruz. Hımm burada ilginç bir şeyle karşılaşıyoruz. TEdit sınıfı Color özelliğini TControl’den alıyormuş.Peki biz kodumuzda cControl isimli değişkenimizi TWinControl olarak yani TControl’den daha kapsamlı bir sınıf olarak tanımlamış olmamıza rağmen neden Color özelliğine ulaşamıyoruz ki..? Hemen celalleniyoruz ve TWinControl sınıfını incelemeye alıyoruz.TWinControl sınıfını nerede buluruz ? Tabii ki Controls.pas dosyası satır 1.038 de ;) Şimdi Color özelliğini aramaya başlıyoruz.Hay Allah ne protected’da ne de public’de yok..Peki aklımıza TEdit sınıfında nasıl olurda Color özelliğini görebiliyoruz sorusu geliyor ! Hemen rotamızı TEdit sınıfının tanımlı olduğu StdCtrls.pas satır 256 çeviriyoruz. Evet bingo, bulduk ama sadece şöyle bir tanımla karşılaşıyoruz:

    published
    …
    …
    …
        property Color;
    

    Hımm diyoruz iyi de şimdi biz bunu nasıl kullanacağız aklımız iyice karıştı.TEdit bileşeni büyük büyük büyük dedesinden miras aldığı Color özelliğini kendi içerisinde published bloğunda tekrar tanımlayarak kullanılabilmesini sağlamış.İyide biz nasıl kullanacağız, hala aynı noktadayız ve bir arpa boyu bile ilerleyemedik. İşin kaynağına inmeye karar veriyoruz.TControl sınıfının tanımlandığı Controls.pas’ın 616′ncı satırına gidiyoruz.Kızgınlıkla arıyoruz Color tanımını ah bir bulsam onu diye geçiriyoruz içimizden bir yandan da..Ahaa bulduk 855′nci satırda.Hımm gördük ki bu protected olarak tanımlanmış.Normal şartlar altında bir mol gazın 22.4 lt. olması gerektiği gibi protected verilere de aynı pas dosyası içerisinde değilsek ve onu miras alan bir sınıfımızın tanımının olduğu pas dosyası içerisinde değilsek erişemeyiz. Ama size sunacağım bir üçkağıt ile bu tarz durumların üstesinden gelebilirsiniz.Delphi’yi kandıracağız(Gerçi üzülüyorum emektarı kandırdığımız için ama neyse..)

    Kodumuz şu hale gelecek:

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

    Derlemeye çalışıyoruz ve hatasız bir şekilde derlendiğini görüyoruz.Peki ne oldu şimdi burada, ben sevgili emektar Delphi’mi nasıl kandırdım, bunu yaparken hiç utanmadım mı ? Aslında olay şöyle oluyor.. THackClass tanımı normal bir sınıf tanımlamasından farklı değildir.Biz THackClass’ı TControl’den miras alıyoruz.Dolayısı ile protected üyeleri ve public üyelerini kullanma hakkına sahip olmuş oluyoruz. Bundan sonra da kısa bir tip çevrimi ile amacımıza ulaşıyoruz. ;)

    Saygılar, sevgiler..

    “Protected özellikleri Hack’leyelim ;)” için 2 Yorum

    1. Olcay DAĞLI diyor ki:

      Protected özelliklere erişim şeklini bu makale ile öğrenene kadar TADOQuery nesnesindeki CommandTimeOut özelliğine bir türlü ulaşamıyor ve uzun süren işlemlerde sürekli TimeOut haası alıyordum. Paylaşım için teşekkürler hocam, eline emeğine sağlık…

      Not : Sayende TADOStoredProc ile tanışarak Stored Procedure’lerin nimetlerinden faydalanır ve TADOQuery nesnesini hiç kullanmaz olduk ama :) Object Oriented dünyada protected özelliklere erişim ihtiyacı her programcının mutlaka bir gün karşısına çıkacaktır.
      Makalelerinin devamı ümidiyle…

    2. Tuğrul HELVACI diyor ki:

      Faydam olabildi/olabiliyor ise ne mutlu bana Olcayım.

    Yorum Yazın