Uzmanına Sor

Archive for the ‘.Net Framework’ tag

C# And API’s

without comments

Merhaba, bu makalemde sizinler API yapisi uzerinde inceleme yapip ufak bir ornek yapmayi planliyorum.

API (Application Programming Interface) Programlar ve Islemci arasinda, komutlardan olusan bir arayuzdur. Genellikle Microsoft’un kendi komutlarindan olusur (Shutdown, Reboot, Open-Close CD-Rom etc.). Windows API’si binlerce fonksiyon, structure, bazi constantlardan olusur (kendi projelerinizde kullanabileceginiz). Bu fonksiyonlar C dili ile yazilmistir, dolayisiyla bunlari kullanmadan declare etmeniz gerekmektedir. DLL proseduru icin declaration islemi biraz kompleks bir sekilde olur. API declaration icin API Viewer kullanabilirsiniz. Bir cok ileri derece programlama dili API Programlamayi destekler. The Microsoft Foundation Class Library (MFC), yuklu miktarda Win32(API) icerir. ODBC API fonksiyonlari, database’de hizli islemler yapmaniza olanak saglar. API ile, uygulamaniz isletim sisteminizdeki dusuk dereceli (lower-level) servislere request atabilir. API binlerce fonksiyonalite destekler. MessageBox’dan Encryption veya Remote Computinge… Bir developer, API’yi kendi programina entegre etmeyi iyi bilmelidir.

APIlerin kullandiginiz isletim sistemi, islemci turune gore cesit cesti tipler icerebilir.

Isletim Sistemi bazli API:

Her bir isletim sistemi API’nin yaygin tiplerine sahiptir.

Ornegin;

Windows NT MS-DOS destekler. Win16,Win32,POSIX (Portable Operating System Interface), OS/2 console API ve Windows 95, MS-DOS, Win16, ve Win32 APIlerini destekler.

Win16 & Win32 API:

Win16, 16-Bit islemciler icin API ile yaratilmistir, ve 16 bitlik degerlere dayanir. Ornegin, Win16 programlarinizi MS-DOS’a baglayabilirsiniz (TSR programlari gibi).

Win32 ise Win16 ile ayni sekilde yaratilmis olup, 32-Bit islemciler icindir, ve 32-Bit’lik degerler kullanir.

Win32 API libraryleri isimlerinden sonra ‘32’ ifadesini icerir. (KERNEL32, USER32 gibi.)

Tum apiler 3 adet kutuphane ile implement edilmistir.

-Kernel

-User

-GDI

1-KERNEL

Kernel, KERNEL32.DLL isminde bir kutuphanedir, ve isletim sistemi’nin yeteneklerini icerir.

-Process Loading

-Context Switching

-File I/O

-Memory Management gibi..

Ornek olarak GlobalMemoryStatus fonksiyonu,size sistemin anlik kullandigi olarak kullandigi fiziksel ve sanal bellek boyutunu gosterir.

2-USER

User, USER32.DLL isminde bir kutuphanedir, ve bu kutuphaneyi kullanaraktan tum kullanici arayuzlerinin yonetimini saglayabilirsiniz.

-Windows

-Menus

-Dialog Boxes

-Icons gibi…

Ornek olarak DrawIcon fonksiyonu, belirtilen noktada size icon veya cursor cizer..

3- GDI (Graphical Device Interface) :

GDI, Win32 tabanli isletim sistemlerinde GDI32.DLL isminde, grafik cikis kutuphanesidir. Windows GDI kullanaraktan, menuleri dialog boxlari cizer. GDI, bir noktada imagelarin saklanmasinda da gorev alir.

Ornek olarak CreateBitmap fonksiyonu, belirtilen ozel olculerde, renklerde bitmap yaratir.

C# Ve API Arasindaki Iliski

APIleri C# icerisinde implement etmek, yazilima yeni baslayanlar icin agir bir istir. Boyle bir islem yapmadan once, bilmeniz gereken bazi basliklar vardir. Bunlara ornek olarak, Structure Implement in C# , type conversion, safe/unsafe code, managed/unmanaged code, ve daha bir cok.

Kompleks APIlerin implementasyonunun once, basit bir MessageBox API implementasyonu ile baslayalim. MessageBox API’sine kod implement etmeden once basit bir Windows Application yaratalim, Form’a bir tane button ekleyin ve Button’un click eventinde Message Box’da kod gosterelim. Tabii ki bu islem icin harici bir kutuphane kullanacagiz.

