+ Cevap Yaz
Toplam 2 sayfadan 1. sayfa
1 2 En SonEn Son
16 sonuçtan 1 ile 10 arası gösteriliyor

Konu: Delphi 2006 ile ASP.NET ve Arşivbank

  1. #1
    Kodlarım, Canlarım... cemaliozan Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    05/2005
    Yer
    » Burası «
    Mesaj
    1,785

    Delphi 2006 ile ASP.NET ve Arşivbank

    Başlığa bakıpta hemen heyecanlanmayın. Tek bir konuda tüm mevzuyu anlatabilecek bilgiye henüz sahip değilim. Malümunuz bizim bankanın sitesini ömer hocanın ve www.IQBilisim.com katkılarıyla ASP.NET üzerine inşaa ediyoruz. Bazılarınız neden PHP, ASP, PERL değilde ASP.NET diyecektir. Öncelikle bu benim kişisel tercihim değil. Arşivbank Projesi her ne kadar henüz fiili olarak çalışan organize olmuş bir ekibe sahip değilsede ileriye dönük bir ekip sisteminin temelleri oluşturulmuş bir projedir. Bu nedenle gerek halen bir şekilde proje içinde yer alan ekip arkadaşlarım gerekse ileride ekibe girecek adaylar için ASP.NET teknolojisini ve bu teknolojinin Delphi ile kullanımınıda pekiştirmeyi amaçlıyorum.

    PHP, ASP gibi dillere nazaran evveliyatımda çok azda olsa ASP.NET ile tanışmışlığım var. ASP.NET ile www üzerinde hem Türkçe hem diğer dillerde kaynak sıkıntısı çekeceğimizi/çekeceğinizi sanmıyorum. Ancak Delphi 2006 gibi bir dille ASP.NET uygulamaları konusunda henüz yeteri kadar kaynak yok. Hatta öyleki delphi'nin yerleşik imdat (Help) sisteminde bile .NET FRAME WORK class yardımı ağırlıklı geliyor. .NET FRAME WORK'e yönelik VB., C#, J# gibi diller için örnekler yardımın içinde mevcut. Ancak yardımın içinde delphi 2006 için daha .NET ile ilgili tek bir örnek satır göremedim. Ya ben bakmayı bilmiyorum, yada Delphi'yi geliştiren ekip unutmuş.

    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 bulunurlar. Bu bilgiler sadece delphi 2006 için değil, .NET FRAME WORK uygulamalarının tamamını kapsayacaktır. Cevizde zaten ASP/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ı anlatacaklar.

    Sabitlenecek olan bu başlığın ileriki bölümlerinde görüşmek üzere, hoşça kalın, dostça kalın.
    Yaşamaya Değer Bir Hayattan, Sevmeye Değer Bir Aşktan, Dostluğa Değer Bir Arkadaşlıktan Asla Vazgeçmeyin...

  2. #2
    Kodlarım, Canlarım... cemaliozan Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    05/2005
    Yer
    » Burası «
    Mesaj
    1,785

    Sadece ana sayfadan değil delphicilere canlı yayın özel :)

    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.
    • Çok pişmiş tüm güncellemeleri yapılmış bir OS. Tercihen Windowz 2003 Server veya Windowz XP Profesyonel. Sakın ola emektar windowz95/98/me ile bu işi kıvırabileceğimizi düşünmeyin, yanılmış olursunuz.
    • Servis istasyonuna uğranıp 1 nci vitese takılarak havası alınmış IE 6.0 + SP 1. Burada bir anti parantez açayım, bu şartın gerekçesini tam olarak anlamış değilim. Yani neden ff, opera değilde ie. Ben derlenmiş ASP.NET sayfalarımı ff ve operadada görebiliyorum ki. Belki bir yerlerde ayar düğmesi vardırda biz daha görmemişizdir. Ama her nedense Borland ekibi MS ile ortakmış gibi illede ie illede ie demişler. Üstelik birde yamalı olacak.
    • .NET FRAME WORK 1.1. Kambersiz düğün olmaz değil mi?
    • Tam kıvamında delphi 2006. Namı diğer Borland Developer Studio 2006 . Sossuz. Sadece hot fixleri yüklesenizde yeter. Bu arada bundan sonra delphi 2006 demeyip sadece BDS veya BDS 2006 demek istiyorum. Umarım hatırlayıp karıştırmazsınız.
    • Mümkünse www'de bir adet web sitesi. Değilse boş verin lokal takılalım.
    • Bir adette veri tabanı hizmet birimine ihtiyacımız var. Ben MySQL'i tercih ettim. Üstelik taa jüpiter'e konuşlu. Lokal bile değil. Ama tercih sizin. En azından Access bari olsun. En azından lafına sakın kimse alınmasın severim Access'i. Bu konuyu başka bir yerlerde zaten tartışıyoruz.
    • Tatlı olarak biraz CSS, resim vs.
    Hepsi bu kadar. Eğer elinizin altnda BDS 2006 'nın benim adını böyle söylemeyi sevdiğim Arşiment sürümü varsa bütün bunlar sizin için otomatik kurulacaktır. Ama isterseniz de ellede tek tek elleyip kurabilirsiniz. Varsayılan modunuzda tüm bu uygulamaların kurulması pişirilip servis edilmesi gibi konularda deneyim sahibi olduğunuzu düşünüyorum. Değilse önce bunlar hakkında biraz malümat alıp tekrar buraya dönün. Ben sizi beklerim.

    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 ;

    • "C:\Program Files\Borland\BDS\4.0\Bin\bds.exe"
    • "C:\Program Files\Borland\BDS\4.0\Bin\bds.exe" -pDelphiDotNet
    İkisinden biriyle bir uygulama başlatınca işimizi görecek yerleşik alet edavat yüklenip karşımıza dikiliyor. File menüsünden new ordanda ASP.NET Web Application - Delphi for Net deyince aşağıdaki pencere açılıyor.



    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..
    Yaşamaya Değer Bir Hayattan, Sevmeye Değer Bir Aşktan, Dostluğa Değer Bir Arkadaşlıktan Asla Vazgeçmeyin...

  3. #3
    Kodlarım, Canlarım... cemaliozan Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    05/2005
    Yer
    » Burası «
    Mesaj
    1,785

    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ı&nbsp; </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&nbsp;</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&nbsp;</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:Label id="Label_GuvenlikKodu" runat="server" forecolor="#483D8B" font-bold="True" font-size="Medium">0</ASP:Label>
    </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:Label id="Label_Hata" runat="server" forecolor="Red" font-size="Smaller">---</ASP:Label>
    </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.
    Yaşamaya Değer Bir Hayattan, Sevmeye Değer Bir Aşktan, Dostluğa Değer Bir Arkadaşlıktan Asla Vazgeçmeyin...

  4. #4
    Kodlarım, Canlarım... cemaliozan Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    05/2005
    Yer
    » Burası «
    Mesaj
    1,785

    3 Nolu Yazı

    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.

    <%@ 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.
    <%@ 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.

    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;

    Devamında görüşmek dileğiyle, esen kalın.


    Yaşamaya Değer Bir Hayattan, Sevmeye Değer Bir Aşktan, Dostluğa Değer Bir Arkadaşlıktan Asla Vazgeçmeyin...

  5. #5
    Kodlarım, Canlarım... cemaliozan Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    05/2005
    Yer
    » Burası «
    Mesaj
    1,785

    4 Nolu Yazı

    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 ;
    1. orta_yazi_sablonu.ascx sayfasını design sekmesine tıklayarak görüntülüyoruz.
    2. Tool palette > Web Controls altından bir adet PlaceHolder web kontrolünü sayfa üzerine bırakıyoruz
    3. Sayfa üzerine bıraktığımız PlaceHolder1 nesnesinin ismini object inspector aracılığıyla PlaceHolder_Yazi olarak değiştiriyoruz.
    4. 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.
    Yaşamaya Değer Bir Hayattan, Sevmeye Değer Bir Aşktan, Dostluğa Değer Bir Arkadaşlıktan Asla Vazgeçmeyin...

  6. #6
    Kodlarım, Canlarım... cemaliozan Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    05/2005
    Yer
    » Burası «
    Mesaj
    1,785

    5 Nolu Yazı

    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/veritabanlari-amp-sql/ 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.
    • Veri tabanına bağlanırız - Oturum Açarız
    • Kullanmak için bir yada daha fazla tablo seçeriz
    • Kullanacağımız tablolar ve tabloların alanları için sorgular yazarız
    • Kullanacağımız tablolar için yazdığımız sorguları çalıştırırırız / Tabloları açarız
    • Kullandığımız yapıya uygun biçimde kullanıcıya kayıtları gösteririz
    • Kullanıcının yeni bir işlem yapmasını bekleriz
    • Kullanıcı girdisi doğrultusunda kayıt ekler, günceller, siler listeleriz
    • Tabloları kapatırız
    • Veri tabanı bağlantısını keseriz. - Oturumu sonlandırırız
    İşte .NET üzerinde bu işlemleri yapan teknolojinin adıdır ADO.NET. Win32 platformlarında da değişik şekillerde DAO, RDO, ADO ve DataSet bağlantıları kurar bu işleri yapardık. Ancak teknoloji mimarinin güncellenmesini gerektirdiğinden hız, performans, kullanım kolaylığı gibi bir çok seçenekle donatılmış ADO.NET kütüphanesi ve bu kütüphanede yer alan kullanışlı bileşenler dizisi .NET ile birlikte yerleşik gelmektedir. Size düşen kullanacağınız .NET diline ve yapmak istediğinize uygun bileşenleri iyi seçmek. Bu maksatla bahse konu bileşenlerden bir kaç tanesini ve ne işe yaradıklarını zikredelim kısaca. Zira konumuz kapsamlı olarak bir ADO.NET mimarisi inceleme gezisi değil, turistik bir gezi.

    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.
    Yaşamaya Değer Bir Hayattan, Sevmeye Değer Bir Aşktan, Dostluğa Değer Bir Arkadaşlıktan Asla Vazgeçmeyin...

  7. #7
    Kodlarım, Canlarım... cemaliozan Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    05/2005
    Yer
    » Burası «
    Mesaj
    1,785

    6 Nolu Yazı

    İ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
    • Bir adet web sunucusu. Örneğin http://www.arsivbank.com
    • Bir adet Veri Tabanı sunucusu.
    • Mysql .NET Connector assembly
    • Delphi 2006
    • Birazda sabır
    Saydırgaç tablomuzun yapısı aşağıdaki gibidir.



    Ş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.
    • MySQLConnection
    • MySQLCommand
    • MySQLDataAdapter
    Bu üçünün güncel sürümünü assembly olarak http://dev.mysql.com/downloads/ adresinden indirebilirsiniz. Ben uzağa gitmeyin diyerek ceviz'e kendi kullandığımı ekledim. İndirmek için tıkılatın.

    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 ;

    • _MysqlBaglantisi : MySqlConnection (Veri tabanina bağlantı işlerini yapacak)
    • _MysqlKomutlari : MySqlCommand (SQL Komutlarını icra edecek)
    • _MysqlReader : MysqlDataReader (İcra edilen komutlardan sönen veri kümesini okuyacak)
    Bu nesneleri çalışma anında try finally end blokları arasında yaratıp yok ettiğimize dikkat edin. Yöntem bugünün tarihini ve sayfayı ziyaret eden kullanıcının ip adresi alarak işe başlıyor.

    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 ;

    • SQL ifadesi olarak
    • Stored Procedure (Depolanmış prosedür) Çağrısı olarak
    • Direkt tablo adı olarak
    ayarlanabilir. Ayarlandığı tipe görede yorumlama yapar. SQLCommand nesnesine komut icra ettirmek için aşağıdaki methodlardan biri kullanılır.
    • ExecuteReader : Veri kümesi (Kayıt seti) bir DataReader nesnesi olarak geri döner. Bu yöntem kullanıldığında yukarıda anlattığımız biçimde DataReader nesnesi kapatılana kadar başka bir komutun icra edilmesine izin verilmez.
    • ExecuteNonQuery : Veri kümesi döndürmeden sql ifadesini icra eder. İşlem sonucunda etkilenen kayıt sayısını geri döndürür.
    • ExecuteScalar : Sorgu sonucu tek bir değer dönecekse bu method kullanılarak maximum performans elde edilir.
    • ExecuteXMLReader : Sorgu sonucu bir XMLReader nesnesi geri döndürür.
    DataReader nesnesi bir SQLCommand nesnesinin ExecuteReader methoduyla icra edilen sorgusundan dönen kayıtlara satır satır erişmek için kullanılır. Örnek kullanımını yukarıda anlatmıştık. Read yöntemi sorgu sonucunda dönen kayıt setini okur ve data record pointer'i bir sonraki satıra konumlandırır.

    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.
    Yaşamaya Değer Bir Hayattan, Sevmeye Değer Bir Aşktan, Dostluğa Değer Bir Arkadaşlıktan Asla Vazgeçmeyin...

  8. #8
    Kodlarım, Canlarım... cemaliozan Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    05/2005
    Yer
    » Burası «
    Mesaj
    1,785

    7 Nolu Yazı

    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.

    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 ;

    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ı.

    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.

    <%@ Control Language="c#" AutoEventWireup="false" Codebehind="kimler_geldi.pas" Inherits="kimler_geldi.TWebUserControl1"%>
    <p align="center">
    <ASP:DataGrid 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:DataGrid>
    </p>

    code-behind pas dosyasında aşağıdaki olayları yazarak görüntüleme işlemini tamamlıyoruz.

    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 :

    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.

    _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;

    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.

    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.
    Enson 22/06/2006 20:41 tarihinde cemaliozan tarafından düzenlenmiştir. Sebep: imla hataları
    Yaşamaya Değer Bir Hayattan, Sevmeye Değer Bir Aşktan, Dostluğa Değer Bir Arkadaşlıktan Asla Vazgeçmeyin...

  9. #9
    Kodlarım, Canlarım... cemaliozan Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    05/2005
    Yer
    » Burası «
    Mesaj
    1,785

    8 Nolu Yazı 1 nci Bölüm

    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 ;
    • Bir kullanıcı kontrol sayfasında sunucu tararflı nesnelerle çalışmayı
    • Bir tabloda tek bir alanın içindeki uzun bir metnin sayfalara bölünmesini
    • Yine aynı tablodaki yazı metninin sayfada gösterilmesini örnekleyeceğiz.
    Önce 5 parçaya bölünmüş ana sayfamızın orta kısmında yazı başlıklarını ve özetlerini vereceğiz. Daha sonra ilgili yazı için ayarlayacağımız bağlantılarla yazının detaylarını göstereceğiz. Eğer yazı bir ekrana sığmayacak kadar uzunsa yazıyı birden fazla sayfaya böleceğiz. Şimdilik kod optimizasyonu ve performans bizim için önemli değil.

    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
    • HaberOzetiListele(Const katid : String);
      Aktif yazıları tablodan alıp HTML ile formatlayarak basacak.
    • HaberBas(Const Haberid : String);
      Özet olarak basılan yazıların tamamını HTML ile formatlayarak basacak
    • SayfaGovdesiniBas(S : String):String;
      Bir Ansi fonksiyonuyla yazıdaki özel işaretleri kaldırarak yazının gövde kısmını HTML ile formatlayacak
    • KacSayfadanOlusuyor(Const S,Ayrac : String):Int16;
      Yazı içinde sayfa bölme işaretlerini sayarak kaç sayfaya bölüneceğini bulacak.
      Sayfa bölme işareti olarak "<sayfa_sonu>" kullanılıyor.
    • IkiSozdizimiArasiniAl(KaynakStr, ArananStr : String; ItemNum : Integer): String;
      Yazı içinden sayfa bölme işaretini arayıp bu bölüme kadar olan kısmı kesip çıkartacak. Çok sayfalı
      yazılarda isabet sayfayısınıda bu yöntem ayarlayacak.
    • Function SayfaNumaralariniBas(KacSayfa,RequestSN : Int64;n,d:String):String;
      Çok sayfalı yazılarda sayfanın başlık kısmında ve altında çıkacak sayfa numaralarını HTML ile
      formatlayacak.
    Bu yöntemleri anlatmaya geçmeden önce sayfada Mysql bağlantısı kullanacağımızdan name space alanına (uses) MySql.Data.MySqlClient, MySql.Data.Types uzay adlarını, özel bir Ansi fonksiyonu içinde System.Web.UI,Borland.Vcl.StrUtils uzay adını ekliyoruz.

    http://www.ceviz.net/ceviz_main/uplo...guncelbag1.jpg
    Kullanıcı kontrolü sayfamızı sağ köşedeki Güncel bağlantı listesinde bulunan
    seçeneklere tıklayarak çağıracağız. Hatırlayacağınız üzere sağ taraf ayrı bir kullanıcı
    kontrol sayfasıydı. Ziyaretçi hangi bağlantıyı tıklarsa tıklasın yazı aynı tablodan
    alınacak. Basılacak yazının tipi katid isimli alanda tutuluyor. Ziyaretçi bir
    bağlantıyı tıkladığında orta alan kullanıcı kontrolü sayfası bağlantıyı okuyarak
    placeholder nesnemize guncel_haber.ascx kullanıcı kontrolü sayfasını atıyor.

    Bundan önceki yazılarımızda değindiğimiz orta_yazi_sablonu.ascx kontrolü sayfamızın çalışma mantığını tekrar hatırlayalım.

    orta_yazi_sablonu.ascx
    .................................................. .................................................. .......................
    procedure TWebUserControl1.Page_Load(sender: System.Object;
    e: System.EventArgs);

    Var
    osyf : Integer;
    S : String;
    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
    -------------------------------------------------------------------------
    986 :
    begin
    Label1.Text := '';
    case Int32.Parse(Page.Request.Params['n'].ToString) of
    1 : S := 'Arşivbank Site Tasarım Notları';
    2 : S := 'Arşivbank Win32 Tasarım Notları';
    3 : S := 'Arşivbank .Net Tasarım Notları';
    4 : S := 'Hayat & Memat Konuları';
    end;
    Label2.Text := S;
    PlaceHolder_Yazi.Controls.Add(Page.LoadControl('gu ncel_haberler.ascx'));
    end;
    .................................................. .................................................. .........................

    Guncel_Haber.ascx kullanıcı kontrolu yüklenmeye başladığında Page_Load olay yöneticisi çağrılmaktadır.
    .................................................. .................................................. .........................
    procedure TWebUserControl_GuncelHaberler.Page_Load(sender: System.Object;
    e: System.EventArgs);

    begin
    if (Not Page.IsPostBack) and (Not Assigned(Page.Request.Params['d'])) then
    HaberOzetiListele(Page.Request.QueryString['n'])
    else
    if (Assigned(Page.Request.Params['d'])) then HaberBas(Page.Request.Params['d']);
    end;
    .................................................. .................................................. .........................

    Page_Load olay yöneticisi sayfaya geçilen "d" parametresinin değerini test etmekte ve denetimi ya HaberOzetiListele ya da HaberBas yöntemlerine devretmektedir. Önce HaberOzetiListele yöntemini görelim. Koda zaman ayırıp incelemenizi tavsiye edeceğim.

    .................................................. .................................................. .........................
    procedure TWebUserControl_GuncelHaberler.HaberOzetiListele(C onst katid : String);
    Var
    _MysqlBaglantisi : MySqlConnection;
    _MysqlKomutlari : MySqlCommand;
    _MySqlReader : MySqlDataReader;
    S : String;
    begin
    try
    S := '';
    _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 id,katid,baslik,ozet,DATE_FORMAT(tarih,''%d-%m-%Y'') as
    tarih,yazar from yazilar where katid='+#39+katid+#39+' order by id DESC';

    _MysqlBaglantisi.Open;

    _MySqlReader := _MysqlKomutlari.ExecuteReader;
    while _MySqlReader.Read do
    begin
    S := S+'<div class="sidebarbox-title-shading bg-yellow03"><a href="default.aspx?p=986&n='+
    katid+'&d='+_MySqlReader['id'].ToString+'">'+
    _MySqlReader['baslik'].ToString+'</a></div>'+

    '<div><p>'+_MySqlReader['ozet'].ToString+'</p></div>'+
    '<div align="right" class="p.readmore"><b>'+
    _MySqlReader['yazar'].ToString+
    '</b>&nbsp;&nbsp;&nbsp;&nbsp;'+
    _MySqlReader['tarih'].ToString+
    '&nbsp;&nbsp;&nbsp;&nbsp;<a href="default.aspx?p=986&n='+
    katid+'&d='+_MySqlReader['id'].ToString+'">devam</a></p></div><br>';

    end;
    haberozetTxt.InnerHtml := S;
    finally
    _MySqlReader.Close;
    _MysqlKomutlari.Free;
    _MySqlBaglantisi.Close;
    _MysqlBaglantisi.Free;
    end;
    end;
    .................................................. .................................................. .........................

    Bu yöntemde dikkat ettiyseniz birer adet Mysql bağlantı,Mysql komut düzenleyicisi ve veri kümesi okuyucusu kullanıyoruz. Tablodan dönen veriyi HTML olarak formatlayıp ;

    haberozetTxt.InnerHtml := S;

    ifadesi ile sunucu taraflı katmanımıza basıyoruz. Sonraki sayfadaki ekran görüntüsü baskı sonucu elde ettiğimiz görüntüyü göstermektedir. Kodları incelediğinizde tüm bu tasarımı bir pas dosyası içinde yazdığımızı ve veri tabanından çektiğimiz veriyi formatlayıp elde ettiğimizi görürsünüz.


    .................................................. .................................................. .........................
    http://www.ceviz.net/ceviz_main/uplo...haberozet1.jpg
    .................................................. .................................................. .........................

    Ziyaretçi alt alta listelenen yazı başlıklarına yada her yazının altındaki devam bağlantısına tıkladığında ilgili yazı için yukarıda saydığımız adımlar tekrar edilmekte, ancak bu sefer guncel_haber.ascx sayfası "d" parametre değerinin Nil olmadığını gördüğünden HaberBas yöntemini çağırmaktadır.

    Aslında kısa bir yazı için HaberozetiListele yönteminin aynısı yazılabilir ve kullanılabilirdi. Ama düşünün ki tek bir alanda ekrana sığması mümkün olmayan sayfalarca yazı var. Bu durumda bu tabloda bu alana girilen yazıyı birden fazla sayfaya bölmek en mantıklısı olacaktır. İşte bu yüzden belkide bu yazıdaki en karışık bölüm HaberBas yöntemidir. Önce yöntemin kodlarını toplu bir halde görüp, yapılan işlemleri özetleyelim.

    Yaşamaya Değer Bir Hayattan, Sevmeye Değer Bir Aşktan, Dostluğa Değer Bir Arkadaşlıktan Asla Vazgeçmeyin...

  10. #10
    Kodlarım, Canlarım... cemaliozan Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    05/2005
    Yer
    » Burası «
    Mesaj
    1,785

    8 Nolu Yazı 2 nci Bölüm

    procedure TWebUserControl_GuncelHaberler.HaberBas(Const Haberid : String);
    Var
    _MysqlBaglantisi : MySqlConnection;
    _MysqlKomutlari : MySqlCommand;
    _MySqlReader : MySqlDataReader;
    S : String;
    KacSayfa : Int64;
    RequestSN : Int64;
    begin
    try
    if (Assigned(Page.Request.Params['s'])) then
    RequestSN := Convert.ToInt64(Page.Request.Params['s']);

    _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 id, baslik, DATE_FORMAT(tarih,''%d-%m-%Y'') as tarih, yazar,
    metin from yazilar where id='+#39+Haberid+#39;

    _MysqlBaglantisi.Open;
    _MySqlReader := _MysqlKomutlari.ExecuteReader;
    while _MySqlReader.Read do
    begin
    S := S + '<p>'+_MySqlReader['metin'].ToString+'</p>'+
    '<span align="right" class="p.readmore"><b>'+
    _MySqlReader['yazar'].ToString+
    '</b>&nbsp;&nbsp;&nbsp;&nbsp;'+
    _MySqlReader['tarih'].ToString+
    '&nbsp;&nbsp;&nbsp;&nbsp;</p></span><br>';

    end;
    KacSayfa := KacSayfadanOlusuyor(S,'<sayfa_sonu>');
    if KacSayfa = 0 then
    //* Tek bir sayfadan oluşuyorsa *//
    haberozetTxt.InnerHtml :='<div class="sidebarbox-title-shading bg-yellow03">'+
    _MySqlReader['baslik'].ToString+
    SayfaNumaralariniBas(KacSayfa,
    RequestSN,
    Page.Request.QueryString['n'],
    _MySqlReader['id'].ToString)+

    '</div><div>'+
    SayfaGovdesiniBas(S)+
    '</div>'+
    SayfaNumaralariniBas(KacSayfa,
    RequestSN,
    Page.Request.QueryString['n'],
    _MySqlReader['id'].ToString)

    else
    begin
    if (Assigned(Page.Request.Params['s'])) then
    haberozetTxt.InnerHtml :='<div class="sidebarbox-title-shading bg-yellow03">'+
    _MySqlReader['baslik'].ToString+
    SayfaNumaralariniBas(KacSayfa,RequestSN,
    Page.Request.QueryString['n'],
    _MySqlReader['id'].ToString)+

    '</div><div>'+
    SayfaGovdesiniBas(IkiSozdizimiArasiniAl(S,
    '<sayfa_sonu>',
    RequestSN))+'</div>'

    else
    haberozetTxt.InnerHtml := '<div class="sidebarbox-title-shading bg-yellow03">'+
    _MySqlReader['baslik'].ToString+
    SayfaNumaralariniBas(KacSayfa,
    RequestSN,
    Page.Request.QueryString['n'],
    _MySqlReader['id'].ToString)+

    '</div><div>'+
    SayfaGovdesiniBas(IkiSozdizimiArasiniAl(S,
    '<sayfa_sonu>',
    RequestSN))+'</div>';


    SayfaNoAlt.InnerHtml := SayfaNumaralariniBas(KacSayfa,RequestSN,
    Page.Request.QueryString['n'],_
    MySqlReader['id'].ToString);

    end;
    finally
    _MySqlReader.Close;
    _MysqlKomutlari.Free;
    _MySqlBaglantisi.Close;
    _MysqlBaglantisi.Free;
    end;
    end;

    .................................................. .................................................. .........................

    Editör sorun çıkardığından biraz renkli oldu. Yönteme haberin id numarası tarayıcıdan parametre olarak gönderilmektedir. Hatırlarsanız bu bağlantıyı biz HaberOzetiListele yönteminde özel olarak yaratmıştık.

    Yöntem ilgili tablodan ilgili veriyi almak üzere gerekli bağlantıları ve sorguyu çalıştırıp elde ettiği metni "S" isimli bir değişkene atıyor. Bu değişken içinde özel bir sayfa sonu işareti yer almakta. "<sayfa_sonu>" işaretinin sayısı kadar alan verisi alt sayfalara bölünüyor. Eğer tarayıcıdan bir "s" parametresi alınmışsa bu verinin hangi sayfasıyla ilgilendiğimizi yönteme bildiriyor. "s" parameteresi nil veya sayfa tek parçaysa verinin ilk sayfası aşağıdaki kodla parse ediliyor.
    .................................................. .................................................. .........................

    haberozetTxt.InnerHtml :='<div class="sidebarbox-title-shading bg-yellow03">'+
    _MySqlReader['baslik'].ToString+
    SayfaNumaralariniBas(KacSayfa,
    RequestSN,
    Page.Request.QueryString['n'],
    _MySqlReader['id'].ToString)+

    '</div><div>'+
    SayfaGovdesiniBas(S)+
    '</div>'+
    SayfaNumaralariniBas(KacSayfa,
    RequestSN,
    Page.Request.QueryString['n'],
    _MySqlReader['id'].ToString)

    .................................................. .................................................. .........................

    Eğer yazı tek sayfa değilse sayfa sayısı bulunuyor. Koddan anlaşılacağı üzere haberozetTxt katmanına veriyi HTML olarak formatlayıp basıyoruz. Eğer yazı birden fazla ve bir "s" parametresi yoksa ilk sayfa, "s" parametresi varsa ;

    SayfaGovdesiniBas(IkiSozdizimiArasiniAl(S,
    '<sayfa_sonu>',
    RequestSN))+'</div>';

    satırlarıyla istenen sayfayı basıyoruz.. Sayfalara bölme işlemi ;

    SayfaNumaralariniBas(KacSayfa,
    RequestSN,
    Page.Request.QueryString['n'],
    _MySqlReader['id'].ToString)+

    '</div><div>'+

    satırlarıyla SayfaNumaralariniBas yöntemince yapılıyor. Çıktı sayfa başlığına ve SayfaNoAlt katmanına basılıyor. Aşağıdaki kod verinin kaç sayfaya bölüneceğini buluyor.
    .................................................. .................................................. .........................

    function KacSayfadanOlusuyor(Const S,Ayrac : String):Int16;
    Var
    tmpS : String;
    Sayfa : Int16;
    Poz : Int64;
    begin
    Sayfa := 0;
    tmpS := S;
    Repeat
    Poz := Pos(Ayrac,tmpS);
    if Poz > 0 then inc(Sayfa) else break;
    tmpS := Copy(tmpS,(Poz+1),Length(tmpS));
    Until Poz = 0;
    Result := Sayfa;
    end;
    .................................................. .................................................. .........................
    Aşağıdaki yöntem sayfa numaralarını basmak üzere hazırlıyor.
    .................................................. .................................................. .........................
    Function SayfaNumaralariniBas(KacSayfa,RequestSN : Int64;n,d:String):String;
    Var
    i : Int16;
    S : String;
    begin
    S :='';
    For i:=0 to KacSayfa do
    begin
    if i <> RequestSN then
    S := S+'<a class="bg-yellow03" href="default.aspx?p=986&n='+
    n+'&d='+d+'&s='+Convert.ToString(i)+'" title="'+
    Convert.ToString(i+1)+'
    nolu Sayfaya Git">'+
    Convert.ToString(i+1)+
    '</a>&nbsp;&nbsp;'

    else
    S := S+'<font class="bg-white">'+Convert.ToString(i+1)+'</font>&nbsp;&nbsp;';
    if (i=20) or (i=40) or (i=60) or (i=80) then S := S+'<br>';
    end;
    Result := '<div class="sidebarbox-title-shading bg-yellow03" align="right">Sayfalar : '+
    S+'</div>';

    end;
    .................................................. .................................................. .........................

    Guncel_Haber.ascx sayfasında tanımladığımız haberozetTXT katmanına veri Başlık, Gövde ve Alt kısım olmak üzere üç parça iç içe katmanlar halinde basılıyor.

    .................................................. .................................................. .........................
    Function SayfaGovdesiniBas(S : String):String;
    begin
    Result := AnsiReplaceText(S , '<sayfa_sonu>' , '');
    end;
    .................................................. .................................................. .........................

    Haberbas yöntemi tarafından işlenen sayfanın görünümü aşağıdaki gibidir.
    http://www.ceviz.net/ceviz_main/uplo..._haberbas1.jpg

    Birden fazla sayfaya bölünen veri için sayfa numaraları hem başlık kısmında hemde altta yer alan SayfaNoAlt katmanında gösterilmektedir. ziyaretçi bir başka sayfaya tıkladığında tarayıcı uygulamaya "s" parametresiyle istenen sayfa numarasını geçmekte istenen sayfada aşağıdaki yöntemle basılmak üzere hazırlanmaktadır.
    .................................................. .................................................. .........................
    Function IkiSozdizimiArasiniAl(KaynakStr, ArananStr : String; ItemNum : Integer): String;
    Var
    I4 : Integer;
    S4 : String;
    Begin
    KaynakStr := KaynakStr + ArananStr;
    S4 := '';
    I4 := 0;
    While I4 <= ItemNum Do
    Begin
    S4 := Copy(KaynakStr, 1, Pos(ArananStr, KaynakStr) - 1);
    Delete(KaynakStr, 1, Pos(ArananStr, KaynakStr));
    Inc(I4);
    End;
    Result := S4;
    End;

    .................................................. .................................................. .....................

    Tüm kodu detaylı anlatacak zamanım olmadığından kodlarla ilgili sorularınızı delphi forumda yanıtlamaya çalışacağım. Dikkat ettiyseniz tasarımı ve kodlamayı birbirinden ayırmakla kalmadık, delphi kodlarıyla HTML etiketlerini bir arada kullanmayıda bu yazımızda görmüş olduk. Burada yapılması gereken en önemli iş performans bakımından kod optimizasyonunu tekrar ele almak olacaktır. Sayfanın çalışan haline
    http://www.arsivbank.com adresinden bakabilirsiniz.

    Bir yazının daha sonuna gelirken hepinizi selamlar, çalışmalarınızda başarılar dilerim
    Yaşamaya Değer Bir Hayattan, Sevmeye Değer Bir Aşktan, Dostluğa Değer Bir Arkadaşlıktan Asla Vazgeçmeyin...

+ Cevap Yaz

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

     

Benzer Konular

  1. Delphi 2005(upd4) - Delphi 2006(DeXter) ve yenilikler...
    By burhanmt in forum Pascal / Delphi / Delphi.NET
    Cevap: 2
    En Son Mesaj: 06/02/2007, 02:27
  2. Delphi 2006 ya Component Kurmak
    By akkaraman in forum Pascal / Delphi / Delphi.NET
    Cevap: 0
    En Son Mesaj: 10/01/2007, 09:59
  3. Delphi 2006 dersleri?
    By drlog in forum Pascal / Delphi / Delphi.NET
    Cevap: 1
    En Son Mesaj: 18/09/2006, 15:46
  4. Delphi 2006,Asp.net ve xml sorunsalı
    By protocol-x in forum Pascal / Delphi / Delphi.NET
    Cevap: 4
    En Son Mesaj: 13/03/2006, 21:09

Bookmarks

Mesaj Yazma Hakları

  • Yeni mesajgöndermezsiniz
  • Cevap yazamazsınız
  • Dosya ekleyemezsiniz
  • Mesajınızı düzenleyemezsiniz