Class of ……

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


Şimdi yukarıdaki kullanım olmaz mı ? Olur tabii neden olmasın iş görüyor netice de ama pek şık değil ve bazı güçlerden yoksun. Mesela artık TPanel yerine TLabel oluşturmak istesek kodun bir sürü yerini değiştirmek zorunda kalacağız. Peki şöyle mis gibi bir fonksiyonum olsa da ben ona yaptırsam bu işi diye düşünüyor ve böylelikle bir değişiklik yapmam gerektiğinde sadece fonksiyonumu değiştirsem diyorsanız..Bence doğru düşünüyorsunuz derim sizlere.. O halde bu fonksiyonumuz nasıl olmalı.? Şöyle bir düşünelim..Benim TForm nesnesi üzerine koyduğum görünen tüm bileşenlerin hepsi TControl’den türemiş o halde bu fonksiyonuma ben parametre olarak TControl geçsem her türlü nesneyi oluşturabilirim diyorsunuz.Evet güzel bir yaklaşım..Ama doğru mu ? Hayır değil..! Neden değil, çünkü fonksiyona parametre olarak geçeceğiniz bir TControl değişkeni için Delphi sizden daha önce oluşturulmuş bir nesne örneği bekler. Ama bizim yapmak istediğimiz o değil ki.. Biz CreateControl(TEdit) gibi birşey yazmak istiyoruz. TEdit nedir peki nesne midir ? Hayır nesne değildir.Bir class‘dır. O halde bizim class’ları tutabilecek bir yapıya ihtiyacımız var ki fonksiyona bir class parametresi geçebilelim.Kafalar biraz karıştı sanırım.Şimdi örnekle izah etmeye gayret edelim.

type TControlClass = class of TControl; // Class’ları içerebilen bir değişken tipi tanımladık.!!

 function CreateControl(ControlClass : TControlClass; ControlName : String) : TControl;
 begin
   Result := ControlClass.Create(Form1);
   Result.Left := 10;
   Result.Top := 10;
   Result.Width := 100;
   Result.Height := 100;
   Result.Name := ControlName;
   Result.Parent := Form1;
 end;

var
  mControl : TControl;
begin
  case RadioGroup1.ItemIndex of
    0 : mControl := CreateControl(TMemo, ‘Memo1′);
    1 : mControl := CreateControl(TEdit, ‘Edit1′);
    2 : mControl := CreateControl(TPanel, ‘Panel1′);
  end;
end;

Bu kullanım daha kolay ve daha esnek değil mi sizce de ;)

Saygılar, sevgiler..

Yorum Yazın