Kullanilacak NameSpace:

using System.Runtime.InteropServices;

Ve simdiki satira dikkat! Bu satirda API’ deklarasyonu yapiyoruz:

[DllImport("User32.dll")]

public static extern int MessageBox(int h, string m, string c, int type);

Unmanaged Code’dan cagrilacak method icin DLL importu yaptik, “USER32” ifadesi ise hangi DLL’i import edecegimizi belirtmek amacli kullanilmistir. Kullanmis odugumuz MessageBox(), integer donduren, ve 4 parametre alan bir fonksiyondur.

Bir cok API degerleri kullanmak ve getirmek icin structure yapisi kullanir.

Button’un click eventine asagidaki kod blogunu ekleyelim

protected void button1_Click (object sender, System.EventArgs e)
{
MessageBox (0,"API Message Box","API Demo",0);
}

Uygulamanizi Run ettiginiz zaman, APi fonksiyonunu kullanarak cagirmis oldugunuz bir messagebox goreceksiniz.

Birde structure kullanaraktan bir ornek yapalim.

Structure ile calismak, komplex APIler kullanir, veya structure icerisinde structure kullanir. Bu islemlerler siradan basit bir API kullanmaktan daha zordur. Structure ornegimde GetSystemInfo API’sini kullanaraktan, varolan sistem bilgilerini cekecegim.

Yeni bir C# formu acin, ve bir tane button ile listbox ekleyin. Kod tarafina asagidaki namespace’i ekleyin

using System.Runtime.InteropServices;

Declare structure, GetSystemInfo’nun bir parametresidir. Ustteki kod blogunun hemen ardindan

[StructLayout(LayoutKind.Sequential)]

public struct SYSTEM_INFO {

public uint dwOemId;

public uint dwPageSize;

public uint lpMinimumApplicationAddress;

public uint lpMaximumApplicationAddress;

public uint dwActiveProcessorMask;

public uint dwNumberOfProcessors;

public uint dwProcessorType;

public uint dwAllocationGranularity;

public uint dwProcessorLevel;

public uint dwProcessorRevision;

}

API fonksiyonun deklarasyonu: bu islem icin kernel32.dll’ini import ediyoruz.

[DllImport("kernel32")]

static extern void GetSystemInfo(ref SYSTEM_INFO pSI);

   1:  protected void button1_Click (object sender, System.EventArgs e)
   2:  
   3:  {
   4:  
   5:  try
   6:  
   7:  {
   8:  
   9:  SYSTEM_INFO pSI = new SYSTEM_INFO();
  10:  
  11:  GetSystemInfo(ref pSI);
  12:  
  13:  //
  14:  
  15:  //
  16:  
  17:  //
  18:  
  19:  
  20:  
  21:  
  22:  listBox1.Items.Insert(0,pSI.dwActiveProcessorMask.ToString());
  23:  
  24:  //
  25:  
  26:  //
  27:  
  28:  //
  29:  
  30:  }
  31:  
  32:  catch(Exception ex)
  33:  
  34:  {
  35:  
  36:  MessageBox.Show (ex.Message);
  37:  
  38:  }
  39:  
  40:  }

Application’ i Run ettikten sonra, sekildeki gibi sistem bilgilerini goruntuleyebileceksiniz.

image

Written by Serkan Hekimoğlu

June 11th, 2010 at 2:40 pm

Posted in .NET, C#

Tagged with ,

Create Your Own RSS (Real Simple Syndication) Reader With .NET

without comments

Merhaba, bu makalemde sizlerle .Net platformu uzerinden kendi RSS Reader’imizi olusturmaya dair ornek yapacagim. Oncelikle RSS nedir? RSS çeşitli internet siteleri tarafından yayınlanan haber vb. içeriğin tek bir ortamdan topluca izlenebilmesine olanak sağlayan yeni bir içerik besleme yöntemidir. RSS yöntemini destekleyen sistelerin hazırladıkları XML biçimli dosyalara bir çok programla erişmek mümkündür. XML okuyucusu olan bu programlar, web gezgini veya e-posta istemcisi olabileceği gibi sadece RSS içereriği izlemek için hazırlanan masaüstü programları da olabilir. RSS Urllerini ister DB de muhafaza eder her seferinde elle yazmaya gerek kalmadan DB’den okuruz, veya benim ornekte yapacagim gibi tek bir URL kullanarakta yapilabilir.

