Yalnız Mesajı Göster
  #8  
Eski 21-07-2006, 10:46 PM
empedoCles kullanıcısının avatarı
empedoCles empedoCles Çevrimdışı
Müdavim
 
Giriş: Sep 2005
Mesaj: 123
empedoCles İtibar düzeyini kapadı
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
imza

#include <middleeast.h>

#define ISRAELIS foul_beasts






empedoCles kullanıcısına MSN aracılığı ile mesaj yolla
Alıntı Yaparak Cevapla