|
#1
| ||||
| ||||
| Delphi 2006 ile ASP.NET ve Arşivbank Başlıktan da anlayacağınız üzere dilim döndüğü, vaktim yettiği kadar bizim bankanın site tasarımını yaparken yaptığım işleri, kodları, rastladığım ipuçlarını burdan paylaşacağım. Olaki daha iyisini bilen arkadaşlarımız bize extra bilgiler sağlayarak katkıda bulunur, yol gösterirler. UMut ediyorum ki bu yazı dizisi sonunda paylaşacağımız tüm bu bilgiler sadece delphi 2006 için değil, .NET FRAME WORK uygulamalarının tamamını kapsayan güzel bir kütüphane olacaktır. Cevizde zaten ASP.NET için bir forum mevcut olduğundan, muhtemelen eksiklerimizin, yanlışlarımızın çoğunu bu bölümdeki arkadaşlarımızın desteği ile gidereceğiz. Biz onlara Visual Studio sürümlerine alternatif olarak Delphi 2006 masalını okuyacağız, onlarda bize ASP.NET ile ilgili konuları anlatacak, yol gösterecekledir. Dilimin dönmediği, vaktimin yetmediği yerlerde yardım ve desteğinizi esirgemeyeceğinizi umaraktan ufak ufak başlayalım. Gerekli Takım Taklavat Listesi : Biraz yemek tarifi gibi oldu ama espriyi bozmamak adına burada anlatacaklarımızı uygulayabilmek için aşağıda listelenen uygulamalara ihtiyacımız olacak.
BDS 2006'yı Nasıl Başlatsak ? Ben delph 6 ya kadar olan sürümlerin hepsiyle iyi kötü çalıştım. Arada Delphi7' ve 2005'i atladım. Ama biraz delphi 8 aşnalığımda yok değil. Nerdeyse delphi işini bırakıp C# ve Visual studio işine dalacaktım ki, Borland'cı kardeşlerimiz Delphi 2006'yı tasarlamışlar. İyide yapmışlar kalbimi tekrar kazandılar. Saydım BDS 2006'da tam 4 çeşit başlangıç şekli var. Şimdi şekillerle ilgilenmediğimizden yeri gelirse deşeriz. Bize ASP.NET için lazım olanlar ;
![]() Yazıyı daha fazla uzatmamak ve ceviz'in reklam gelirlerini artırmak için tamda bu noktada bir reklam arası veriyoruz. Arayı fazla uzatmadan devam etmeye çalışacağız. Reklam arasında yazıya ilişkin eleştirilerden çok, ASP.NET ile ilgili bilgilere ağırlık vereceğinizi umuyorum. Baştada söylediğim gibi bende yazarken sizinle birlikte öğreniyorum. Her ne kadar burada herkes acemiyim diye bağırsada biz kimin acemi kimin usta olduğunu biliyor ve bu ustaları zevkle takip ediyoruz değil mi? Hepinize selamlar, çalışmalarınızda başarılar.. __________________ ![]() #include <middleeast.h> #define ISRAELIS foul_beasts |
|
#2
| ||||
| ||||
| 2 Nolu Yazı 2 Nolu Yazı Reklam arasının kısa olanı makbüldür. Delphice ASP.NET ile arşivbank sitesi tasarımı konusundaki 2 nolu yazımıza hoş geldiniz. Eğer sizde benim gibi tüm uygulamalarda en son çare yardım sistemlerine bakıyorsanız .NET uygulamaları geliştirirken zaman zaman buna ara vermenizi, bir örnek üzerinde çalışırken sık sık imdat düğmesine basmanızı öneririm. BDS 2006'da yeni bir proje oluşturduğumuzda ekrana gelen New ASP.Net Application penceresinde boş yerleri doldurup OK. dediğimizde ; 1. Önce IIS'de sanal bir web yolu (Alias) oluşturuluyor. (Resim-1) ![]() Resim - 1 2. IIS'in kurulu olduğu sürücüde wwwroot altında proje adıyla eş isimli bir klasör oluşturuluyor. 3. Proje adıyla oluşturulan klasörün altınada bin ismiyle derleme sonucu ASP.NET dll dosyası ve kullanacağınız diğer paketlerin yer alacağı bir başka klasör oluşturuluyor. 4. Yine proje klasörünün altına Webform.aspx, global.asax, web.config, Webform1.pas dosyaları oluşturuluyor. Klasör ve dosya yapısı : <DIR> . <DIR> .. <DIR> bin Global.asax Global.pas Web.config WebForm1.aspx WebForm1.pas gibi bir hal alıyor. Burada aynı isme fakat farklı uzantıya sahip WebForm1.* dosyaları üzerinde çalıştığımız projede kullanacağımız temel dosyalar, global.asax ve web.config dosyalarıda uygulamanın global ayar ve değişken tanımlarının saklandığı dosyalar. Şimdilik bu son iki dosyayı atlıyoruz. WebForm.* Dosyaları Eğer Asp, php gibi bir web betik diline el ve göz alışkanlığınız varsa tasarım için kullanılan sayfalarla, dinamik eleman öğeleri, procedure, fonksiyon ve değişken tanımlamalarının iç içe geçtiğini, bu yüzdende bazen tasarımın okunurluğunun azaldığını hatırlayacaksınız. Php gibi dillerde bu tip durumlar için template sınıfları, şablon dosyaları kulanılabiliyormuş. Asp'deki durumu bilmiyorum. Şahsen okuma yazma bildiğimden web tasarım etiketleriyle, betik dil kodlarının bir birine geçmesi konusunda hiç şikayetçi olmadım. Ancak tasarımla kodlamanın ASP.NET'teki gibi ayrılabilmeside gerçekten okunurluğu artırıyor. ASPX ve birazdan değineceğimiz ASCX uzantılı sayfalar kodlamayla tasarımın ayrıştırılmasında kullanılıyor. BDS 2006 bir ASPX/ASCX sayfası üzerinde tıpkı frontpage, dreamwaver vs uygulamalarındaki gibi tasarımı anında gösterebilme yeteneğine sahip. Bu sayfaların üzerine .NET Web ve Dataset bileşenleri, HTML etiketleri ve form elemanlarını koyuyoruz. Koyduğumuz her bir elemana karşılık BDS aşağıdaki örnekte görüleceği üzere ilgili tasarım dosyasına bizim için gidip gereken ifadeleri çiziktiriyor. (Resim - 2) ![]() Resim -2 Buda bu sayfanın içindekiler : <%@ Control Language="c#" AutoEventWireup="false" Codebehind="gelistirici_login.pas" Inherits="gelistirici_login.TWebUserControl1"%> <p>Lütfen Kullanıcı adınız ve şifrenizle giriş yapınız.<br></p> <table cellspacing="0" cellpadding="0" border="0" align="center"> <tr> <td align="right">Kullanıcı </td> <td> <input id="kullaniciadi" name="kullaniciadi" style="BORDER-RIGHT: #000080 1px outset; BORDER-TOP: #000080 1px outset; BORDER-LEFT: #000080 1px outset; WIDTH: 78px; BORDER-BOTTOM: #000080 1px outset; HEIGHT: 18px; BACKGROUND-COLOR: #ffffec" size="9"> </td> </tr> <tr> <td align="right">Şifre </td> <td> <input type="password" id="sifre" name="sifre" style="BORDER-RIGHT: #000080 1px outset; BORDER-TOP: #000080 1px outset; BORDER-LEFT: #000080 1px outset; WIDTH: 78px; BORDER-BOTTOM: #000080 1px outset; HEIGHT: 18px; BACKGROUND-COLOR: #ffffec" size="9"> <td></tr> <tr> <td align="right">G.Kodu </td> <td> <input id="guvenlikkodu" name="guvenlikkodu" style="BORDER-RIGHT: #000080 1px outset; BORDER-TOP: #000080 1px outset; BORDER-LEFT: #000080 1px outset; WIDTH: 78px; BORDER-BOTTOM: #000080 1px outset; HEIGHT: 18px; BACKGROUND-COLOR: #ffffec" size="9"> </td> </tr> <tr> <td align="center"> <ASP abel id="Label_GuvenlikKodu" runat="server" forecolor="#483D8B" font-bold="True" font-size="Medium">0</ASP abel></td> <td> <ASP:Button id="Button1" runat="server" text="Oturum Aç" width="74px" borderstyle="Solid" borderwidth="1px" backcolor="#4682B4" forecolor="#F0F8FF"></ASP:Button> </td> </tr> <tr> <td colspan="2" align="center"> <ASP abel id="Label_Hata" runat="server" forecolor="Red" font-size="Smaller">---</ASP abel></td> </tr> </table> Herhalde pas uzantılı dosyanın ne işe yaradığını söylemeye gerek yok. Buda bu sayfanın pas dosyası. unit gelistirici_login; interface uses System.Data, System.Drawing, System.Web, System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls, System.ComponentModel, Borland.Data.Provider,System.Web.SessionState, System.Configuration, MySql.Data.MySqlClient,Borland.Vcl.SysUtils; type /// <summary> /// Summary description for WebUserControl1. /// </summary> TWebUserControl1 = class(System.Web.UI.UserControl) {$REGION 'Designer Managed Code'} strict private components: System.ComponentModel.IContainer; procedure InitializeComponent; procedure Button1_Click(sender: System.Object; e: System.EventArgs); {$ENDREGION} strict private procedure Page_Load(sender: System.Object; e: System.EventArgs); strict protected Button1: System.Web.UI.WebControls.Button; MySqlBaglantisi: MySql.Data.MySqlClient.MySqlConnection; MySqlCommand1: MySql.Data.MySqlClient.MySqlCommand; Label_GuvenlikKodu: System.Web.UI.WebControls.Label; Label_Hata: System.Web.UI.WebControls.Label; procedure OnInit(e: System.EventArgs); override; private FHataKodu : String; procedure SetGuvenlikKodu; function GecerliGelistiriciGirisimi: Boolean; { Public Declarations } end; implementation function RandomString(PWLen: integer): string; const StrTable: string = 'ABCDEFGHIJKLM' + '0123456789' + 'NOPQRSTUVWXYZ'; var N, K, X, Y: integer; begin Randomize; if (PWlen > Length(StrTable)) then K := Length(StrTable)-1 else K := PWLen; SetLength(result, K); Y := Length(StrTable); N := 0; while N < K do begin X := Random(Y) + 1; if (pos(StrTable[X], result) = 0) then begin inc(N); Result[N] := StrTable[X]; end; end; end; function TWebUserControl1.GecerliGelistiriciGirisimi:Boolea n; Var _MySqlDataReader : MySqlDataReader ; begin try ------------ Editörün session time out'una yakalanmadan ASCX ve ASPX hakkında bir kaç giriş bilgisi daha ekleyip bu yazıyıda reklam arası için burada kesiyorum. ASPX ve ASCX arasındaki Fark İkiside tasarımla ilgili bilgileri tutmasına rağmen bir aspx uzantılı dosya web sunucusundan doğrudan doğruya çağrılabilirken ascx uzantılı dosyalar bir aspx dosyasına tutturularak görüntülenebilmektedir. Tutturma ile ilgili işlemlere ileride değineceğiz. Ancak bu tutturma işleminin php' ve asp dekine benzediğini ama onlardan daha öte bir şey olduğunu aklınızda tutmanız yeterli. Tabii ki ASP.NET ile kullanılan başka dosya tipleride vardır. Ama okuyup yazabildiğimiz kadarı şimdilik bu kadar. Bana verilen sürenin ve bir yazının daha sonuna geldik. Devamında buluşmak üzere, hoşçakalın. ![]() #include <middleeast.h> #define ISRAELIS foul_beasts |
|
#3
| ||||
| ||||
| Gözüme artık bir Türk dizi film klasiği gibi görünmeye başlayan yazı dizimizin 3 ncüsüne hoş geldiniz. Bu yazımızda Arşivbank sitesinin tasarımında gerekli malzemeler arasında saydığımız CSS dosyaları ile bir önceki yazıda kısaca değindiğimiz ASPX - ASCX sayfaları üzerinde duracağız. Yeni bir ASP.NET projesiyle birlikte BDS 2006'nın bizim için oluşturduğu dosyaları sıralarken bunlardan birininde WebForm1.ASPX olduğunu belirtmiştik. Ayrıca hatırlamak bakımından ASPX ve ASCX sayfalarının (dosyalarının) tasarımla kodlamayı birbirinden ayırmak için kullanıldığından söz etmiş ve buna ilişkin sayfa içeriklerini göstermiştik. Diğer web betik dilleriylede kullanılan sayfa içeriğinin belli şartlara göre belli yerlerinin değiştirilmesi, kalan kısımların standardizasyonun sağlanması bakımından aynı kalması için sayfayı enust, orta, sol, sag ve enalt olmak üzere 5 temel parçaya bölmeye karar verdim. Bu sayfaların yerlerine bağlı olarak ilgili CSS dosya şablonlarını yerleştirdim. En üstte bir banner ve ana gezinti bağlantıları, solda gezinti bağlantıları, sağda yönetim panelleri ve kısa duyuru başlıkları, en altta telif hakkı, tasarım bilgileri vb., ve ortada haberler ve kullanıcı seçimine göre ilgili sayfalar çıkacak biçimde yapılan tasarımda şimdilik bir tane ASPX sayfası ve oldukça fazla ASCX sayfası bulunmaktadır. ASCX sayfaları .NET dilinde User Control (Kullanıcı Kontrolü) Page olarakta anılmaktadır. Daha öncede belirttiğimiz gibi tek başlarına published (yayımlanma) edilmeleri mümkün olmayan bu sayfalar ancak bir ASPX sayfasına tutturularak kullanılabilmektedir. Bizim tasarımımızda mevcut tek ASPX sayfasının üzerinde aşağıdaki resimde görülen user control (ASCX)(Kullanıcı kontrol) sayfaları bulunmaktadır. Tabi biraz hızlı gidiyoruz. Yürümeyi bilmeyen birinden koşmasını beklemek olmaz. Delphi IDE'yi kullanmayı bildiğinizi varsayıyorum. Eğer buraya yabancıysanız biraz mıncıklayın çabuk öğrenirsiniz. Yeni bir ASP.NET projesi oluştururken BDS'NİN otomatik oluşturduğu WebForm.ASPX sayfasının adını default.aspx ile değiştirdim. Ve her yeni user control sayfasını File > New > Other > ASP.NET User Control seçenekleriyle tek tek oluşturdum. Oluşturduğum User Control sayfalarını aspx sayfalasına statik olarak bağlamak için BDS desing sekmesine geçip ilgili UserControl sayfasını project manager'dan default.aspx sayfasının üzerine sürükleyip bıraktım. Project manager'i görüntülemek için CTRL+ALT+F11 yapın. BDS içinde sayfanın adıyla, koduyla, tasarımıyla ve geçmişiyle ilgilenmek içinde aşağıdaki resimde görülen sekmelere tıklayın. Bu basit sürükle bırak işleminin arkasından BDS bizi bir sürü dertten kurtarıp User Control sayfasıyla ilgili bilgileri aspx sayfamızda page direktifinden sonra ilgili yerlere yerleştiriyor. Alıntı: <%@ Page language="c#" Debug="true" Codebehind="default.pas" AutoEventWireup="false" Inherits="Default.TWebForm_Default" Trace="false"%> Her bir usercontrol tanımı aspx sayfamıza kod olarak bu bildirimlerle ekleniyor. Alıntı: <%@ Register TagPrefix="uc1" TagName="enust" Src="enust.ascx"%> <%@ Register TagPrefix="uc1" TagName="sol_sidebar" Src="sol_sidebar.ascx" %> <%@ Register TagPrefix="uc1" TagName="default_orta" Src="default_orta.ascx" %> <%@ Register TagPrefix="uc1" TagName="sag_menubar" Src="sag_menubar.ascx" %> <%@ Register TagPrefix="uc1" TagName="enalt" Src="enalt.ascx" %> <%@ Register TagPrefix="uc1" TagName="orta_yazi_sablonu" Src="orta_yazi_sablonu.ascx" %> Dikkat ettiyseniz daha tek satır kod yazmadık. Bütün işi BDS bizim için yapıyor. Yukarıdaki user control sayfa deklarasyonunu incelemenizi öneririm. Tüm .NET platformunda geçerli olan bu söz dizimiyle ilgili bir imdat merkezine uğrayın. Ben dilim döndüğü kadarıyla tercüme edeyim. <%@ Page language="c#" Üzerinde çalıştığımız sayfa tanımını deklare etmek için kullandığımız ayan beyan ortada. language="c#" bildirimi sayfanın konuştuğu dili anlatıyor. Biz BDS ile yazıyoruz ne alaka dediğinizi duyar gibiyim. Bencede ama anladığım kadarıyla BDS derleme aşamasında sayfaları C# ile uyumlu derliyor olmalı. Dil olarak VB, JS gibi dilleride seçebiliyoruz. Her bir ASPX sayfasında sayfa direktifinden yanlızca bir adet bulunabilir. Debug="true" Değerini işimiz bitip yayına vereceğimizde false yapıp kapatıyoruz ki .NET tasarım yapmadığımızı bilsin. Codebehind ="default.pas" ile bu aspx sayfasının ilişkili olduğu kodlama unit dosyasını gösteriyoruz. Bu biraz dfm-pas ilişkisine benziyor. Ancak tam olarak böyle değil. Çünki aspx uzantılı sayfa içeriği kendi içinde barındırılıyor. Inherits="Default.TWebForm_Default" Sayfa oluşturulurken kullanılacak sınıf tanımı. TWebForm_Default = class(System.Web.UI.Page) Trace="false" Sayfa oluşumu ve yayımı esnasında tüm ayrıntılarıyla değişen durumlarını, istemci-sunucu arasındaki diyalogları izlemek için "true" kapatmak için "false". Çok kullanışlı bir icat olmuş. <%@ Register TagPrefix="uc1" TagName="enust" Src="enust.ascx" %> Sayfaya statik bir user control tutturmak için kullanılan söz dizimi. Dinamik tutturmayı ileride göreceğiz. Sık sık kullanacağımız işlemlerde örneğin aynı tasarımı birden fazla yerde kullanmamız gerektiğinde User Control sayfalarından faydalanmalıyız. Arşivbank tasarımında orta sayfa hariç diğer bölümler sitenin tüm bölümlerinde aynı olacağından ana sayfayı (default.aspx)'i 5'e bölüp her bir bölüme bir UserControl ekledim. Orta bölümdeki usercontrol sayfasını ise talebe göre değişecek şekilde tasarladım. Şimdilik dinamik olarak default.aspx'e statik olarak yerleştirilmiş ortayazi_sablonu.ascx sayfasına seçime bağlı olarak başka bir kullanıcı kontrolü sayfasının dinamik olaraka dahil edilmesine ilişkin BDS pas kodunu vererek bu yazıyıda bitiriyorum. Alıntı: procedure TWebUserControl1.Page_Load(sender: System.Object; e: System.EventArgs); Var osyf : Integer; begin osyf := 0; if (Assigned(Page.Request.Params['t'])) AND (Page.Request.Params['t'] <> '') then osyf := Int32.Parse(Page.Request.Params['t'].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; 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; ![]() #include <middleeast.h> #define ISRAELIS foul_beasts |
|
#4
| ||||
| ||||
| 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 ;
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 ;
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. ![]() #include <middleeast.h> #define ISRAELIS foul_beasts |
|
#5
| ||||
| ||||
| Baktım gelen giden çok, ancak ya hocam bak böylede bir şey var diyen yok. Bende kendin çal kendin oyna yazı dizime devam edeyim bari dedim. Hani olaki bu işi bizden iyi bilenler denk gelirse bu yazıları okuyanlar arasına, alta bir kaç ipucu yazsınlar hayır dua edelim. Haklarında iyilikler düşünüp emeklerinin hakkını teslim edelim. 5 nci yazımıza hoş geldiniz diyor kaldığımız yerden çiziktirmeye devam ediyorum müsadenizle. Hadi bir Saydırgaç Ekleyelim : BDS ve ASP.NET ile artık dosttane ilişkiler kurduğumuza, temel sayfa tasarımını yerli yerine oturduğumuza göre siteye geleni gideni sayan, saymakla kalmayıp aklında tutan, soruncada kimin ne zaman kaç kere geldiğini gösteren bir saydırgaç ekleyelim ki veri tabanı işlerine genelinden bir giriş yapmış olalım. Saydırgaçla ilgili mevzulara dallanmadan evvel gelin bu .NET denen cihazat ile birlikte ADO.NET diye anılan mimarinin yapısında bir turistik gezi yapalım. Eskiden ve şimdi de kullandığımız veri tabanı işleri için delphi'de DataSet, ADO vb. türev nesnelerle çalışırdık. "Hocam bir dakka ya biz bunları bilmiyoruz" derseniz boşverin zaten anlatacaklarımın eskiyle pek bağlantısı yok sayılır. Ama konuların kavranması bakımından ; Veri tabanı nedir, yenir mi içilir mi ? Nasıl ve nerede kullanılır ? Tipleri, çeşitleri, kullanım alanları gibi konularda en temel bilgilerle donanmış olduğunuzu varsayıyoruz yine. Değilseniz Ceviz'in http://forum.ceviz.net/forumdisplay.php?f=29 konumunda ve bu bölümün makaleler kısmındaki kıymetli mesai arkadaşlarımızın yazılarına bakmanızı öneririm. .NET ve ADO.NET Kardeşliği Nedir ? Düşünün bir ağ üzerindesiniz. Çoğu zaman www üzerinde hizmet veren bir siteden istifade ediyorsunuz. Bir çok şey veri tabanı denen yapılardan akıp, şekillenip önümüze servis ediliyor. Bizim sonuç çıktılarını gördüğümüz bu düzen bize arka planda hissettirilmeden bir dizi tasarım mucizesi yazılım çözümleriyle geliyor. Bu çözümlerin arka planda nasıl çalıştığı şu anda bizi ilgilendirmiyor. Bizi ilgilendiren kullanılan araç gereç. Yani nesneler. Bir veri tabanında temel ve genel olarak aşağıdaki işleri yaparız.
BDS içinde ADO.NET Bileşenlerinden Bazıları : DataSet : Veri tabanı ile bağlantı kurup her türlü işlemi yapmak için bir dizi yöntem sunan temel veri erişim bileşeni. Okuduğum kaynaklar bu bileşenin mimarisinin saf XML tabanlı olduğunu, her tür ve tipte veriyi desteklediğini, ilk bağlantıdan sonra veriyi alıp bağlantıyı kestiğini anlatıyor. Bu bana client-server mimaride kullandığımız Delta veri yapısını hatırlatıyor. Hani client server mimaride bir veri tabanına bağlanır, veriyi delta diye adlandırdığımız bir hafıza bölgesine (cache) yükler, burada eklemeler düzeltmeler yapar daha sonra değişiklikleri veri tabanına yansıtırdık. Eğer bir sorun çıkarsa güncelleme çakışmalarıyla boğuşur dururduk. Hatta ve hatta delphi'nin bir güncelleme çakışması olay yöneticisini (onReconcileError) özel olarak işlerdik. İşte ADO.NET kütüphanesindeki DATASET bu işi aynı mantıkla daha iyi bir şekilde sorunsuz halledebilmek için tasarlanmış XML tabanlı bir bileşen. SQLDataAdapter : Bağlantılı/Bağlantısız (Connect - Disconnet) yapısıyla veri tabanından çekilen veriyi bir Dataset bileşenine doldurmak, bağlantısız durumda çalışan DataSet bileşeni ile Delta'da tutulan veri üzerinde yapılan değişiklikleri veri tabanına yansıtmak için kullanılıyor. DataTable : Bir veri tabanına karşılık gelen Dataset içinde bir ve daha fazla tablo bulunabildiğini biliyoruz. İşte DataTable bu tablolarda bulunan kayıtlarla ilgili işlemlere yönelik ADO.NET bileşeni. Tablo kayıtları üzerinde yaptığımızı ekleme,güncelleme vb. işlemler bu bileşenin yöntemleriyle yapılıyor. Dataset bu bileşen için ev sahipliği yapıyor. Bir sorgu sonucunda doldurduğumuz veri yığını için DataSet ön tanımlı bir DataTable nesnesi oluşturuyor. DataView : Adı üzerinde veriyi birden fazla biçimde göstermek için kullanılıyor. Görünüş için bir kaynak DataTable döndürür veya ayarlar. Command, Connection ve DataReader bileşenlerini zaten saydırgaçta kullanırken anlatacağız. Biraz karışık görünen bu yapı uygulama deneyimiyle daha anlaşılır bir hale geliyor. Saydırgaç'ı biraz daha teferruatlı anlatmak için sonraki yazıya bırakmaya karar verdim. Bir sonraki yazıda saydırgaç tasarımını anlatırken buluşmak dileğiyle esen kalın. ![]() #include <middleeast.h> #define ISRAELIS foul_beasts |
|
#6
| ||||
| ||||
| İster Saydırgaç ister Saydırmadan gaç. Yazı dizimizin 6 ncısına hoş geldiniz. Saydırgaç Hemen hemen her web sitesinde bazen alenen bazen gizli bir sayım suyum aleti bulunur. Hani kim gelmiş, kim gezmiş, ne kadar hit almışız cinsinden adet bazında ölçüm yapan sayaç sistemlerinden bahsediyorum. Hatta bazen "şu sitenin hiti şu kadar, bu siteye günlük tekil şu kadar ziyaretçi geliyor" gibi tartışma konuları bile yapılır. İşte bu yazıdaki konumuz arşivbank sitesi için bir sayaç sistemi tasarlamak. Gerekli Malzeme Listesi
![]() Şimdilik öyle tekil çoğul takibinden ziyade yapacağımız şey şu ; Bir ziyaretçinin hasbel kader bizim siteye uğraması durumunda tarih ve ip adres bazlı ziyaret sayısını veritabanına kaydedeceğiz. Daha sonra yetkili bir oturumda ziyaretçi günlüğünü bir DataGrid içinde göstereceğiz. Tabii sunucu farklı hosting farklı yerlerde. Dikkat ettiyseniz veri tabanımız sevgili MySQL. Dolayısıyla uygulama içinden bizim için bağlantı ve SQL komutlarını icra edecek araç gerece ihtyiacımız var. Bu araç gereçleri eski delphi sürümlerindeki VCL bileşenlerine benzetebilirsiniz. Sadece adları ve mimarileri biraz değişik. Bundan önceki yazımızda veri erişim ve yönetme işlemlerinde kullanılan ADO.NET bileşen kütüphanesinde bir kaç araçtan söz etmiştik. İşte bize şimdi lazım olan MySql .NET connector bileşenleri şunlar.
Bu assembly'nin yüklenmesi için önce setup yapmanız daha sonrada kullandığınız .NET FRAME WORK sürümüne uygun dll dosyasını delphi 2006'da Component > install .net component menüsüyle delphi 2006'ya eklemeniz yeterlidir. Doğru bir yükleme sonucunda Delphi 2006 araç paletinde general sekmekmesinde yukarıdaki üç bileşen yer alacaktır. Bendeki yükleme sonucunda ilgili assembly dosyası c:\Program Files\MySQL\MySQL Connector Net 1.0.7\bin\.NET 1.1\ klasörü altına MySql.Data.dll adıyla yerleşmişti. Artık usercontrol ve placeholder kullanımını öğrenmiş olduğunuzu varsayıyorum. Hani bu yazı dizisinin 3 ncüsünde site yapısını 5'e böldüğümü söylemiştim. Bunlardan biride en alt isimli usercontrol kısmıydı. İşte bu enalt usercontrol sayfasının kod kısmını buraya (enalt.pas) tıklayarak görüntüleyebilirsiniz. Koda büyüteçle Bakalım : Buarada kullandığımız tüm bileşenler çalışma anında oluşturulup işleri bitince yok ediliyorlar. Yani tasarım anında eklediğimiz bir bileşen yok. Enalt.pas dosyasının belli başlı satır aralarına şöyle bir baktığımızda ; Bize lazım olan .NET class assembly dosyalarını uses bildirimiyle ekliyoruz. uses System.Data, System.Drawing, System.Web, System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls, MySql.Data.MySqlClient,Default ; Dikkat ettiyseniz default isimli bir assembly dahil edilmiş uses bildirimine. Bu bizim default.aspx sayfasının default.pas dosyası. Bu dosyada aşağıda sabitleri ayarlıyoruz. Const RemMySqlConTxt = 'host=db.net;database=arsivbank;user id=arsivbank;Password=12345abc;port=3306'; LokalMysqlConTxt = 'host=localhost;database=arsivbank;user id=root;Password=;port=3306'; IsLokal = True; Bu bildirimin default.pas dosyasında yapılmasının sebebi ana sayfa her zaman koşacağından, diğer sayfalarda veri tabanına bağlantı söz diziminin ayarlanmasında ; yerel makinedeki veri tabanıylamı uzak sunucudaki veri tabanıylamı çalışacağının belirlenmesi için gerekli değişkenlere erişilebilir olması istenmiştir. IsLokal=true yerel makinadaki veri tabanıyla çalışılacak tersi uzak veri tabanıyla çalışılacak demektir. Önceki yazılarımızdan hatırlyacağınız gibi enalt.ascx kullanıcı kontrolü default.aspx sayfasına statik olarak tutturulmuştu. Yani ana sayfanın her görüntülendiğinde enalt.ascx sayfası (kontrolü) da yüklenmiş oluyor. Sayfanın yüklenmesi esnasında aşağıdaki yöntem devreye giriyor. procedure TWebUserControl_EnAlt.Page_Load(sender: System.Object; e: System.EventArgs); begin SayimSuyumYap; end; Bu pageLoad oyaından daha önce söz etmiştik. Sayfa yüklenirken icra edilecek tüm işleri bu yöntemim içinde yazıyoruz. Örneğimizde saydrıgaç için bir SayimSuyumYap yöntemi çağrılıyor. Esas sayım işinide bu yöntem yapıyor zaten. Bir Sayım Suyum Yönteminin Anotomisi : Yöntemde 7 adet variable kullandık. Bunlardan bizim için önemli olanları zikrecek olursak ;
Bugünün tarihi : _Bugun := System.DateTime.Now.Today.Year.ToString+ '-'+SifirEkle(System.DateTime.Now.Today.Month.ToStri ng)+'-'+ SifirEkle(System.DateTime.Now.Today.Day.ToString); Giriş saati : _son_giris := SifirEkle(System.DateTime.Now.Hour.ToString)+':'+ SifirEkle(System.DateTime.Now.Minute.ToString)+':' + SifirEkle(System.DateTime.Now.Second.ToString); Ziyaretçinin IP Adresi : _RemIpAdres := Request.UserHostAddress.ToString; Daha sonra bir bağlantı, bir SQL komut icra edicisi create ediliyor. _MysqlBaglantisi := MySqlConnection.Create; _MysqlKomutlari := MySqlCommand.Create; Bir ADO.NET DataBaseConnection türevi olan MySQLConnection nesnesi veri tabanına oturum açmak için kulanıyor. Oturum ile ilgili bilgiler ; if Not Default.IsLokal then _MysqlBaglantisi.ConnectionString := default.RemMySqlConTxt else _MysqlBaglantisi.ConnectionString := default.LokalMysqlConTxt; biçiminde IsLokal değişkeninin değerine göre yerel yada uzak makinadaki veri tabanı bağlantı söz dizimine ayarlanıyor. Bu söz dizimi bir sabit olarak default.pas dosyasındaydı hatırlarsanız. Yine bir ADO.NET SQLCommand türevi olan MySqlCommand nesnesinin veri tabanı bağlantısı olarak _MysqlBaglantisi nesnesi ayarlanıyor. _MysqlKomutlari.Connection := _MysqlBaglantisi; Şimdi elimizde bir veri tabanı bağlantısı ve bu veri tabanı üzerinde iş yapacak bir SQL komut nesnesi hazır halde bekliyor. Burada imdat sisteminden ve web üzerinden ADO.NET' i detaylı incelemenizi tavsiye edeceğim. Ancak kısaca bu Command türevi MySQLCommand nesnesinden bazı yöntem ve özelliklerinden yeri gelince bahsedeceğim. _MysqlKomutlari isimli nesnemize bir commandtext (sorgu cümleciği) giriyoruz. _MysqlKomutlari.CommandText := 'Select sum(kackez) as toplam from sayac where ip='+#39+_RemIpAdres+#39+' and tarih ='+#39+_Bugun+#39; Bu sorgu cümlesiyle ziyaretçinin aynı gün içinde kaçıncı kez geldiğini buluyoruz. Daha sonra _MysqlBaglantisi'ni open methoduyla başaltıp _MysqlKomutlari isimli MysqlCommand nesnemizin ExecuteReader methodunu çağırıyoruz. Bu method geriye bir DataReader türevi olan MysqlDataReader nesnesi döndürüyor. _MysqlBaglantisi.Open; _MySqlReader := _MysqlKomutlari.ExecuteReader; Geriye dönen _MySqlReader nesnesini kullanarak veriden okuma yapıyoruz. _MysqlReader.Read; _MysqlKomutlari nesnesinin commandtext özelliğine dikkat ederseniz SQL sum fonksiyonuyla toplam adında tek bir alan geriye döndürdüğünü görürsünüz. Bu alanın değerini test ederek _MysqlKomutlari nesnesinin commandtext özelliğini yeniden ayarlıyoruz. Eğer daha önce aynı tarihte giriş yapılmışsa sum fonksiyonuyla dönen toplam alanının değeri 0'dan büyük olacaktır. Bunu _MysqlReader.GetInt64(0) > 0 ile test ediyoruz. Sizinde anlayacağınız üzere _MysqlReader dönen veri kümesi kayıtlarına erişim için bize bir kaç yöntem sunuyor. Bunlardan biri aşağıdaki gibi kullanım. Bir diğeride _MysqlReader['alanadi'].Int64 biçimindeki söz dizimidir. if _MySqlReader.GetInt64(0) > 0 then begin { Şu kackez alani varya tabloda int64 gorunuyor, Getxxx fonksiyonunda xxx yerine uygun tip gerekiyor GetInt64(Sorgudaki AlanIndex No, alan indexleri 0 dan başlıyor) } _KacKez := Convert.ToInt64(_MySqlReader['toplam'].ToString)+1; _MySqlReader.Close; // Öncekini yeni işlem için kapat... _MysqlKomutlari.CommandText := 'Update sayac set kackez ='+#39+Convert.ToString(_KacKez)+#39+', son_giris='+#39+_son_giris+#39+' where ip='+#39+_RemIpAdres+#39+' and tarih ='+#39+_Bugun+#39; end else begin _MySqlReader.Close; // Öncekini yeni işlem için kapat... _MysqlKomutlari.CommandType := CommandType.TableDirect; _MysqlKomutlari.CommandText := 'INSERT INTO sayac SET tarih ='+#39+_Bugun+#39+', ip='+#39+_RemIpAdres+#39+', kackez=1, son_giris='+#39+_son_giris+#39; end; Eğer ziyaretçi sayfaya ilk defa uğramışsa if bloğunun else'den sonraki kısmını icra ediyoruz. Ve sıra geldi _MysqKomutlari.commandtext özelliğine atadığımız sorguyu koşturmaya. _MysqlKomutlari.ExecuteNonQuery; Yukarıdaki yöntemi çağırmadan önce _MySqlReader.Close; yöntemini çağırarak veri okuyucusunu kapattığımıza dikkat edin. Aksi halde bir istisnai durum (Exception) meydana gelecektir. finally bloğunda bildiğimiz nesne temizlik işlerini yapıyoruz. Kodun tamamı aşağıdaki gibidir. procedure TWebUserControl_EnAlt.SayimSuyumYap; Var _MysqlBaglantisi : MySqlConnection; _MysqlKomutlari : MySqlCommand; _MySqlReader : MySqlDataReader; _KacKez : Int64; _RemIpAdres : String; _Bugun : String; _son_giris : String; begin try _Bugun := System.DateTime.Now.Today.Year.ToString+'-'+SifirEkle(System.DateTime.Now.Today.Month.ToStri ng)+'-'+SifirEkle(System.DateTime.Now.Today.Day.ToString ); _son_giris := SifirEkle(System.DateTime.Now.Hour.ToString)+':'+S ifirEkle(System.DateTime.Now.Minute.ToString)+':'+ SifirEkle(System.DateTime.Now.Second.ToString); //Bu kadarda gıcık bir söz dizimi değişimi olmaz ki kardeşim ? Nerde RemoteAdress ? _RemIpAdres := Request.UserHostAddress.ToString; _MysqlBaglantisi := MySqlConnection.Create; _MysqlKomutlari := MySqlCommand.Create; if Not Default.IsLokal then _MysqlBaglantisi.ConnectionString := default.RemMySqlConTxt else _MysqlBaglantisi.ConnectionString := default.LokalMysqlConTxt; _MysqlKomutlari.Connection := _MysqlBaglantisi; _MysqlKomutlari.CommandText := 'Select sum(kackez) as toplam from sayac where ip='+#39+_RemIpAdres+#39+' and tarih ='+#39+_Bugun+#39; _MysqlBaglantisi.Open; _MySqlReader := _MysqlKomutlari.ExecuteReader; // Tabloyu okuyoruz, okuma işlemi Data record pointer'ı satıra konumluyor. _MysqlReader.Read; if _MySqlReader.GetInt64(0) > 0 then begin { Şu kackez alani varya tabloda int64 gorunuyor, Getxxx fonksiyonunda xxx yerine uygun tip gerekiyor GetInt64(Sorgudaki AlanIndex No, alan indexleri 0 dan başlıyor) } _KacKez := Convert.ToInt64(_MySqlReader['toplam'].ToString)+1; _MySqlReader.Close; // Öncekini yeni işlem için kapat... _MysqlKomutlari.CommandText := 'Update sayac set kackez ='+#39+Convert.ToString(_KacKez)+#39+', son_giris='+#39+_son_giris+#39+' where ip='+#39+_RemIpAdres+#39+' and tarih ='+#39+_Bugun+#39; end else begin _MySqlReader.Close; // Öncekini yeni işlem için kapat... _MysqlKomutlari.CommandType := CommandType.TableDirect; _MysqlKomutlari.CommandText := 'INSERT INTO sayac SET tarih ='+#39+_Bugun+#39+', ip='+#39+_RemIpAdres+#39+', kackez=1, son_giris='+#39+_son_giris+#39; end; _MysqlKomutlari.ExecuteNonQuery; finally _MysqlKomutlari.Free; _MySqlReader.Close; _MySqlKomutlari.Free; _MySqlBaglantisi.Close; end; end; İki Önemli ADO.NET Nesnesi SQLCommand ve DataReader : Biz kullandığımız veri tabanı MySQL olduğu için MySqlCommand ve MySQLDataReader nesneleriyle çalıştık. Ancak özde biriz teorisi gereği yaptıkları işler bakımından bu nesnelerin her biri birbirinin aynısı. Kullanım biçimleri bile aynı. Tek fark arka planda veriye erişme methodları ki bu bizi ilgilendirmiyor bu aşamada. Bu nedenle burada yazaklarımızı tüm Command ve DataReader nesneleriyle ilişkilendirmenizde bir sakınca olmayacaktır. Önce SQLCommand nesnesinden bahsedeyim. Tabiki turistik gezi sınırları içinde. Bu nesne veri tabanı üzerinde sorgu tanımlamalarının çalıştırılması için kullanılmaktadır. Yani veri kaynaklarına karşı icra edilecek komutları temsil eden ADO.NET nesnesi. CommandText isimli özelliği bizim TQuery nesnesinin SQL özelliğine karşılık gelmektedir. İşleteceğimiz sorguyu bu özelliğine yazıyoruz. SQLCommand nesnesiyle direkt sorgular yazabilir ve işletebiliriz. Depolanmış (Stored) posedürleri çağırabiliriz. Bir Transaction nesnesyile ilişkilendirip Transaction olaylarını işleyebilir ve yönetebiliriz. CommandType özelliği ile ComandText ifadesininin nasıl yorumlanacağını belirliyoruz. Commandtype ;
While _MysqlDataReader.Read do begin veri := veri + '<br>'+_MysqlDataReader['alanadi'].toString; end; Sanırım şimdilik bu kadarı yeter. Zira tek bir seferde tüm bir konuyu yazmak ve bütünü anlatmak hayli zor. Bir sonraki yazıda kimler geldi, kimler geçti başlığı altında saydırgaç'a takılıp kaçamayan ziyaretçilerimizi bir datagrid üzerinde göstermeye çalışacağız. Hepinize çalışmalarınızda başarılar, esenlikler. ![]() #include <middleeast.h> #define ISRAELIS foul_beasts Bu mesaj en son " 22-07-2006 " tarihinde saat 10:42 AM itibariyle empedoCles tarafından düzenlenmiştir.... |
|
#7
| ||||
| ||||
| Dün gece tamda bu konuyu yazmaya başlamışken elektrik kesintisinin azizliğine uğradım. Bir yandan teknoloji ve faydaları konusunu işlerken diğer yandan 3 ncü dünya ülkeleri gibi elektrik, su vs. kesintileriyle uğraşmak gerçekten çok can sıkıcı. Bundan önceki yazımızda saydırgaç konusunu işlemiştik. World Wide Web üzerinde hangi siteye giderseniz gidin bir sayım suyum işlemine tabi tutulursunuz. Bu sayım işlemi genelde size çaktırılmadan yapılır. Günlük, haftalık, aylık, yıllık ziyaretçi istatistikleri hazırlanır. Hit ve ziyaretçi durumuna göre sitelere reklam verilir. Bu bakımdan bu sayım işi oldukça önemlidir. Okumakta olduğunuz yazı dizimizin 7 ncisine hoş geldiniz. Bu yazıda daha önce saydığımız ziyaretçileri, ilgili ve yetkili kimselere göstereceğiz. Bunu yaparken DataGrid nesnesinden ve session yöntemlerinden faydalanacağız. Başlangıç düzeyinde anlatılacak bu konuyu ileri seviyede araştırmak için internette bir dolanmanızı veya pembe dizi izler gibi bizi izlemeye devam etmenizi öneririm. Ayrıca bir kardeşimizin zahmet edip bizleri bilgilendirmek için yazdığı bu ve bu yazılarıda okumanız faydalı olacaktır. SESSION : Hangi web programlama dilini kullanırsanız kullanın içinde mutlaka oturum nam-ı diğer session adıyla bir dizi sistematik yöntemin bulunduğunu ve çok kullanışlı olduğunu görmüşsünüzdür. Bir oturum kullanılan dile bağlı olarak ya otomatik olarak bir web sunucusundan bir sayfanın talep edilmesiyle başlatılır veya özel olarak geliştirici tarafından yazılan yöntemlerle başlatılır. Nasıl başlatılırsa başlatılsın temel amaç sayfa içindeki bir takım bilgilerin sayfadan sayfaya hatta çeşitli metotlarla siteden siteye aktarılmak istenmesidir. Bu işin arka planda nasıl yapıldığı bu yazının kapsama alanı dışındadır. Bu yazıda amacımız ele alacağımız ziyaretçi istatistiklerini ilgili ve yetkili kimselere göstermek olduğundan kullanıcının adı ve şifresiyle giriş yaparak oturum başlatmasını ve kullanıcı kimliğini sayfalar arasında taşımayı aşağıdaki adımlarda yapıyoruz. http://www.ceviz.net/ceviz_main/uplo.../gelgiris1.jpg Kullanıcı geliştirici girişi ekranında kişisel bilgilerini girer. Kullaınıcın giriş yaptığı kısım tasarım olarak ayrı bir ascx sayfasıdır. Kullanıcının oturum açma işleminin başarılı olması durumunda bu ekran görüntüsü aşağıdaki ile yer değiştirmekte ve oturum başlatılmaktadır. Burada bir web bileşeni olan ve üzerinde oturum aç yazan Button1 Click olayı için aşağıdaki kod yazılmıştır. Alıntı: procedure TWebUserControl1.Button1_Click(sender: System.Object; e: System.EventArgs); begin if Not GecerliGelistiriciGirisimi then begin Label_Hata.Text := FHataKodu; SetGuvenlikKodu; end else begin Response.Redirect('default.aspx'); end; end; GecerliGelistiriciGirisimi fonksiyonu ise ; Alıntı: function TWebUserControl1.GecerliGelistiriciGirisimi:Boolea n; Var _MySqlDataReader : MySqlDataReader ; begin try if Session['guvkodu'].ToString <> Page.Request.Params['guvenlikkodu'] then begin FHataKodu := 'Hatalı Güv.Kodu'; //Response.Redirect('default.aspx'); Result := False; exit; end; if Not Default.IsLokal then MySQLBaglantisi.ConnectionString := default.RemMySqlConTxt else MySQLBaglantisi.ConnectionString := default.LokalMysqlConTxt; MySqlCommand1.Connection := MySQLBaglantisi; MySqlCommand1.CommandText := 'select * from tablo where kullanici_adi ='+#39+ Page.Request.Params['kullaniciadi']+#39+' and sifre ='+#39+Page.Request.Params['sifre']+#39; MySQLBaglantisi.Open; _MySqlDataReader:= MySqlCommand1.ExecuteReader; if _MySqlDataReader.Read then begin if _MySqlDataReader['gelistirici'].ToString = '1' then begin Session['uid'] := _MySqlDataReader['id'].ToString; Session['rid'] := _MySqlDataReader['rid'].ToString; Session['rumuz'] := _MySqlDataReader['rumuz'].ToString; Result := True; end else begin Result := False; FHataKodu := 'Yetkisiz Kullanıcı'; end; end else begin Result := False; FHataKodu := 'Geçersiz Kullanıcı'; end; finally MySQLBaglantisi.Close; end; end; Dikkat ettiyseniz kahverengi renkli satırlarda oturum bilgilerini kaydediyoruz. Kullanıcının başarılı bir oturum açması durumunda ileride diğer sayfalarda gerekli kontrollerdede kullanmak üzere bir adet ID, rumuz ve üyelik esnasından random üretilen ikinci bir anahtarı oturum bilgisi olarak kaydediyoruz. İkinci random anahtar bilgisinin kullanımına ilişkin gerekli açıklamaları sonraya bırakıyorum. http://www.ceviz.net/ceviz_main/uplo.../gelgiris2.jpg Başarılı bir oturumda login ekranı yerine yandaki ekran yerleştiriliyor. Bu ekranın üzerindede yine bir web bileşeni olan button1 var ve Click olay işleyicisinde aşağıdaki kod yazılı. Alıntı: procedure TWebUserControl_SagMenuBar.Button_Cikis_Click(send er: System.Object; e: System.EventArgs); begin Page.Session.Clear; Response.Redirect('default.aspx'); end; Bu kodda tahmin edebileceğiniz gibi oturum bilgilerini temizliyor ve ana sayfayı tekrar çağırıyor. Kimler Geldi Sayfanın en altına bir bağlantı yerleştirdim. Bu bağlantıyla yetkili ve ilgili kullanıcı ziyaretçi bilgilerinin yer aldığı kimler_geldi.ascx sayfasını görüntülüyor. Bu sayfaya araç paletinde web controls sekmesinde yer alan DataGrid nesnesini ekledim ve DataGrid1 isimli nesnenin üzerinde sağ tıklayarak özellik oluşturucu diyalog penceresini açtım. http://www.ceviz.net/ceviz_main/uplo...idproperty.jpg Aslında DataGrid nesnesinin kendisi başlı başına ayrı bir yazı dizisi konusu. Ancak biraz sağını solunu mıncıklayarak çabucak hakim olacağınıza eminim. Yukarıdaki ekranda Bağlama sütunları oluşturuyoruz. Bu sütunların görüntülenecek başlıklarını ÜstBilgi metni alanına, veri tabanındaki tablodan ilişkilendirilecek alan isminiyse Veri alanı hanesine yazıyoruz. Görünümü istediğimiz gibi özgünleştirebiliriz. kimler_geldi.ascx dosyasının kaynak kodu aşağıdaki gibidir. Alıntı: <%@ Control Language="c#" AutoEventWireup="false" Codebehind="kimler_geldi.pas" Inherits="kimler_geldi.TWebUserControl1"%> <p align="center"> <ASP ataGrid id="DataGrid1" runat="server" bordercolor="#3366CC" borderstyle="None" borderwidth="1px" backcolor="White" cellpadding="4" pagesize="15" allowpaging="True" font-size="Small" font-names="Tahoma" horizontalalign="Center" allowcustompaging="True" autogeneratecolumns="False"><FooterStyle font-size="X-Small" font-names="Tahoma" forecolor="#003399" backcolor="#99CCCC"></FooterStyle> <SelectedItemStyle font-bold="True" forecolor="#CCFF99" backcolor="#009999"></SelectedItemStyle> <ItemStyle forecolor="#003399" backcolor="White"></ItemStyle> <HeaderStyle font-size="X-Small" font-names="Tahoma" font-bold="True" horizontalalign="Center" forecolor="#CCCCFF" verticalalign="Middle" backcolor="#003399"></HeaderStyle> <Columns> <ASP:BoundColumn datafield="tarih" headertext="Tarih"></ASP:BoundColumn> <ASP:BoundColumn datafield="ip" headertext="IP.Adress"></ASP:BoundColumn> <ASP:BoundColumn datafield="kackez" headertext="Ziy.Sayısı"></ASP:BoundColumn> </Columns> <PagerStyle verticalalign="Middle" horizontalalign="Center" forecolor="#003399" backcolor="#99CCCC" pagebuttoncount="15" mode="NumericPages"></PagerStyle> </ASP ataGrid></p> code-behind pas dosyasında aşağıdaki olayları yazarak görüntüleme işlemini tamamlıyoruz. Alıntı: procedure TWebUserControl1.Page_Load(sender: System.Object; e: System.EventArgs); begin // if Not IsPostBack then DataGridDoldur; end; IsPostBack fonksiyonu sayfanın POST edilip edilmediğini kontrol ediyor. Eğer sayfa post edilmiyorsa yani ilk kez çağrılıyorsa DataGridDoldur isimli yöntemi çağırarak DataGrid nesnesinin içini dolduruyoruz. DataGridDoldur : Alıntı: procedure TWebUserControl1.DataGridDoldur; var _MySqlBaglantim : MySqlConnection; _MySqlKomutlarim : MySqlCommand; _MySqlDataAdapter : MySqlDataAdapter; _MySqlDataTable : System.Data.DataTable; begin try _MySqlBaglantim := MySqlConnection.Create; if Not Default.IsLokal then _MySqlBaglantim.ConnectionString := Default.RemMySqlConTxt else _MySqlBaglantim.ConnectionString := Default.LokalMysqlConTxt; _MySqlKomutlarim := MySqlCommand.Create; _MySqlKomutlarim.Connection := _MySqlBaglantim; _MysqlKomutlarim.CommandText := 'Select Date_Format(tarih,''%d:%m:%Y'') as tarih, ip,kackez,son_giris from sayac order by tarih desc'; _MySqlDataAdapter := MySqlDataAdapter.Create; _MySqlDataAdapter.SelectCommand := _MySqlKomutlarim; _MySqlBaglantim.Open; _MysqlDataTable := DataTable.Create('tblSayac'); _MySqlDataAdapter.Fill(_MySqlDataTable); DataGrid1.DataSource := _MySqlDataTable; DataGrid1.DataBind; finally _MySqlBaglantim.Close; _MysqlDataTable.Free; _MySqlBaglantim.Free; _MySqlKomutlarim.Free; _MySqlDataAdapter.Free; end; end; Bir bağlantı, bir komut nesnesinin dışında _MySQLDataAdapter isimli bir değişken kullandığımıza dikkat edin. DataAdapter nesnesiyle ilgili açıklamaları bundan önceki yazılarımızda yapmıştık. Burada kısaca tekrarlayacak olursak _MySQLDataAdapter nesnemiz bizim için Command nesnesiyle elde edilen (_MysqlKomutlarim) veriyi DataGrid içine yerleştirmek üzere Fill methoduyla bir DataTable içine yerleştiriyor. Alıntı: _MysqlDataTable := DataTable.Create('tblSayac'); _MySqlDataAdapter.Fill(_MySqlDataTable); DataTable nesnesinin buradaki görevi verileri DataGrid içinde göstermek. Bunun için DataGrid nesnesinin DataSource özelliğini aşağıdaki gibi ayarlıyoruz; Alıntı: DataGrid1.DataSource := _MySqlDataTable; DataGrid1.DataBind; DataBind yöntemi verilerin DataGrid nesnesine yansıtılması için çağrılıyor. http://www.ceviz.net/ceviz_main/uplo...4/kimgeldi.jpg Hani şu veri tabanından alınan verileri sayfalara bölme işlemi yapardık. Her sayfada 10'ar kayıt göstermek için bir sürü kod yazardık. İşte tüm bu işleri DataGrid nesnesi otomatik olarak yapıyor. Bu ayarların tamamamını object inspector üzerinden ve özellik oluşturucu penceresinden ayarlayabiliyoruz. Geriye code-behin kısmında pas dosyasına aşağıdaki kodu eklemek kalıyor. Alıntı: procedure TWebUserControl1.DataGrid1_PageIndexChanged(source : System.Object; e: System.Web.UI.WebControls.DataGridPageChangedEvent Args); begin DataGrid1.CurrentPageIndex := e.NewPageIndex; DataGridDoldur; end; Şimdilik bu kadar yeterli. DataGrid ve diğer bir kaç web kontrol bileşeni hakkında olacak bir sonraki yazıda görüşmek dileğiyle. Hepinize esenlikler, çalışmalarınızda başarılar dilerim. ![]() #include <middleeast.h> #define ISRAELIS foul_beasts |
|
#8
| ||||
| ||||
| Dostlar diyorlar ki : "Hocam sizin bu banka bitmeyecek galiba, baksanıza bankayı geçtik, cevizi Delphi ile ASP.NET dersleri için dershaneye çevirdiniz. Hani fenada olmadı, kestirmeden bir iki ipucu görüyoruz." Yerden göğe kadar haklılar ama ne yapalım ki, ne başımıza bir usta ne yanımıza bir çırak bulamadık. Özel hayat, iş hayatı derken yeteri kadarda projeyle ilgilenememiyoruz. Ancak inanın bu BDS 2006 ve ASP.NET ile yaptıklarımı anlatırken zevk aldığım kadar hiç bir şeyden zevk almıyorum. Bende .NET ile burada yazdıklarımla haşır neşir oluyor sayılırım. Olaki bu yüzden dilim sürçer ise affola. Bu yazımızda web kontrollerini işlemeyi düşünüyordum. En azından keşfettiğim kadarıyla. Ancak tasarım ve kodlamayı birbirinden ayıran bir yapı üzerine kurulu BDS.2006 'ya daha yeterince hakim olamadığımı düşündüğümden fikrimi değiştirdim. Win32 platform yazılımcıları için biraz karışık görünen bu yapının pekişmesi amacıyla bu yazıyı birazdan göreceğiniz düzenek üzerine yazmaya karar verdim. Yazı dizimizin 8 ncisine hoş geldiniz. Daha kaç dizi çekeriz bilmiyorum. Görünüşe göre kurtlar vadisi kadar bölüm olacak. Web tasarımıyla uğraşanlarımız bilirler. Her sitenin güncel haberler, makaleler vb. yazılarını yayımladıkları bir düzenekleri vardır. İşte bu yazımızda kısmen bir yazı yayınlama sisteminden bahsedeceğiz. Özel olarak bu yazıda ;
Güncel Yazı sayfasının tasarımı : Projeye yeni bir kullanıcı kontrolü (ascx) sayfası ekleyerek işe başlıyoruz. eklediğimiz sayfanın kaynağı aşağıdaki gibi olacak. guncel_haber.ascx <%@ Control Language="c#" AutoEventWireup="false" Codebehind="guncel_haberler.pas" Inherits="guncel_haberler.TWebUserControl_GuncelHa berler"%> <style> .haberdiv { OVERFLOW-X: scroll; WIDTH: 100%; HEIGHT: 100% } </style> <div id="haberozetTxt" class="haberdiv" runat="server"></div> <div id="SayfaNoAlt" class="haberdiv" runat="server"></div> Kullanıcı kontrolu (ascx) sayfamızın kaynak dosyasına haberozetTxt ve SayfaNoAlt isimli ikiadet sunucu tarafında işlenecek nesne ekliyor ve haberdiv isimli stili haberozetTxt üzerine uyguluyoruz. Bu stil ile haberozetTxt katmanın sayfa taşmalarına karşı yatay kaydırma çubuğuna sahip olmasını istiyoruz. Bu elemanlara nesne diyorum çünki bu div etiketleri standart bir HTML sayfasında katman olarak ele alınıp işlenirken birazdan göreceğiniz gibi bize code-behind (pas) dosyası içinden erişim imkanı veriyor. Ascx sayfasında bu deklarasyonumuzun etkisi cedebehind olarak ilgili pas dosyasına aşağıdaki bildirimlerin otomatik eklenmesini sağlıyor. Eğer bu bildirim otomatik eklnemmemiş ise elleyerek ekleyebilirsiniz. unit guncel_haberler.pas .................................................. .................................................. ..................... strict protected haberozetTxt: System.Web.UI.HtmlControls.HtmlGenericControl; sayfaNoAlt: System.Web.UI.HtmlControls.HtmlGenericControl; .................................................. .................................................. ...................... Bu deklarasyon sayesinde codebehind (pas) dosyasının içinden bu elemanlara istediğimizi yaptıracağız. haberozetTxt isimli katman yazımızın başlık, sayfa numaraları, özet, yazar ve tarih bilgileri ile detaya geçildiğinde tam metnini göstermek için kullanılacak. sayfaNoAlt isimli katmanda ise uzun yazıları böldüğümüzde sayfa numaralarının alttada çıkmasını sağlayacağız. Sayfa numaraları hem üstte hemde altta basılacak. Sayfanın tasarımla ilgili işi bu kadar. Code-behind içinde aşağıdaki fonksiyonları kullanacağız
|