Oncelikle Rss Reader icin bir windows app project olusturalim.

image

 

Hemen ardindan sekilde UI tasarimini yapalim.

 

image

Globalde tanimlanan degiskenler:

XmlTextReader rssReader;
XmlDocument rssDoc;
XmlNode nodeRss;
XmlNode nodeChannel;
XmlNode nodeItem;
ListViewItem rowNews;

 

Read Button Click Eventinde yazilacak kod :

   1:  rssReader = new XmlTextReader(txtUrl.Text);
   2:              rssDoc = new XmlDocument();
   3:   
   4:              rssDoc.Load(rssReader);
   5:   
   6:   
   7:              for (int i = 0; i < rssDoc.ChildNodes.Count; i++)
   8:              {
   9:   
  10:                  if (rssDoc.ChildNodes[i].Name == "rss")
  11:                  {
  12:   
  13:                      nodeRss = rssDoc.ChildNodes[i];
  14:                  }
  15:              }
  16:   
  17:              for (int i = 0; i < nodeRss.ChildNodes.Count; i++)
  18:              {
  19:   
  20:                  if (nodeRss.ChildNodes[i].Name == "channel")
  21:                  {
  22:   
  23:                      nodeChannel = nodeRss.ChildNodes[i];
  24:                  }
  25:              }
  26:   
  27:              lblTitle.Text = "Title: " + nodeChannel["title"].InnerText;
  28:              lblLanguage.Text = "Language: " + nodeChannel["language"].InnerText;
  29:              lblLink.Text = "Link: " + nodeChannel["link"].InnerText;
  30:              lblDescription.Text = "Description: " + nodeChannel["description"].InnerText;
  31:   
  32:              for (int i = 0; i < nodeChannel.ChildNodes.Count; i++)
  33:              {
  34:   
  35:                  if (nodeChannel.ChildNodes[i].Name == "item")
  36:                  {
  37:                      nodeItem = nodeChannel.ChildNodes[i];
  38:   
  39:   
  40:                      rowNews = new ListViewItem();
  41:                      rowNews.Text = nodeItem["title"].InnerText;
  42:                      rowNews.SubItems.Add(nodeItem["link"].InnerText);
  43:                      listBox1.Items.Add(rowNews.Text);
  44:                  }
  45:              }

Ve son olarak eklemis oldugumuz listBox’in Selected Index Changed Eventine eklenecek kod:

 

URL Text Box’ina yazilan Rss URL’i Read Buttonunda kullanilacak olan URL’dir, ve List Box’a URL icerisindeki veriler gelir.

 

if (listBox1.SelectedItems.Count == 1)
            {

                for (int i = 0; i < nodeChannel.ChildNodes.Count; i++)
                {

                    if (nodeChannel.ChildNodes[i].Name == "item")
                    {
                        nodeItem = nodeChannel.ChildNodes[i];

                        if (nodeItem["title"].InnerText == listBox1.SelectedItems[0].ToString())
                        {
                            txtContent.Text = nodeItem["description"].InnerText;

                            break;
                        }
                    }
                }
            }

Written by Serkan Hekimoğlu

June 7th, 2010 at 10:46 am

Posted in .NET

Tagged with , , ,

Introduction to Mobile Application Development

without comments

Merhaba arkadaslar, bu makalemde sizlere .NET Compact Framework ve Mobile programlamayı anlatacağım. Örneklerde tahmin edeceğiniz üzere C# kullanacağım. VB’ciler için VB.NET ile de anlatmak isterdim ama VB’ye bir türlü ısınamadım. C# olduğu sürecede ısınabileceğimi pek düşünmüyorum.

Bildiğiniz üzere ülkemizde bilgisayardan çok cep telefonu kullanılmaktadır. Hazır önümüz 3G ve 4G iken mobile programlamada gelişen telefonlarla beraber popüler olacaktır. Bence Türkiye mobile yazılım alanda atılımlar yapmak için güzel bir yer ve şuan sektöründe bu atılımlara ihtiyacı var.

Kısaca şöyle bir mutfağamıza bakacak olursak;

