Derler ki Türk'ün aklına ince ayrıntılar hep sonradan gelirmiş. Oturduk vakit geçsinde biz böyle yaptık dediklerimizi eşle dostla paylaşalım diyerek bu yazı dizisine soyunduk, ancak gördük ki daha asfaltın üstüne bile çıkmamış, toprak üzerinde emekliyoruz.
.NET büyük bir okyanus, bildiklerimiz o okyanusda bir damla bile değil. Sakin ve emin adımlarla ilerlemek gerek. Bildiğiniz üzere konumuz .NET değil, Delphi 2006 ve ASP.NET. Bu yüzden eğer benim gibi uzun zaman win32 platformu içinde kod yutmuşsanız .NET mevzusunda bazı konuları anlamakta ilk zamanlar zorlanabilirsiniz. Endişelenmeyin zamanla alışırsınız. Burada naçizane bir önerimede kulak vermenizi istiyorum. Kullandığınız dil ne olursa olsun eğer .NET FRAME WORK ile uğraşacaksanız mutlaka bir çok kaynağı incelemeye çalışın. Çünki her yiğidin yoğurt yemesi farklı farklı.
Yazı dizimizin 4 ncüsüne hoş geldiniz diyor ve konuya dönüyoruz.
Hızlı bir şekilde girdiğimiz ASP.NET konusunda bugün bir adet place holder kullanıp çalışma zamanında herhangi bir user control sayfasını delphi kodu yazarak uygulamaya dahil edeceğiz. Sanırım artık kullandığımız terimler ile akrabalık ilişkilerinizi kuvvetlendirmeye başlamışsınızdır. Bu yakınlığınızı pekiştirmek ve kısa bir özet yapmak adına ;
- ASPX dosyaları uygulamanın görsel tasarım öğelerini barındıran ve sunuculardan direkt çağrılabilen web sayfalarıydı. Örneğin http://www.arsivbank.com/default.aspx gibi. Uygulamanın içinde kullanacağımız ve adına HTML elemanlarıyla Web kontrolları adını verdiğimiz nesneler ile kullanıcı kontrolü (ascx)sayfalarını bu sayfaların üzerine yerleştiriyorduk. Bu sayfalarla ilgili diğer teknik bilgiler hakkında bundan önceki yazılara bakarak fikir edinebilirsiniz.
- ASCX dosyaları tıpkı ASPX dosyaları gibi üzerlerinde görsel tasarım öğelerini barındıran ancak bir ASPX sayfasına tutturularak görüntülenebilen dosyalardı. Yani bu sayfaları direkt isimleriyle çağıramıyorduk. Biz bu dosyalara Türkçe kullanıcı kontrolleri Nam-ı diğer user control sayfaları adını veriyorduk.
- Pas dosyalarıysa şu .NET aleminde code-behind diye tabir edilen bizim emektar unit dosyalarının tıpkısının aynısı gibi gibi. Niye gibi gibi olduğunu yeri geldikçe göreceksiniz. Sonuçta üreteceğimiz ASP.NET sayfası bir Dinamik Bağlantılı Kütüphane (DLL) olacağından esas oğlan rolündeki kodlarımızı, procedure, yöntem, özellik, değişken,fonksiyon, class vs. yapılarımızı eskiden olduğu gibi pas dosyalarının içine yerleştiriyoruz.
- Name Space. Ahan buda ne dediğinizi duyar gibiyim. Sakın yerinizden zıplayıp başınızı tavana vurmayınız. Name Space yada Türkçesiyle UZAY ADI bizim USES bildirimiyle çalıştığımız unit içine eklediğimiz bildik unitlerin .NET dünyası için icad edilmiş şeklinin adı oluyor. Hani biz kullandığımız unit içinde bir sınıf, tip vs. deklare ederken ilgili unitide uses ile ekliyorduk ya, işte .NET dünyasında aynı işi yapıyoruz ama bu sefer unit isimleri birazcık farklı. Bu farklı stildeki untilerede NAME SPACE deniyormuş. Bunu aklınızın bir kenarına not edin. İşte size tipik bir uzay adı bildirim listesi ;
uses System.Collections, System.ComponentModel, System.Data, System.Drawing, System.Web, System.Web.SessionState, System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls, MySql.Data.MySqlClient;
Daha söylenecek ve yazılacak çok şey var ama hepsini birden toparlamak ve delphice anlatmak o kadar kolay olmuyor. 3 nolu TV. dizimizde adı geçen user control olayını bir aspx sayfasına nasıl statik olarak tutturduğumuzu anlatmıştık. Şimdide kullanıcının tıklamasına binaen bir kullanıcı kontrolü (ascx) sayfası üzerine bir başka ascx sayfasını nasıl dinamik yerleştirebileceğimizi anlatarak bu yazıyıda burada sonlandıralım. Dikkat ettiyseniz bir ascx sayfasını başka bir ascx sayfasına tutturmaktan söz ediyorum. Demek ki kullanıcı kontrolleri hem aspx hemde ascx sayfalarına tutturulabiliyormuş. Nasıl ?
Dinamik Kullanıcı Kontrolleri ve PlaceHolder Nesnesi :
Öncelikle yapıyı bir özetleyelim. Elimizde bir adet default.aspx adında web sayfası var. Bunun üzerindede statik tutturulmuş 5 adet user control (ascx) var. Bunlardan biri orta_yazi_sablonu.ascx. İşte dinamik tutturma işlemini bu kullanıcı kontrol sayfası üzerinde yapacağız. Amacımız kullanıcı herhangi bir linke tıkladığında ilgili bağlantı sayfasının bu kontrolün içinde çıkmasını sağlamak. Çalışma anında kullanıcının seçtiği bağlantıyla ilgili kullanıcı kontrol (ascx) sayfasını orta_yazi_sablonu.ascx sayfasına tutturmak için sırasıyla ;
- orta_yazi_sablonu.ascx sayfasını design sekmesine tıklayarak görüntülüyoruz.
- Tool palette > Web Controls altından bir adet PlaceHolder web kontrolünü sayfa üzerine bırakıyoruz
- Sayfa üzerine bıraktığımız PlaceHolder1 nesnesinin ismini object inspector aracılığıyla PlaceHolder_Yazi olarak değiştiriyoruz.
- Yine orta_yazi_sablonu.pas yazılı sekmeye tıklayarak unit kod sayfasını açıyoruz. Bu sekmelerin yerleşimini önceki yazıda göstermiştim. Karşımıza aşağıdaki kodların hazır olarak geldiğini göreceksiniz. Ben ihtiyaca binaen iki adet fazladan Label web control nesnesi ekledim kafanız karışmasın.
PAS Dosyası unit orta_yazi_sablonu; interface uses System.Data, System.Drawing, System.Web, System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls,System.Web.SessionState ; type /// <summary> /// Summary description for WebUserControl1. /// </summary> TWebUserControl1 = class(System.Web.UI.UserControl) {$REGION 'Designer Managed Code'} strict private procedure InitializeComponent; {$ENDREGION} strict private procedure Page_Load(sender: System.Object; e: System.EventArgs); strict protected PlaceHolder_Yazi: System.Web.UI.WebControls.PlaceHolder; Label1: System.Web.UI.WebControls.Label; Label2: System.Web.UI.WebControls.Label; procedure OnInit(e: System.EventArgs); override; private { Private Declarations } public { Public Declarations } end; implementation procedure TWebUserControl1.Page_Load(sender: System.Object; e: System.EventArgs); Var osyf : Integer; begin osyf := 0; if (Assigned(Page.Request.Params['p'])) AND (Page.Request.Params['p'] <> '') then osyf := Int32.Parse(Page.Request.Params['p'].ToString) else osyf := 0; case osyf of 0 : begin Label1.Text :='Arşivbank Hakkında'; Label2.Text :='Arşivbank Konsepti'; PlaceHolder_Yazi.Controls.Add(Page.LoadControl('de fault_orta.ascx')); end; 1 : begin Label1.Text :='Arşivbank Projesi Hakkında'; Label2.Text :='Arşivbank Tasarlama ve Gelişim Süreci'; PlaceHolder_Yazi.Controls.Add(Page.LoadControl('or ta_about.ascx')); end; 2 : begin Label1.Text :=''; Label2.Text :='Arşivbank Proje Ekibi'; PlaceHolder_Yazi.Controls.Add(Page.LoadControl('pr oje_ekibi.ascx')); end; 3 : // Geliştiriciler için yönetim paneli begin Label1.Text :=''; Label2.Text :='Geliştirici Girişi'; PlaceHolder_Yazi.Controls.Add(Page.LoadControl('ge listirici_login.ascx')); end; 998 : begin Label1.Text :=''; Label2.Text :='Kazanovadan'; PlaceHolder_Yazi.Controls.Add(Page.LoadControl('ur lden_veri_al.ascx')); end; 999 : // Geliştiriciler için yönetim paneli begin if (Assigned(Page.Session['uid'])) and (Page.Session['uid'].ToString <> '') and (Page.Session['rid'].ToString <> '') then begin Label1.Text :=''; Label2.Text :='Kimler Geldi'; PlaceHolder_Yazi.Controls.Add(Page.LoadControl('ki mler_geldi.ascx')); end else begin Label1.Text :=''; Label2.Text :='Önce Yetkili Kullanıcı Olarak Oturum Açın...'; //PlaceHolder_Yazi.Controls.Add(Page.LoadControl('ge listirici_login.ascx')); end; end; else begin Label1.Text :='Arşivbank Hakkında'; Label2.Text :='Arşivbank Konsepti'; PlaceHolder_Yazi.Controls.Add(Page.LoadControl('de fault_orta.ascx')); end; end; end; procedure TWebUserControl1.OnInit(e: System.EventArgs); begin // // Required for Designer support // InitializeComponent; inherited OnInit(e); end; {$REGION 'Designer Managed Code'} /// <summary> /// Required method for Designer support -- do not modify /// the contents of this method with the code editor. /// </summary> procedure TWebUserControl1.InitializeComponent; begin Include(Self.Load, Self.Page_Load); end; {$ENDREGION} end. Neler oluyor ? procedure TWebUserControl1.Page_Load(sender: System.Object; e: System.EventArgs);
Bütün mevzu bu yöntemin içinde icra ediliyor. Page_Load sayfa yüklenirken devreye giriyor. Tıpkı win32'de OnShow yöntemi gibi. Aşağıdaki kodlar kullanıcının talebini alıyor.
osyf := 0; if (Assigned(Page.Request.Params['p'])) AND (Page.Request.Params['p'] <> '') then osyf := Int32.Parse(Page.Request.Params['p'].ToString) else osyf := 0; Eğer web programlamaya yabancıysanız size acilen GET ve POST methodlarını, web sayfalarında FORM kullanımını kavramanızı öneririm. Biz yinede kısaca değinecek olursak ; Kullanıcının tıklayacağı bağlantı linki şunun gibi bir şey oluyor : http://www.arsivbank.com/default.aspx?p=1
İşte bu ifade ile p=1 default.aspx'e ordanda buna tutturulmuş diğer sayfalara GET metoduyla web parametresi olarak geçiliyor. Sayfa yüklenirken "p" parametresinin değeri test ediliyor ve bir değişkene INT32.Parse kullanılarak aktarılıyor. Burada INT32.Parse string bir ifadeyi integer tipine çevirmek için kullanılıyor. Daha sonra çağrılan sayfaya uygun kullanıcı kontrolü (ascx) sayfası placeholder nesnesine aşağıdaki kodlarla yerleştiriliyor.
case osyf of 0 : begin Label1.Text :='Arşivbank Hakkında'; Label2.Text :='Arşivbank Konsepti'; PlaceHolder_Yazi.Controls.Add(Page.LoadControl('de fault_orta.ascx')); end; 1 : ----------------
Dikkat ettiyseniz söz dizimi bizim alışık olduğumuzdan çok farklı değil. Ama bu her yerde böyle değil. Onlarıda gelecek sayıda göreceğiz. Şimdilik hoşçakalın, mutlu kalın.