Elimizde bir adet Visual Studio.NET 2008 var. Bunun yanında bolca C# ve .NETCF var. Şimdi bunları kullanarak güzel mobile uygulamalar çıkartacağız.

İlk olarak Yeni bir proje oluştur diyoruz ve açılan menüden Visual C# > Smart Device > Smart Device Project yolu ile yeni bir proje oluşturuyoruz.

image

Ilk basta vazgecilmez ornegimiz olan ”Hello World” yazarak baslamak istiyorum.Resimde de gordugunuz uzere bir adet button koyduk, ve button’un click eventinde ekranda bir messageBox kullanarak “Hello World” yazisini basacagiz.

private void button1_Click_1(object sender, EventArgs e)
        {
            MessageBox.Show("Hello World!");
        }

 

Gordugunuz uzere normal bir Windows Application gelistirmekten pek bir farki yok. Bu windows mobile applicaton development’a giris icin kucuk bir adim oldu :) Asil size bahsetmek istedigim konu ise Windows Mobile 6.5 uzerinde gelistirilebilen Widgetlar.

Bu test süreci birkaç aşamadan oluşmaktadır. Öncelikle widget için hazırladığınız dosyaları *.zip haline getirmeniz gerekmekte. Bir sonraki aşamada bu *.zip uzantısını *.wgt ya da *.widget olarak değiştirmeniz gerekmekte ve bu dosyayı emulatör üzerinde kopyalayıp (bu kopyalama işleminide emulatör ile paylaşımlı bir klasör üzerinden gerçekleştirebilirsiniz) gerekli kurumları yapmanız gerekmekte. Ayrıca bir önce test’ ten kalan kurulumunuzu kaldırmanız ve yeni halini kurmanız test’ i daha stabil kılmaktadır.

Her seferinde bu süreç can sıkıcı olabildiğinden geçen hafta tam ihtiyaç duyulan bir çalışmaya CodePlex üzerinde rastladım ; Windows Mobile Widget Emulator !

CodePlex üzerinde açık kaynaklı olarak gelişimine devam eden çalışma, kullanıcılara geliştirdikleri Windows Mobile Widget’ ları Emülatör’ e kurmaya gerek kalmadan "sanki mobil cihaz üzerinde çalıştırılıyormuş gibi" test imkanı sağlamaktadır.

image

Örneğin CodePlex üzerinden alınan yukarıdaki ekran görüntüsün, geliştirilen bir widget’ ın masaüstü ortamında Windows Mobile Widget Emulator ile çalıştırıldığı görülmektedir.

Peki Nasıl Kullanacağız ?

http://widgetemulator.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=31211 adresinden gerekli paketi indirdiğimizde aşağıdaki islemleri uyguluyoruz: assests klasörü uygulamanın çalıştırılabilmesi için gereken sistemsel dosyaları içermektedir. widgets klasörü "geliştirdiğimiz widget’ ı paketlemeden yerleştireceğimiz" bölgedir. index.htm ise widget’ ımızı test edeceğimiz standart bir HTML dosyasıdır.

Yukarıda da belirttiğimiz üzere geliştirdiğimiz widget’ ı "paketlemeden" widgets klasörü içerisine yerleştirmemiz gerekmektedir. Sadece bu kadar!

Windows Mobile 6.5 üzerinde geliştirilen widget’ larda yararlanılabilecek bir başka nokta ise bir önceki yazımızda ifade ettiğimiz “widget” javascript objesi üzerinden oluşturulabilecek SystemState objesidir. SystemState objesi vasıtasıyla geliştirdiğiniz widget’ lar içerisinden “bazı belirli” sistemsel özelliklerin değerlerine ulaşabilir, bu değerlerin değiştiğini algılayabilir ve istenilen kod bloklarını çalıştırabilmektesiniz. Aşağıdaki listede SystemState objesi üzerinden ulaşılabilecek değerlerin bir listesi listelenmiştir.

CradlePresent – Cihazın “cradle” (cihazın bilgisayarınız ile olan fiziksel bağlantısı) üzerine takılıp takılmadığının değerini döndürür.

DisplayRotation – Ekranın anlık görüntüsünün kaç derecelik bir açıyla gösterildiğinin değerini döndürür. (0 – 360 Derece Arası)

PhoneHomeService – Cihazın anlık network ile kayıtlı olup olmadığının değerini döndürür.

PhoneOperatorName – Cihazın anlık network (operatör) isim değerini döndürür.

PhoneRoaming – Cihazın anlık olarak “Roaming (Yurtdışında farklı bir operatör üzerinden bağlantı)” içerisinde olup olmadığının değerini döndürür.

PhoneSignalStrength – Cihazın operatör ile arasındaki bağlantı kalitesinin değerini yüzdelik olarak döndürür.

PowerBatteryState – Cihazın anlık batarya güç değerini düşük, güçlü, orta şeklinde tanımlı değerlerinin numerik karşılıklarını döndürür.

PowerBatteryStrength – Cihazın anlık batarya güç değerini yüzdelik değer olarak döndürür.

 

Bir sonraki makalemde sizlerle bu yukarida bahsetmis oldugum SystemState objelerini kullanaraktan Mobile Application gelistirecegiz.

Written by Serkan Hekimoğlu

February 15th, 2010 at 9:16 pm

ASP.Net Samples – Part II: File Upload, and Forms Authentication

without comments

 

3- File Upload

Merhaba arkadaslar, ASP.NET Samples konusu uzerine devam eden makalemizde bugun son derece basit ama kullanisli olan File Upload uzerine ornek yapacagim. File Upload uzerine aciklama yapilmasi pekte gerekli degildir aslinda, cunku adindana anlasilacagi uzeri .aspx sayfasi uzerinden Root’ta bulunan bir Folder’a kendi sistemimizden dosya aktaricaz. Direk isleme baslamak istiyorum. Olusturmus oldugumuz solution’a YuklenenKlasorler adli bir folder ve .aspx sayfasi ekliyoruz. Toolbox’tan FileUpload, ve button kontrollerini .aspx sayfamiza ekliyoruz. Button’un click eventine asagidaki kodlari yaziyoruz.

protected void Button1_Click(object sender, EventArgs e)
    {
        string DosyaUzantisi = FileUpload1.FileName.
            Substring(FileUpload1.FileName.LastIndexOf(".") + 1);

        if (DosyaUzantisi.ToLower() == "jpg"
            || DosyaUzantisi.ToLower() == "gif"
            || DosyaUzantisi.ToLower() == "xml")
        {
                FileUpload1.SaveAs(Server.MapPath("YuklenenDosyalar\\") +
                RastgeleKod + "." + DosyaUzantisi);

        }
        else
        {
            Label1.Text = "Hatali Dosya Secimi";
        }
    }

 

Dosya uzantisini okumak icin. FileUpload.FileName.Substring(FileUpload.FileName.LastIndexOf(“.”) + 1) yani dosya adindaki son nokta karakterinden itibaren okuma islemi gerceklestirdik. IF blogu icerisinde kullanicinin aktarim yapabilecegi dosya turlerini belirtmis oluyoruz. Mesela yukaridaki ornegimizde kullanici sadece .jpg, .gif, ve .xml uzantili dosyalari, olusturmus oldugumuz YuklenenDosyalar isimli klasore aktarabilir. Bukadar basit.

4- Forms Authentication

Asp sadece IIS authentication metodlarını desteklerken asp.net daha geniş güvenlik sistemini destekliyor örneğin IIS/Windows doğrulama sistemlerinden Basic doğrulama, Digest doğrulama, Integrated Windows doğrulama, Form bazlı doğrulama ve Microsoft Passport doğrulama. asp.net içerisinde yeni olarak Windows kullanıcı doğrulama (windows authentication) sistemine ek olarak form bazlı kullanıcı doğrulama (forms-based user authentication) sistemi geliştirilmiştir. bu yeni sistemde çerez yönetimi (cookie management) ve otomatik olarak doğrulanmayan kullanıcıların başka bir web sayfasına gönderilmesi (automatic redirecting of unauthorized logins) gibi güzel özellikler eklenmiştir. İzlemek, Debug, ve Bellekleme Desteği (Tracing, debugging and caching support)asp sisteminde kodu izlemek ve BUG lari bulmak bir derttir. Fakat asp.net içerisinde bu sistem çok daha geliştirilmiş, adım adım debug olayı ve diğer trace ve debug metodlarini desteklemektedir. asp.net bunlara ek olarak mükemmel bellekleme (caching API) sağlamaktadır. Verileri bellekleme sistem output caching, data caching, dependent caching ve fragment caching metodlarını destekler.Alintidir.

Authentication Mode’umuzu belirlerken asp projemizde yer alan web.config dosyamizin icindeki  configuration alanini sekildeki gibi duzenliyoruz.

<configuration><system.web>

<security>

<authentication mode="Forms">

</authentication>

</security>

</system.web>

</configuration>

 

Ve ayni sekilde web.config dosyamiz icerisinde kullanici bilgileride tanimlanabilir.

<configuration>

<system.web>

<authentication mode="Forms">

<forms name=".ASPXUSERDEMO" loginUrl="login.aspx"

protection="All" timeout="60">

<credentials passwordFormat="Clear" >

<user name="serkan" password="serkan"/>

<user name="kadir" password="kadir"/>

<user name="test" password="user"/>

</credentials>

</forms>

</authentication>

<authorization>

<deny users="?" />

</authorization>

<globalization requestEncoding="UTF-8" responseEncoding="UTF-8" />

</system.web>

</configuration>

 

Gibi…Su an vaktim olmadigindan dolayi orneklerimizi 3. bolume sarkitiyorum.

Written by Serkan Hekimoğlu

January 20th, 2010 at 10:27 am

VISUAL C# – DELEGATES AND EVENTS – PART II: Event Handler

with one comment

EventHandler aslında bir metod değil bir delegedir. event deklerasyonunda kullanıldığında yeni event artık bir EventHandler delegesi gibi davranır. Bu demektir ki event’e ancak EventHandler’da belirtilen type’da metod bağlanabilir. Bu yeni metodların returnType’ı ve Signature’ı da haliyle <void> <object, EventArgs> olacaktır.
Bu yüzden listeye eklenecek metodların EventHandler delegesiyle uyumlu olması gerekir.

    Bir event objesi yaratıldığında new kullanılmaz,
    event declare class içinde yapılır,
    event’ler çalıştırılabilir bir kod bloğunun içinde declare edilemezler.

     

    Event Handler ile yapmak istedigim ornek, bir insanin bir yiyecek yemesi. Olusturmak istedigim classlar, Insan, Meyve, ve Meyvenin icerisindeki vitamin class’i.

     

    public class Meyve
        {
            private string MeyveAdi_;
            public string MeyveAdi
            {
                get { return MeyveAdi_; }
                set { MeyveAdi_ = value; }
            }
        }
    
    
    public class VitaminDegerleri
        {
    
            public VitaminDegerleri(int C, int D)
            {
                this.CVitamini_ = C;
                this.DVitamini_ = D;
            }
    
            private int CVitamini_;
            public int CVitamini
            {
                get { return CVitamini_; }
                set { CVitamini_ = value; }
            }
    
            private int DVitamini_;
            public int DVitamini
            {
                get { return DVitamini_; }
                set { DVitamini_ = value; }
            }
        }

     

     public class Insan
        {
            public event MeyveYedimEventHandler MeyveYedim;
    
            private Meyve OdamdakiMeyve = null;
    
            public void SerkaninGetirdigiMeyveyiAl(Meyve SerkaninVerdigiMeyve)
            {
                this.OdamdakiMeyve = SerkaninVerdigiMeyve;
            }
    
            public void MeyveyiYe()
            {
                MessageBox.Show(this.OdamdakiMeyve.MeyveAdi + " yedim !");
                if (this.MeyveYedim != null) MeyveYedim(new VitaminDegerleri(34, 57));
            }
        }

     

     

    Ve Eventimiz icin kullanlicak delegate:

    public delegate void MeyveYedimEventHandler(VitaminDegerleri vtm);

     

    Eventimizi tetikleyecek olan method ise su sekildedir:

    void Ins_MeyveYedim(VitaminDegerleri e)
            {
    
            }

     

    Simdi sirada Form_Load’da kullanilacak kodlarimiz var:

     

     private void SerkanHekimogluEvents_Load(object sender, EventArgs e)
            {
                Insan ins = new Insan();
                ins.MeyveYedim += new MeyveYedimEventHandler(Ins_MeyveYedim);
    
                Meyve myv = new Meyve();
                myv.MeyveAdi = "Elma";
    
                ins.SerkaninGetirdigiMeyveyiAl(myv);
                ins.MeyveyiYe();
            }

     

    Event kullanimida, gordugunuz uzere Delegates kadar kolay. Sorulariniz icin bana iletisim bolumunden ulasabilirsiniz.

     

     

     

     

     

     

    Written by Serkan Hekimoğlu

    January 18th, 2010 at 11:47 am

    Posted in .NET, C#

    Tagged with , , ,

    VISUAL C# – DELEGATES AND EVENTS – PART I: Delegates

    without comments

    Bugunku makalemizde sizlerle Temsilciler (Delegates) hakkinda incelemede bulunup, ornek yapacagiz. Temsilciler (Delegates) her ne kadar ileri derece bir kavram olsada her seviyeden C# ile ugrasan kisilerin bilmesi gereken bir yapidir. Tabii ki Delegates kullanmadan bir projeyi yapabilirsiniz. Fakat o zaman yapamayacaginiz isler, yapabilecekleriniz onune gecer.

    Delegates bir projede bir veya birden fazla methodu gosteren bir referans turunden bir nesnedir. Delegates’i kullanamaya baslamadan once tipki bir method tannimlar gibi, delegate’imizin tanimlamasini yapariz. Delegates 2 islem arasinda anahtar gorevi gorur.

    image (C-Sharp Nedir’den alintidir)

     

    Delegates’i size anlatmak icin kullanacagim ornektenten biraz bahsedeyim. Gunluk yasantimizda Delegates’in yaptigi ise verebilecegim en iyi ornek, Lamba ve Lambayi calistiran Dugmedir. Dugme, lambanin yanmasini tetikleyen bir anahtardir(aradaki kablo vasitasi ile). Bunu ornegimizde daha iyi anlayabiliriz. Ornegimize baslarken Ampul ve Dugme’ icin Class yazalim.

    Ampul Class’i :

    public class Ampul
        {
            private string Marka_;
            public string Marka
            {
                get { return this.Marka_; }
                set { this.Marka_ = value; }
            }
    
            public Ampul(string AmpulMarka)
            {
                this.Marka_ = AmpulMarka;
            }
    
            public void BagliBulundugumDugmeyeBasildi(DugmeDurumu Sinyal)
            {
                if (Sinyal == DugmeDurumu.Acik)
                {
                    System.Windows.Forms.MessageBox.Show(this.Marka_ + " ampülü yanıyor !");
                }
                else if (Sinyal == DugmeDurumu.Kapali)
                {
                    System.Windows.Forms.MessageBox.Show(this.Marka_ + " ampülü yanmıyor !");
                }
            }
        }

    Dugme Class’i:

    public class Dugme
        {
    
            public event KabloDelegate SinyalGeldi;
    
            private DugmeDurumu DugmeninAnlikDurumu_ = DugmeDurumu.Kapali;
    
            public DugmeDurumu DugmeninAnlikDurumu
            {
                get { return this.DugmeninAnlikDurumu_; }
            }
    
            private KabloDelegate DugmeBaglantiKablosu = null;
    
            public void AcKapat()
            {
                if (this.DugmeninAnlikDurumu_ == DugmeDurumu.Kapali)
                {
                    this.DugmeninAnlikDurumu_ = DugmeDurumu.Acik;
                }
                else
                {
                    this.DugmeninAnlikDurumu_ = DugmeDurumu.Kapali;
                }
    
                if (SinyalGeldi != null) SinyalGeldi(this.DugmeninAnlikDurumu_);
            }
        }

    Dugme durumunu belirtmek icin Enum kullanalim:

     public enum DugmeDurumu
        {
            Acik,
            Kapali
        }

     

    public void AcKapat()
            {
                if (this.DugmeninAnlikDurumu_ == DugmeDurumu.Kapali)
                {
                    this.DugmeninAnlikDurumu_ = DugmeDurumu.Acik;
                }
                else
                {
                    this.DugmeninAnlikDurumu_ = DugmeDurumu.Kapali;
                }
    
                if (SinyalGeldi != null) SinyalGeldi(this.DugmeninAnlikDurumu_);
            }

    Ve en onemlisi anahtar gorevi gorecek olan Delegate’imizi tanimlayalim:

    public delegate void KabloDelegate(DugmeDurumu dgm);

     

    Simdide sira FormLoad’a yazilacak kodlarda:

    private void SerkanHekimogluDelegates_Load(object sender, EventArgs e)
            {
                Ampul amp = new Ampul("Birinci Ampul");
                Ampul amp2 = new Ampul("Ikinci Ampul");
    
                Dugme dgm = new Dugme();
    
                dgm.SinyalGeldi += new KabloDelegate(amp.BagliBulundugumDugmeyeBasildi);
                dgm.SinyalGeldi += new KabloDelegate(amp2.BagliBulundugumDugmeyeBasildi);
    
                dgm.AcKapat();
            }

     

    Formumuzu Run ettigimizde, Form Load’a koydugumuz Temsilcilerimizin, tanimlamis oldugu Joblari yaptigini goreceksinizdir.

     

    Eventler hakkinda bilgiyi ve ornegi ikinci makalemizde yapacagiz.

     

     

     

    Written by Serkan Hekimoğlu

    January 18th, 2010 at 11:21 am

    Posted in .NET, C#

    Tagged with , , ,

    XML Serialization – How to do XML Serialization?

    without comments

    Merhaba arkadaslar, bu makalede sizlerle daha onceden uzerinde durmus oldugumuz Serialization konusunu kullanaraktan, Serialize edilmis XML dosyasi yaratacagiz.

    Serialization işlemi, son durumlarını korumak istediğimiz nesnelerin, hiçbir veri kaybına uğramadan, geçici olarak hafızada veya kalıcı olarak bir dosyada saklanmasıdır. Bu dosya tipi XML veya binary olabilir. Bunlar her ortamdan kolayca erişilebilen basit dosya tipleridir. Bu yontem ile cok buyuk miktardaki verilere ulasabiliriz, transfer edebiliriz. Ve baska kullanicilarinda kullanimina acabiliriz.

    Uygulamayi yapmak icin oncelikle WindowsApplication Projesi olusturuyoruz. Bu ornekte herhangi UI kullanmayacagiz, ve herseyi FormLoad’da yapacagiz. Oncelikle ornegimizden bahsedelim. Bir adet Insan class’i olusturacagiz, ve insan class’ini kullanaraktan bir kisi olusturup, bilgilerini local diskimizde saklayacagiz (Tabi bu sizin isteginize bagli, isterseniz database’de saklayip baska kullanicilarin kullaniminada acabilirsiniz)

     

    [Serializable()]
        public class Insan
        {
            private int TcKimlikNo_;
            public int TcKimlikNo
            {
                get { return TcKimlikNo_; }
                set { TcKimlikNo_ = value; }
            }
    
            private string AdSoyad_;
            public string AdSoyad
            {
                get { return AdSoyad_; }
                set { AdSoyad_ = value; }
            }
    
            [NonSerialized(),System.Xml.Serialization.XmlIgnore()]
            private int SosyalGuvenlikNo_;
    
            public int SosyalGuvenlikNo
            {
                get { return SosyalGuvenlikNo_; }
                set { SosyalGuvenlikNo_ = value; }
            }
    
            public override string ToString()
            {
                return this.TcKimlikNo_ + " - " + this.AdSoyad_;
            }
    
            [System.Runtime.Serialization.OnDeserialized()]
            protected void DeserializeLog(System.Runtime.Serialization.StreamingContext sc)
            {
                // Loglama Kodlari.
                MessageBox.Show("Deserialize Edildi !");
            }
    
            [System.Runtime.Serialization.OnSerialized()]
            protected void SerializeLog(System.Runtime.Serialization.StreamingContext sc)
            {
                // Loglama Kodlari.
                MessageBox.Show("Serialize Edildi !");
            }
    
        }

    Bu noktada en onemli olan sey, classinizi tanimlarken bu classin Serialize edilebilmesi icin uste ekledigimiz [Serializable()] textidir.

    Simdi gecelim FormLoad kodlarimizia.

     

     private void FormXmlSerialization_Load(object sender, EventArgs e)
            {
                System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.
                    XmlSerializer(typeof(Insan));
                Insan ins = new Insan();
                ins.AdSoyad = "Serkan Hekimoglu";
                ins.SosyalGuvenlikNo = 1234567;
                ins.TcKimlikNo = 2938475;
    
                System.IO.FileStream fs = new System.IO.
                    FileStream("G:\\Insan.xml", System.IO.FileMode.OpenOrCreate);
    
                xs.Serialize(fs, ins);
    
                fs.Close();
    
            }

    Written by Serkan Hekimoğlu

    January 6th, 2010 at 1:05 pm