<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Yazılım Öğren</title>
	<atom:link href="http://www.yazilimogren.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.yazilimogren.com</link>
	<description></description>
	<lastBuildDate>Sat, 12 Sep 2009 08:55:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>WinAPI Fonksiyonlarının C#&#8217;ta Kullanımı</title>
		<link>http://www.yazilimogren.com/2009/04/winapi-fonksiyonlarinin-cta-kullanimi/</link>
		<comments>http://www.yazilimogren.com/2009/04/winapi-fonksiyonlarinin-cta-kullanimi/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 13:22:30 +0000</pubDate>
		<dc:creator>xqm26</dc:creator>
				<category><![CDATA[C# Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[C# Sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Resimli Anlatım]]></category>

		<guid isPermaLink="false">http://www.yazilimogren.com/?p=2117</guid>
		<description><![CDATA[C# ve dotNET ile birlikte yazılım geliştirmeye yeni bir soluk gelmiş olsada C# ile eskiden yazılmış COM komponentlerine erişebilmek mümkündür. Daha önceki iki makalede .NET ve COM ilişkisini detaylı bir şekilde incelemiştik. Bu makalede .NET&#8217;in Win 32 API ile nasıl entegre edildiği anlatılacaktır. .NET ve C#&#8217;ın yeni imkanlarının yanısıra eski bir teknoloji olan COM ve yönetilmeyen(unmanaged) [...]]]></description>
			<content:encoded><![CDATA[<p><span><img class="alignleft size-full wp-image-2118" title="c-ders-148" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-ders-148.jpg" alt="c-ders-148" width="150" height="150" />C# ve dotNET ile birlikte yazılım geliştirmeye yeni bir soluk gelmiş olsada C# ile eskiden yazılmış COM komponentlerine erişebilmek mümkündür.<span id="more-2117"></span> Daha önceki iki makalede .NET ve COM ilişkisini detaylı bir şekilde incelemiştik. Bu makalede .NET&#8217;in Win 32 API ile nasıl entegre edildiği anlatılacaktır. .NET ve C#&#8217;ın yeni imkanlarının yanısıra eski bir teknoloji olan COM ve yönetilmeyen(unmanaged) kodlarla uyumlu bir şekilde çalışması belkide C# ve .NET&#8217;i diğer yazılım geliştirme platformlarından ayıran en önemli özelliktir.</span></p>
<p>Bildiğiniz gibi C#&#8217;ta gösterici kullanımı tamamen serbesttir. Bu yüzden eskiden(.NET öncesi) yazılmış ve parametre olarak gösterici alan COM komponentleri ve Windows API fonksiyonları C# ile sorunsuz bir şekilde çalıştırılabilmektedir. Bu yazıda Win API fonksiyonlarının .NET ortamında ne şekilde ele alındığı incelenecektir.</p>
<p>Win32 sistem fonksiyonları kullanıldığında, kod CLR tarafından yönetilmekten çıkar. .NET ortamında geliştirilen bir uygulamada yönetilmeyen kod segmenti ile kaşılaşılırsa ilgi kod segmenti CLR tarafından yönetilmekten çıkar. Dolayısıyla &#8220;garbage collection&#8221; mekanizması ve .NET&#8217;e özgü diğer servisler kullanım dışı olur.</p>
<p>CLR tarafından yönetilmeyen kodlara erişebilmek için C#&#8217;ta <strong>System.Runtime.InteropServices</strong> isim alanında bulunan ve DllImprtAttribute sınıfını temsil eden <strong>DllImport</strong> niteliği kullanılmaktadır. DllImport niteliği ile harici bir kaynakta bulunan metoda referans vermek için <strong>external</strong> anahtar sözcüğü kullanılır. Bir sınıf bildiriminin en başında external anahtar sözcüğü ve DllImport niteliği kullanılarak CLR tarafından yönetilmeyen bir metot bildirimi yapılır. Tabi metodun gövdesi harici bir kaynakta zaten var olduğu için bizim metodun gövdesini yazmamızın bir anlamı yoktur. Ardından bu metot sınıfın istenildiği yerinde kullanılabilir. İsterseniz basit bir örnekle DllImport niteliğinin kullanımını gösterelim.</p>
<p>Win API windows sistemlerinin programlanabilir arayüzünü içermektedir. Windows uygulamarının tamamı bu arayüzdeki fonksiyonları ve diğer yapıları kullanmaktadır. Aşağıdaki programda Win32 sistemlerinde bulunan MessageBox() fonksiyonunun kullanımına bir örnek verilmiştir.</p>
<p><strong>Not</strong> : Bu yazıda C#&#8217;ta niteliklerin(Attributes) nasıl kullanıldığını bildiğiniz varsayılmıştır.</p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td><span><em>using</em></span><span><em> System;<br />
</em> </span><span><em>using</em></span><span><em> System.Runtime.InteropServices;</em></span><em><br />
</em></p>
<p><span><em>class </em></span><span><em>Class1<br />
{<br />
    [DllImport("user32.dll")]<br />
    </em></span><span><em>public static   extern int</em></span><span><em> MessageBox(</em></span><span><em>int</em></span><span><em> tip,</em></span><span><em>string</em></span><span><em> mesaj,</em></span><span><em>string</em></span><span><em> baslik,</em></span><span><em>int </em></span><span><em>secenek);</em></span></p>
<p><span><em>    </em></span><span><em>static void</em></span><span><em> Main()<br />
    {<br />
        MessageBox(0,&#8221;Mesaj&#8221;,&#8221;Win   API MessageBox&#8221;,2);<br />
    }<br />
}</em></span></td>
</tr>
</tbody>
</table>
<p><span>DllImportAttribute sınıfının bir tane yapıcı metodu bulunmaktadır. Bu metot parametre olarak harici kaynağın adı belirtmektedir. Yukarıdaki kaynak kodda MessageBox fonksiyonunun bulunduğu &#8220;user32.dll&#8221; isimli dosya DllImport niteliğine parametre olarak verilmiştir. Bu örnekte dikkat edilmesi gereken diğer nokta ise <strong>extern</strong> anahtar sözcüğünün kullanımıdır. Bu anahtar sözcük ile bildirimi yapılan metodun harici bir dosyada olduğu belirtilmektedir. Dolayısıyla C# derleyicisi metodun gövdesini kaynak kodda aramayacaktır.</span></p>
<p>Programın çalışma şeklini açıklamadan önce ekran çıktısına bakalım :</p>
<p><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75"  o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:209.25pt;  height:84pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg"   o:href="http://www.csharpnedir.com/MImages/winapi_cs.jpg" /> </v:shape><![endif]--><img class="alignnone size-full wp-image-2116" title="c-winapi-1" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-winapi-1.jpg" alt="c-winapi-1" width="270" height="103" /></p>
<p>Yukurıdaki çıktıdan ve kaynak koddan da görüldüğü üzere Win API deki bir fonksiyonun çağrımı klasik metot çağrımından farklı değildir. Değişen tek şey metodun bildirim şeklidir.</p>
<p><strong>Not</strong> : Gösterilen mesaj kutusunun farklı formlarını görmek için MessageBox metodunun parametreleri ile oynayın.</p>
<p>Şimdi kısaca yukarıdaki programın çalışma zamanındaki durumunu inceleyelim. Program çalıştırıldığında, CLR tarafından yönetilmeyen bir metot çağrımı yapıldığında ilgili kaynaktan metot belleğe yüklenir ve belleğe yüklenen metodun başlangıç adresi saklanır. Ardından bizim parametre olarak geçtiğimiz değişkenler DLL&#8217; deki fonksiyona uyumlu hale getirilir ve parametre olarak geçirilir. Eğer bir geri dönüş değeri bekleniyorsa yönetilmeyen kod bölümünden gelen değer uygun .NET türüne dönüştürülerek işlemlere devam edilir. Bu işlemler tamamen .NET&#8217;in alt yapısını ilgilendirmektedir. Dolayısıyla programcının yapacağı iş sadece metodun bildirimini doğru bir şekilde gerçekleştirmektir.</p>
<p>DllImportAttribute sınıfının bir kaç önemli özelliği daha vardır. Bunlardan en önemlisi harici kaynaktaki bir fonksiyona takma isim verebilmemizi sağlayan string türünde olan <strong>EntryPoint</strong> özelliğidir. EntryPoint özelliğini kullanarak MessagBox fonksiyonuna takma isim verebiliriz. Fonksiyon çağrımı bu takma isim ile gerçekleştirilebilmektedir. Örneğin MessageBox fonksiyonuna TebrikMesajiVer şeklinde bir takma isim vermek için aşağıdaki gibi bir bildirim yapılmalıdır.</p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td><span><em>using</em></span><span><em> System;<br />
</em> </span><span><em>using</em></span><span><em> System.Runtime.InteropServices;</em></span><em><br />
</em></p>
<p><span><em>class </em></span><span><em>Class1<br />
{<br />
    [DllImport("user32.dll",EntryPoint =   "MessageBox")]<br />
    </em></span><span><em>public static   extern int</em></span><span><em> TebrikMesajiVer(</em></span><span><em>int</em></span><span><em> tip,</em></span><span><em>string</em></span><span><em> mesaj,</em></span><span><em>string</em></span><span><em> baslik,</em></span><span><em>int </em></span><span><em>secenek);</em></span></p>
<p><span><em>    </em></span><span><em>static void</em></span><span><em> Main()<br />
    {<br />
        TebrikMesajiVer(0,&#8221;Tebrikler&#8221;,&#8221;Takma   İsim Verme&#8221;,0);<br />
    }<br />
}</em></span></td>
</tr>
</tbody>
</table>
<p><span><br />
Şimdi de DllImport niteliği ile ilgili diğer özelliklere ve önemli noktalara bakalım.</span></p>
<p><strong>1</strong> &#8211; DllImport niteliği yalnızca metotlara uygulanabilir.</p>
<p><strong>2</strong> &#8211; DllImport niteliği ile işaretlenmiş metotlar mutlaka <strong>extern</strong> anahtar sözcüğü ile bildirilmelidir.</p>
<p><strong>3</strong> &#8211; DllImport niteliğinin EntryPoint&#8217;in haricinde 4 tane isimli parametresi(named parameter) daha vardır. Bunlar : <strong>CallingConvention, CharSet, ExactSpelling, PreserveSig ve SetLastError</strong> parametreleridir. Bu parametrelerden önemli olanlar aşağıda açıklanmıştır.</p>
<p><strong>4</strong> &#8211; <strong>CallingConvention</strong> : Bu paramtre CallingConvention numaralandırması türündendir. Bu parametre ile harici metodun ne şekilde çağrılacağı ile ilgili bilgi verilir. CallingConvention numaralandırması 5 tane sembol içerir. Varsayılan olarak bu sembol Winapi olacak şekilde ayarlanmıştır. Yani CallingConvention parametresini DllImport ile kullanmıyorsak varsayılan olarak bu Winapi&#8217;dir. Diğer semboller ise <strong>Cdecl, FastCall, ThisCall, StdCall</strong> şeklindedir. En çok Winapi sembolu kullanıldığı için diğer sembollerin ne anlama geldiği anlatılmayacaktır. Diğer sembollerin ne anlama geldiklerini MSDN kütüphanesinden detaylı bir şekilde öğrenebilirsiniz.</p>
<p><strong>5</strong> -<strong> CharSet</strong> : Harici fonksiyonun çağrımında kullanılacak karekter setini belirler. Bu parametre CharSet numaralandırması ile belirtilir. Varsayılan olarak <strong>CharSet.Auto</strong> şeklindedir. CharSet numaralandırmasının diğer sembolleri <strong>Ansi, Unicode ve None</strong> şeklindedir.</p>
<p><strong><span>6</span></strong><span> -<strong> ExactSpelling</strong> : EntryPoint ile belirtilen ismin ilgili fonksiyon ismine yazım biçimi bakımından tam uyumlu olup olmayacağını belirtir. Bu özellik bool türündendir ve varsayılan olarak <strong>false</strong> değerdir.</span></p>
<p><span><br />
DllImport metodunun varsayılan çağrım biçimi olan Winapi sadece Windows sistemlerine özgün olduğu için sistemler arası taşınabilirliğin yüksek olması gereken projelerde bu niteliğin kullanımından kaçınmak gerekir. Bu yüzden DllImport özelliğini kullanmadan önce ilgili fonksiyonun .NET Framework içinde olup olmadığını kontrol etmek gerekir. Örneğin MessageBox fonksiyonu zaten System.Windows.Forms isim alanında bulunduğu için API kullanarak bu fonksiyondan yararlanmak mantıklı değildir. Zira ileride programınızın Linux ortamında yada diğer farklı ortamlarda da çalışmasını istiyorsanız programınızı değiştirip yeniden derlemeniz gerekecektir. Oysa .NET Framework içinde bulunan standart sınıfları ve onların metotlarını kullanırsanız böyle bir derdiniz olmayacaktır.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yazilimogren.com/2009/04/winapi-fonksiyonlarinin-cta-kullanimi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# ile Sıra (Queue) Sınıfı ve kullanımı</title>
		<link>http://www.yazilimogren.com/2009/04/c-ile-sira-queue-sinifi-ve-kullanimi/</link>
		<comments>http://www.yazilimogren.com/2009/04/c-ile-sira-queue-sinifi-ve-kullanimi/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 13:17:28 +0000</pubDate>
		<dc:creator>xqm26</dc:creator>
				<category><![CDATA[C# Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[C# Sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false">http://www.yazilimogren.com/?p=2113</guid>
		<description><![CDATA[ Şimdi, diğer önemli veri yapısı olan sıra (queue) veri yapısını inceleyeceğiz.






Queue veri tipi ve .NET&#8217;in sınıf   kütüphanesinde bulunan Queue sınıfı, yığın (stack) sınıfına çok benziyor. Bu   veri tipleri çalışma mantığı olarak tam tersi gibi görünmelerine rağmen bir   çok metodları ve özellikleri birebir örtüşüyor. Bu durumda birazdan   okayacağınız [...]]]></description>
			<content:encoded><![CDATA[<p><span><img class="alignleft size-full wp-image-2114" title="c-ders-147" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-ders-147.jpg" alt="c-ders-147" width="150" height="150" /> Şimdi, diğer önemli veri yapısı olan sıra (queue) veri yapısını inceleyeceğiz.<span id="more-2113"></span><br />
</span></p>
<div>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="80%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><strong><span>Queue veri tipi ve .NET&#8217;in sınıf   kütüphanesinde bulunan Queue sınıfı, yığın (stack) sınıfına çok benziyor. Bu   veri tipleri çalışma mantığı olarak tam tersi gibi görünmelerine rağmen bir   çok metodları ve özellikleri birebir örtüşüyor. Bu durumda birazdan   okayacağınız makalenin formatı yığın makalemizdekine çok benzediğini   göreceksiniz.</span></strong></p>
</td>
</tr>
</tbody>
</table>
</div>
<p><strong><span>1. Queue(sıra) veri Yapısının Çalışma Şekli</span></strong></p>
<p><span>Sıralar (queue) <strong>İlk Giren İlk Çıkar</strong> (FIFO) prensibi ile çalışan veri yapısı şekinde bilinirler. Bir sıraya ilk giren eleman ilk olarak çıkar. Sıralara örnek olarak bir markette alışverişini yapan müşterilerin, aldıkları ürünlerin ücretlerini ödemek için kasada sıraya geçmeleri verilebilir. Marketteki sırada sıraya ilk giren müşterinin işi ilk önce biter. Daha sonra ikinci ve üçüncü müşterilerin işleri yapılır.</span></p>
<p><span>Sıralar bilgisayar programlamada sık sık başvurulan veri yapılarıdır. Mesela, işletim sisteminde yapılması gereken işleri bir sıra veri yapısı ile tutarız. Herhangi bir anda yeni bir iş geldiği zaman bu iş sıraya (Queue) girer. Sırası gelen iş yapılır ve sonraki işe geçilir gibi. Queue veri yapıları ayrıca simulasyonlarda da sık sık kullanılır. </span></p>
<p><strong><span>2. .NET Sınıf Kütüphanesi Sıra Sınıfı (Queue)</span></strong></p>
<p><span>.NET sınıf kütüphanesinde sıra veri yapısını kullanmak için <strong>Queue</strong> sınıfını kullanırız. NET&#8217;in yığın (<strong>Stack</strong>) sınıfını kullanmak için pogram kodunun baş tarafına </span><strong><span>using System.Collections;</span></strong><span> eklememiz gerekir. Yani sıra sınıfı <strong>System.Collections </strong>isim alanında bulunuyor.</span></p>
<p><span>C# veya herhangi bir dilde yazılan yığın veri yapılarında <strong>Enqueue(), Dequeue, Peek(), Clear() </strong>fonksiyonları ve <strong>Count,</strong> özelliği vadır. Bunların yanında <strong>Clone(), CopyTo(), ToArray(), Contains() ve Equals()</strong> metodları .NET&#8217;in yığın sınıfında yeralır.</span></p>
<p><span>Sıra sınıfının <strong>Enqueue()</strong> metodu sıraya yeni bir eleman ekler. <strong>Dequeue()</strong> metodu ile yığının en öndeki elemanı sıradan siler ve silinen elemanı geriye dönderir. Eğer sıranın tepesindeki elemanı öğrenmek istersek <strong>Peek() </strong>medotunu işimize yarar. Bu metod sıranın başındaki nesneyi dödürür ama bu nesneyi sıradan silmez. </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td width="96%"><span><em>using System;<br />
using System.Collections; </em></span><span><em>// Queue   sınıfı bu isim alanı içinde bulunur.</em></span><em><br />
</em></p>
<p><span><em>class Sira_Ornek1<br />
{</em></span></p>
<p><em>   public static void Main()<br />
   {</em></p>
<p><span><em>      </em></span><span><em>// Queue sınıfından bir nesne oluşturalım:</em></span><span><em><br />
      Queue sira = new Queue();</em></span></p>
<p><em>      </em><span><em>//   Nesnemize Enqueue metodu ile değerler girelim:</em></span><span><em><br />
      sira.Enqueue(&#8221;Ahmet&#8221;);<br />
      sira.Enqueue(&#8221;Ferit&#8221;);<br />
      sira.Enqueue(&#8221;Hasan&#8221;);<br />
      sira.Enqueue(&#8221;Hüseyin&#8221;);</em></span></p>
<p><span><em>      </em></span><span><em>// sira isimli nesnemizin eleman sayısı:</em></span><span><em><br />
      Console.WriteLine( &#8220;\n sira   nesmemizin eleman sayısı: &#8221; + sira.Count);</em></span></p>
<p><span><em>      </em></span><span><em>// sira isimli nesnemizin elemanları:</em></span><span><em><br />
      Console.WriteLine( &#8220;\n sıra   nesmemizin elemanları: &#8221; );<br />
      DegerleriYaz( sira );</em></span></p>
<p><span><em>     </em></span><span><em> //sira isimli nesmemizden bir eleman alalım:</em></span><span><em><br />
      string eleman= (string)sira.Dequeue();<br />
      Console.WriteLine(&#8221; \n Sıramizin   başından şunu aldık: &#8221; + eleman);</em></span></p>
<p><span><em>      //şimdi   ise siranin en başındaki nesneyi öğrenelim.<br />
      // Ama onu ıiradan çıkartmayacağız:</em></span><span><em><br />
      eleman= (string)sira.Peek();<br />
      Console.WriteLine(&#8221; \n Sıramızın   başındaki eleman &#8221; + eleman);</em></span></p>
<p><em>   }</em></p>
<p><span><em>   public static   void DegerleriYaz( IEnumerable kolleksiyon )<br />
   {<br />
      System.Collections.IEnumerator Enum =   kolleksiyon.GetEnumerator();</em></span></p>
<p><em>      while ( Enum.MoveNext() )<br />
         Console.Write(   &#8220;\t{0}&#8221;, Enum.Current );</em></p>
<p><em>      Console.WriteLine();<br />
   }<br />
}</em></td>
</tr>
</tbody>
</table>
<p><span>Yukarıdaki örnek programda önce Queue sınıfından <strong>sıra</strong> isimli bir nesne oluşturuyoruz. Sonraki altı satırda sıramıza &#8220;Ahmet&#8221;, &#8220;Ferit&#8221;, &#8220;Hasan&#8221;, ve &#8220;Hüseyin&#8221; değerlerini <strong>Enqueue</strong> metodu ile ekliyoruz. <strong>Degerleri() </strong>ismini verdiğimiz static fonksiyonumuz ile sıramızdaki eleman sayısını ve elemanları ekrana yazdırıyoruz. Daha sonra sıramızdan bir tane elemanı <strong>Deuque()</strong> metodu yardımıyla alıyor ekrana yazdırıyoruz. Programın son kısmında ise <strong>Peek()</strong> metodunu kullanrak sıranın en üstündeki elemanın ne olduğunu öğreniyoruz ve bu eleman sırada kalıyor. </span></p>
<p><span>Sıra sınıflarında bulunan diğer iki temel fonksiyonlar olan <strong>Count </strong>özelliği<strong> </strong>ve <strong>Clear()</strong> metodlarıdır. Bunlardan <strong>Count</strong>, sıra nesnesinde bulunan elemanların sayısını geriye dönderen bir özelliktir. <em>Özellikler C# dilinde sınıflarda bulunan üye değişkenlerin değerlerini öğrenmemize ve onların değerlerini değiştirmemize yarayan bir tür fonksiyonlardır.</em> <strong>Count </strong>özelliği eleman sayısını int tipinde dönderir ve sadece okunabilen (readonly) yapıdadır. Özellikler program içinde çağrılırken parantezleri kullanmayız. Eğer sırayı boşaltmak/temizlemek istersek <strong>Clean()</strong> metodu işimizi yarayacaktır. <strong>Clean() </strong>metodu hiçbir parametre almaz ve hiçbirşey döndermez. Herhangi bir sıra nesnesinin içinde bir elemanın olup olmadığını anlamak için <strong>Contains()</strong> metodu kullanılır. Bu metod aranacak nesneyi alır ve geriye </span><span>true</span><span> veya </span><span>false</span><span> değerlerini dönderir. İsterseniz aşağıdaki programda <strong>Contains()</strong> ve <strong>Clear()</strong> metodları ile <strong>Count</strong> özelliklerini nasıl kullanabileceğimizi görelim:</span></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td width="96%"><span><em>using System;<br />
using System.Collections; </em></span><span><em>// Queue   sınıfı bu isim alanı içinde bulunur.</em></span><em><br />
</em></p>
<p><span><em>class Sira_Ornek2<br />
{</em></span></p>
<p><em>   public static void Main()<br />
   {</em></p>
<p><span><em>      </em></span><span><em>// Queue sınıfından bir nesne oluşturalım:</em></span><span><em><br />
      Queue sira = new Queue();</em></span></p>
<p><em>      </em><span><em>//   Nesnemize Enqueue metodu ile değerler girelim:</em></span><span><em><br />
      sira.Enqueue(12);<br />
      sira.Enqueue(3);<br />
      sira.Enqueue(18);<br />
      sira.Enqueue(7);<br />
      sira.Enqueue(20);</em></span></p>
<p><span><em>      </em></span><span><em>// sıra isimli nesnemizin eleman sayısı:</em></span><span><em><br />
      Console.WriteLine( &#8220;\n sira   nesmemizin eleman sayısı: &#8221; + sira.Count);</em></span></p>
<p><span><em>      </em></span><span><em>// sira isimli nesnemizin elemanları:</em></span><span><em><br />
      Console.WriteLine( &#8220;\n sıra   nesmemizin elemanları: &#8221; );<br />
      DegerleriYaz( sira );</em></span></p>
<p><span><em>      </em></span><span><em>//Contains metodunun kullanımı:</em></span><span><em><br />
      int sayi=7;</em></span></p>
<p><span><em>      if(sira.Contains(7))<br />
         Console.WriteLine(&#8221;Sıramızda   &#8221; + sayi + &#8221; var.&#8221;);<br />
      else<br />
         Console.WriteLine(&#8221;Sıramızda   &#8221; + sayi + &#8221; yok.&#8221;);</em></span></p>
<p><span><em>      </em></span><span><em>// sıramızın içindeki elemanları silelim:</em></span><span><em><br />
      sira.Clear();</em></span></p>
<p><span><em>      </em></span><span><em>// Sıramızı temizledikten sonra kaç tane<br />
      //eleman bulunduğunu bulup yazalım.</em></span><span><em><br />
      int elemanSayisi= sira.Count;</em></span></p>
<p><em>      Console.WriteLine(&#8221;\n Sıramizda şu   anda {0} tane eleman vardır.&#8221;, elemanSayisi);</em></p>
<p><em>   }</em></p>
<p><span><em>   public static   void DegerleriYaz( IEnumerable kolleksiyon )<br />
   {<br />
      System.Collections.IEnumerator Enum =   kolleksiyon.GetEnumerator();</em></span></p>
<p><em>      while ( Enum.MoveNext() )<br />
         Console.Write(   &#8220;\t{0}&#8221;, Enum.Current );</em></p>
<p><em>      Console.WriteLine();<br />
   }<br />
}</em></td>
</tr>
</tbody>
</table>
<p><span>Yığında makalemiz <strong>Clone(), ToArray()</strong> ve <strong>Equals()</strong> metodlarının aynıları Queue sınıfı içinde bulabiliriz. </span><span>Sizlerin yığın makalesindeki en son örneğini sıra veri tipi için de yazıp kendinizi denemenizi tavsiye ederim.</span><span> Herkese iyi çalışmalar. </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yazilimogren.com/2009/04/c-ile-sira-queue-sinifi-ve-kullanimi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual C# ile Basit Bir Not Defteri Uygulaması</title>
		<link>http://www.yazilimogren.com/2009/04/visual-c-ile-basit-bir-not-defteri-uygulamasi/</link>
		<comments>http://www.yazilimogren.com/2009/04/visual-c-ile-basit-bir-not-defteri-uygulamasi/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 13:14:28 +0000</pubDate>
		<dc:creator>xqm26</dc:creator>
				<category><![CDATA[C# Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[C# Sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Resimli Anlatım]]></category>

		<guid isPermaLink="false">http://www.yazilimogren.com/?p=2108</guid>
		<description><![CDATA[Eğer bu yazıyı sonuna kadar okursanız ve kodları sizde yazarsanız, yazının   sonuna geldiğiniz Basit Not Defteri adında bir uygulamanız olacak. Önce bu   programdan biraz bahsedelim. Adı üstünde bir Not Defteri uygulaması ancak   basit hem de çok basit. Yapabildiği şeyler: Yeni dosya yaratmak, var olan   dosyaları açmak, dosya [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-2111" title="c-ders-146" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-ders-146.jpg" alt="c-ders-146" width="150" height="150" />Eğer bu yazıyı sonuna kadar okursanız ve kodları sizde yazarsanız, yazının   sonuna geldiğiniz Basit Not Defteri adında bir uygulamanız olacak. <span id="more-2108"></span>Önce bu   programdan biraz bahsedelim. Adı üstünde bir Not Defteri uygulaması ancak   basit hem de çok basit. Yapabildiği şeyler: Yeni dosya yaratmak, var olan   dosyaları açmak, dosya kaydetmek… Böyle bir program yapmamın sebebi tabi ki   metin editörleri konusunda alternatif oluşturma isteği falan değil, tek sebep   benim ilk başlarda çok zorlandığım SaveFileDialog, OpenFileDialog gibi   kontroller konusunda örneklemeler yapmak..</p>
<p>Lafı daha fazla uzatmadan artık uygulamaya geçelim. Önce aşağıdaki programı   Visual Studio .Net’in Designer’ında oluşturun…</p>
<p><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600"    o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"    stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:430.5pt;    height:269.25pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg"     o:href="http://www.csharpnedir.com/Mimages/resim_1.jpg" /> </v:shape><![endif]--><img class="alignnone size-full wp-image-2109" title="c-notepad-1" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-notepad-1.jpg" alt="c-notepad-1" width="500" height="314" /><br />
   <br />
Ben bu resime kullandığım kontrollerin isimlerini de yazdım ki kodları   incelerken zorluk çıkmasın. Yalnız burada görünmeyen 2 kontrol daha var. Biri   SaveFileDialog (objSave), diğeri OpenFileDialog (objOpen). Bu kontrolleri de   ekleyip adlarını parantez içlerindeki gibi yaparsanız sorun çıkmaz…</p>
<p>Şimdi kodlarımıza geçebiliriz. Bu bölümde adım adım ilerleyeceğiz.   Menülerdeki tüm başlıkların olaylarını yazacağız.</p>
<p>1)Genel değişkenimizi tanımlama<br />
Bu programda Degisim adında, “bool” yani sadece true ve false değerleri   alabilen bir değişken tanımladım. Bu değişken sayesinde kullanıcıyı metinin   değişip değişmediği konusunda uyaracağız, böylece isterse değişen metni kayıt   imkanı vereceğiz…</p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><strong><span><em>private</em></span></strong><span><em> </em></span><strong><span><em>bool</em></span></strong><span><em> Degisim;</em></span></p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>2)Form1’in onLoad Olayı<br />
Bu olay programımızın açılışında yürütülen olaydır. Burada objSave ve objOpen   için bazı ayarlar yapıyoruz ve göstermesini istediğimiz dosyaların   uzantılarını giriyoruz.</p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span><em>      </em></span><strong><span><em>private</em></span></strong><span><em> </em></span><strong><span><em>void</em></span></strong><span><em> Form1_Load(object sender, System.EventArgs e)<br />
      {<br />
         objOpen.Filter =     &#8220;Text Dosyaları(*.txt)|*.txt|Tüm Dosylar(*.*)|*.*&#8221; ;<br />
         objOpen.FilterIndex =     1 ;<br />
         objSave.Filter =     &#8220;Text Dosyaları(*.txt)|*.txt|Tüm Dosyalar(*.*)|*.*&#8221; ;<br />
         objSave.FilterIndex =     1 ;<br />
      }</em></span></td>
</tr>
</tbody>
</table>
<p> </p>
<p>3)Kullanılacak metotların tanımlanması…<br />
Ben bu programda sadece 2 tane metot tanımladım. Bunlardan birincisi   KayitMekanizmasi, diğeri DegisimUyari . KayitMekanizmasi adı üstünde   yazdıklarımızı kaydedecek olan mekanizma, DegisimUyari ise objText içindeki   metnin değişimi durumda programı kapatırken falan bize haber verecek olan   kod.</p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span><em>      </em></span><strong><span><em>public</em></span></strong><span><em> </em></span><strong><span><em>void</em></span></strong><span><em> KayitMekanizmasi(</em></span><strong><span><em>string</em></span></strong><span><em> strVeri)<br />
      {<br />
         </em></span><strong><span><em>if</em></span></strong><span><em> (objSave.ShowDialog() == DialogResult.OK)<br />
         {<br />
            StreamWriter     Kayitci = </em></span><strong><span><em>new</em></span></strong><span><em> StreamWriter(Environment.GetEnvironmentVariable(&#8221;mydocuments&#8221;)+objSave.FileName.ToString(),</em></span><strong><span><em>false</em></span></strong><span><em>,System.Text.Encoding.Unicode);<br />
            Kayitci.Write(strVeri);<br />
            Kayitci.Close();<br />
            Degisim     = </em></span><strong><span><em>false</em></span></strong><span><em>;<br />
         }<br />
      }</em></span></td>
</tr>
</tbody>
</table>
<p><span><br />
   <br />
Önce yukarıdaki kodu biraz inceleyelim. Burada önce bi if kontrolü   görüyorsunuz. Bu kontrolün amacı, Kayıt ekranı açıldığı zaman kullanıcı “OK”   düğmesine tıklayıp tıklamadığını kontrol etmek. Eğer “OK”e tıkladı ise   programımız bir adet StreamWriter oluşturuyor. Kayitci adındaki bu Writer   Environment.GetEnvironmentVariable(&#8221;mydocuments”) bu kod ile ayarlı olan   Belgelerim klasörüne gidiyor otomatik olarak. objSave.FileName ise bizim   Kayıt Ekranın da dosyaya verdiğimiz ismi bize döndürüyor. Son olarak ise bu   satırda Unicode bir kodlama yaptığımız gösteriyoruz. Bunu yazmazsanız Türkçe   karakterlerinizin yerinde yeller estiğini görürsünüz.</span></p>
<p>Kayitci.Write(strVeri) satırı ile gelen veriyi kaydediyor ve StreamWriter   nesnesini kapatıyor. Degisim değerini ise true olarak atıyor. Bunun nedeni   değişim oldu ve ben bunu gördüm demek. Kullanıcıya haber vermeye gerek yok   anlamına gelecek.</p>
<p>   Şimdi devam edelim.</p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span><em>      </em></span><strong><span><em>public</em></span></strong><span><em> </em></span><strong><span><em>bool</em></span></strong><span><em> DegisimUyari()<br />
      {<br />
         </em></span><strong><span><em>if</em></span></strong><span><em> (MessageBox.Show(&#8221;Dosyanızda bir değişiklik oldu kaydetmek </em></span><strong><span><em>is</em></span></strong><span><em>ter m</em></span><strong><span><em>is</em></span></strong><span><em>iniz?&#8221;,&#8221;Değişiklik     Var&#8221;,MessageBoxButtons.YesNo,MessageBoxIcon.Exclamation) ==     DialogResult.Yes)<br />
         {<br />
            </em></span><strong><span><em>return</em></span></strong><span><em> </em></span><strong><span><em>true</em></span></strong><span><em>;<br />
         }<br />
         </em></span><strong><span><em>else</em></span></strong><span><em><br />
         <br />
         {<br />
            Degisim     = </em></span><strong><span><em>false</em></span></strong><span><em>;<br />
            </em></span><strong><span><em>return</em></span></strong><span><em> </em></span><strong><span><em>false</em></span></strong><span><em>;<br />
         }<br />
         <br />
      }</em></span></td>
</tr>
</tbody>
</table>
<p><span><br />
   <br />
Yukarıdaki kodda ise tipik bir MessageBox kullanımı görüyorsunuz. Buradaki   metodumuz birde değer döndürüyor.Bir bool değeri döndürüyor. Bu dönen değer   ile biz az sonra kullanıcının çıkan mesaj kutusunda dosyayı kaydetmek isteyip   istemediğini anlayacağız.</span></p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span><em>MessageBox.Show(&#8221;Dosyanızda     bir değişiklik oldu kaydetmek ister misiniz?&#8221;,&#8221;Değişiklik     Var&#8221;,MessageBoxButtons.YesNo,MessageBoxIcon.Exclamation) ==     DialogResult.Yes)</em></span></p>
</td>
</tr>
</tbody>
</table>
<p><span><br />
Bu satırı biraz incelemek lazım. Burada ilk overload (Overload metodlara parantezler   içinde yollanan veri demek.) mesaj kutusunda görünecek olan yazı, ikinicisi   bu mesaj kutusunun başlığı, üçüncüsü mesaj kutusu üzerinde ki “Evet”, “Hayır”   düğmeleri ve son olarak mesaj kutusundaki simge. Ancak kodlara bakmaya devam   ettiğimizde bir karşılaştırma görüyoruz (“==” ifadesi) DialogResult.Yes ,   aslında açıklamaya bile gerek yok. Eğer kullanıcı “Evet”e tıkladı ise demek.   Asıl kodlarda bu durumda bir “true” ifadesi döndürüldüğünü görebilirsiniz.   Biz daha sonra bunu kontrol ederek KayitMekanizmasi metodumuzu çağıracağız.</span></p>
<p>4)   Yeni düğmesi<br />
Menümüzdeki “Yeni” düğmesine tıkladığımızda olacak olayları gireceğiz. Bunun   için bu düğmeye Designer’dan çift tıklayınız.</p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><strong><span><em>private</em></span></strong><span><em> </em></span><strong><span><em>void</em></span></strong><span><em> menuItem2_Click(object sender, System.EventArgs e)<br />
      {<br />
         </em></span><strong><span><em>if</em></span></strong><span><em> (Degisim     == </em></span><strong><span><em>false</em></span></strong><span><em>)<br />
         {<br />
            objText.Clear();<br />
            <br />
         }<br />
         </em></span><strong><span><em>else</em></span></strong><span><em><br />
         {<br />
            </em></span><strong><span><em>if</em></span></strong><span><em> (DegisimUyari())<br />
            {<br />
               KayitMekanizmasi(objText.Text);<br />
               objText.Clear();<br />
               Degisim     = </em></span><strong><span><em>false</em></span></strong><span><em>;<br />
            }<br />
            </em></span><strong><span><em>else</em></span></strong><span><em><br />
            {<br />
               objText.Clear();<br />
               Degisim     = </em></span><strong><span><em>false</em></span></strong><span><em>;<br />
            }<br />
         }<br />
      }</em></span></td>
</tr>
</tbody>
</table>
<p><span><br />
   <br />
Burada önce Degisim değerini kontrol ediyoruz. Eğer değer “false” ise yani   değişim yoksa ya bu dosya önceden kaydedilmiştir ya da yeni açılmıştır. O   zaman içeriğinin temizlenmesinde bir sorun yok.</span></p>
<p>Eğer değer “true” ise biraz karışıyor ortalık. Önce kullanıcıyı uyarmak için   DegisimUyari() çalıştırılıyor. Eğer kullanıcı kayıt etmek istiyorsa,   KayitMekanizmasi() çalıştırılıyor, ekran temizleniyor ve Degisim değeri false   oluyor.Eğer kullanıcı kayıt etmek istemiyorsa içerik temizleniyor ve Degisim   değeri yine false oluyor. Böylece yeni bir dosya açma işlemlerini hallettik.</p>
<p>5)   Varolan dosyayı açma</p>
<p>Metin editörünüz ile daha önce var olan bir dosyayı açmak istersiniz diye   böyle bir özellik ekledik birde. Menümüzde “Aç”a çift tıklayın ve tıklama   olayına aşağıdaki kodları girin.</p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><strong><span><em>private</em></span></strong><span><em> </em></span><strong><span><em>void</em></span></strong><span><em> menuItem3_Click(object sender, System.EventArgs e)<br />
{<br />
</em> </span><strong><span><em>           if</em></span></strong><span><em> (Degisim == </em></span><strong><span><em>true</em></span></strong><span><em>)<br />
         {<br />
            </em></span><strong><span><em>if</em></span></strong><span><em> (DegisimUyari())<br />
            {<br />
               KayitMekanizm</em><strong><em>as</em></strong><em>i(objText.Text);<br />
            }<br />
         }<br />
         </em></span><strong><span><em>if</em></span></strong><span><em> (objOpen.ShowDialog() == DialogResult.OK)<br />
         {<br />
         <br />
            FileInfo     strKaynak = </em></span><strong><span><em>new</em></span></strong><span><em> FileInfo(Environment.GetEnvironmentVariable(&#8221;my</em><strong><em>doc</em></strong><em>uments&#8221;)+objOpen.FileName.ToString());<br />
            StreamReader     Okuyucu = strKaynak.OpenText();<br />
            <br />
            objText.Text     = Okuyucu.ReadToEnd();<br />
            Degisim     = </em></span><strong><span><em>false</em></span></strong><span><em>;<br />
            Okuyucu.Close();<br />
         }<br />
}</em></span></td>
</tr>
</tbody>
</table>
<p> </p>
<p>Bu kodlarda da önce değişim var mı diye bakıyoruz. Yani amacımız kullanıcının   yazdığı metni yanlışlıkla bastığı bir düğme yüzünden kaybetmesini engellemek.   Eğer değişim varsa ve uyarıdan “true” değeri dönerse kaydediyoruz, aksi halde   herhangi bir şey yapmıyoruz.</p>
<p>Bundan sonra yukarıda SaveFileDialog için yaptığımız benzer şeyleri   yapıyoruz. Yani .ShowDialog() metodunu çağırıyoruz. Kullanıcı OK’e tıklayınca   kodlarımız devam ediyor. Ancak burada yukarıdakinden farklı kodlar var. Dosya   okumak için çok farklı yöntemler var. Yazmak içinde tabi ki. Mesela   StreamWriter’ın StreamReader’ı da var ve ben burada bunu kullandım. Eğer   kodları incelerseniz biraz farklı olduğunu göreceksiniz. Çünkü burada   FileInfo diye de bir şey var. FileInfo bu tür dosya işlemcilerine yardımcı   olur. strKaynak değişkenine atadığımız nesnemizde StreamWriter daki gibi path   gösterip dosyamızı açıyoruz. Burada objOpen.FileName’den gelen veri,   kullanıcının açmak istediği dosya.<br />
   <br />
StreamReader nesnesini de oluşturup strKaynak.OpenText() ile metin dosyamızı   açıyoruz. Yalnız burada bir noktaya dikkat çekmek istiyorum. Ben burada   açılacak dosyanın bir .txt dosyası olduğunu bildiğim için .OpenText’i   kullandım. Yoksa başka versiyonları da mevcut. Bu nesneyi de oluşturduktan   sonra objText’e Okuyucu.ReadToEnd ile baştan sonra tüm veriyi okuyup   aktarıyoruz. Değişimden haberimiz olduğunu programa bildirip, nesnelerimizi   kapatıyoruz…</p>
<p>6)   Kaydet düğmesi</p>
<p>Kullanıcı çalışmasını kaydetmek istediği zaman bu düğmeye tıklayabilir. Çok   kısa bir kodu var. Zaten asıl işi yapan KayitMekanizmasi(), biz sadece onu   çağıracağız şimdi.</p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><strong><span><em>private</em></span></strong><span><em> </em></span><strong><span><em>void</em></span></strong><span><em> menuItem4_Click(object sender, System.EventArgs e)<br />
 {<br />
      KayitMekanizmasi(objText.Text);<br />
      Degisim = </em></span><strong><span><em>false</em></span></strong><span><em>;<br />
 }</em></span></td>
</tr>
</tbody>
</table>
<p><span><br />
   Burada açıklanacak bir kod yok. Gördüğünüz gibi …</span></p>
<p>7)   Kapat Düğmesi</p>
<p>Kullanıcı programı kapatmak isteyebilir ve bunun için Dosya menüsündeki Kapat   düğmesini kullanabilir. O zaman bu düğmeye de bir olay atamamız lazım. Şimdi   çift tıklayın ve aşağıdaki kodları yazın.</p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><strong><span><em>private</em></span></strong><span><em> </em></span><strong><span><em>void</em></span></strong><span><em> menuItem6_Click(object sender, System.EventArgs e)<br />
{   <br />
     Close();<br />
}</em></span></td>
</tr>
</tbody>
</table>
<p> </p>
<p>Bu kod çok basit. Sadece Close() metodunu çağırıyor. Bu özel tanımlı bir   metodur ve o form penceresinin kapanmasını sağlar. Şimdi aklınıza gelebilir   ya içeride kaydedilmemiş veri varsa hiç kontrol etmedik. O zaman biraz sabır,   ona da bakacağız…</p>
<p>8)   Kapanmadan önce kontrol<br />
Kullanıcımız programı çok farklı şekillerde kapatabilir. Alt + F4   kombinasyonu, köşedeki X ile kapatabilir ya da Kapat düğmemize tıklar;ancak   az önce de dediğimiz gibi ya içeride veri varsa. O zaman bu veri için bi   kontrol yapmamız lazım. Form’ların “Closing” adında olayları vardır. Bu form   kapatılmadan hemen önce yapılacakları belirler. Biz buna bazı olaylar   atıyoruz şimdi.</p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span>  <em> </em></span><strong><span><em>private</em></span></strong><span><em> </em></span><strong><span><em>void</em></span></strong><span><em> Form1_Closing(object sender, System.ComponentModel.CancelEventArgs     e)<br />
      {<br />
         </em></span><strong><span><em>if</em></span></strong><span><em> (Deg</em></span><strong><span><em>is</em></span></strong><span><em>im == </em></span><strong><span><em>true</em></span></strong><span><em>)<br />
         {<br />
            </em></span><strong><span><em>if</em></span></strong><span><em> (Deg</em></span><strong><span><em>is</em></span></strong><span><em>imUyari())<br />
            {<br />
               KayitMekanizm</em></span><strong><span><em>as</em></span></strong><span><em>i(objText.Text);<br />
               Close();<br />
               <br />
            }<br />
         }<br />
         </em></span><strong><span><em>else</em></span></strong><span><em><br />
         {<br />
            Close();<br />
         }<br />
      }</em></span></td>
</tr>
</tbody>
</table>
<p> </p>
<p>Burada yapılanlardan farklı olan hiç bir şey yok. Degisim değerini kontrol   ediyoruz ve ona göre işlem yapıyoruz..</p>
<p>9)   Son bir metod…</p>
<p>Asıl en önemli şeyi yapmadık sanıyorum. Örneğin kullanıcı programa bir veri   girdiğinde yani herhangi bi yazı yazdığında Degisim değeri değişmedi. O zaman   bunu halledelim. objText’in TextChanged adında bir olayı var. Şimdi o olay   kodları içine aşağıdaki tek satırlık kodu yazıyoruz.</p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span>  <em> </em></span><strong><span><em>private</em></span></strong><span><em> </em></span><strong><span><em>void</em></span></strong><span><em> objText_TextChanged(object sender, System.EventArgs     e)<br />
   {<br />
       Deg</em></span><strong><span><em>is</em></span></strong><span><em>im = </em></span><strong><span><em>true</em></span></strong><span><em>;<br />
   }</em></span></td>
</tr>
</tbody>
</table>
<p><span><br />
Evet, böylece olayın iş yapan kısmı bitti..</span></p>
<p>Ancak menülerimiz arasında hiç ilgilenmediğimiz bir düğme var. Hakkında. Bu   aslında en gereksiz şey belki ama bir programcının en çok önemsediği bölüm   <img src='http://www.yazilimogren.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Bunun için basit bir form yaratınız. Ben aşağıdaki formu oluşturdum ve   adını “hakkinda” yaptım.</p>
<p><img class="alignnone size-full wp-image-2110" title="c-notepad-2" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-notepad-2.jpg" alt="c-notepad-2" width="334" height="206" /></p>
<p><!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" alt=""    style='width:252.75pt;height:158.25pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpg" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpg"     o:href="http://www.csharpnedir.com/Mimages/resim_2.jpg" /> </v:shape><![endif]--></p>
<p>Burada altta iki tane de link var. Biri MaxiASP.Com ‘a biri MaxiASP.Net’e   yönlenmiş durumda. Bunlara tıklandığında tarayıcımızın açılıp sitelere   gitmemizi sağlayacak kodlarda aşağıda.</p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><strong><span><em>private</em></span></strong><span><em> </em></span><strong><span><em>void</em></span></strong><span><em> linkLabel1_LinkClicked(object sender,     System.Windows.Forms.LinkLabelLinkClickedEventArgs e)<br />
{<br />
   System.Diagnostics.Process.Start(&#8221;http://www.maxi</em></span><span><em>as</em></span><span><em>p.com&#8221;);         <br />
}</em></span></p>
<p><strong><span><em>private</em></span></strong><span><em> </em></span><strong><span><em>void</em></span></strong><span><em> linkLabel2_LinkClicked(object sender,     System.Windows.Forms.LinkLabelLinkClickedEventArgs e)<br />
{<br />
   System.Diagnostics.Process.Start(&#8221;http://www.m</em></span><span><em>axiasp</em></span><span><em>.net&#8221;);<br />
         <br />
}</em></span></td>
</tr>
</tbody>
</table>
<p><span><br />
Gerçekten çok uzun bir yazı oldu. Eğer her şey yolunda gitti ise şu an canavar   gibi çalışan bir “Basit Not Defteriniz” var. </span>&lt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yazilimogren.com/2009/04/visual-c-ile-basit-bir-not-defteri-uygulamasi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C#&#8217;da Kaynak Kodunuzu XML ile Süsleyin</title>
		<link>http://www.yazilimogren.com/2009/04/cda-kaynak-kodunuzu-xml-ile-susleyin/</link>
		<comments>http://www.yazilimogren.com/2009/04/cda-kaynak-kodunuzu-xml-ile-susleyin/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 13:06:24 +0000</pubDate>
		<dc:creator>xqm26</dc:creator>
				<category><![CDATA[C# Programlama]]></category>
		<category><![CDATA[Web Programlama]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[C# Sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Resimli Anlatım]]></category>

		<guid isPermaLink="false">http://www.yazilimogren.com/?p=2098</guid>
		<description><![CDATA[Büyük yazılım projelerinde en önemli aktivitelerden birisi proje bazında iyi bir dökümantasyon yapmaktır; proje analiz sürecindeki dökümantasyon genellikle standart olan UML diyagramları ile yapılmaktadır, tabi işin bir de geliştiriciye bakan tarafı vardır. Projenin en nihayi sonu kod yazmak olduğuna göre kodların dökümantasyonu da en az analiz sürecindeki dökümantasyon kadar önemlidir. Bu yazıda .NET ile birlikte [...]]]></description>
			<content:encoded><![CDATA[<p><span><img class="alignleft size-full wp-image-2104" title="c-ders-145" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-ders-145.jpg" alt="c-ders-145" width="150" height="150" />Büyük yazılım projelerinde en önemli aktivitelerden birisi proje bazında iyi bir dökümantasyon yapmaktır; proje analiz sürecindeki <span id="more-2098"></span>dökümantasyon genellikle standart olan UML diyagramları ile yapılmaktadır, tabi işin bir de geliştiriciye bakan tarafı vardır. Projenin en nihayi sonu kod yazmak olduğuna göre kodların dökümantasyonu da en az analiz sürecindeki dökümantasyon kadar önemlidir. Bu yazıda .NET ile birlikte ön plana çıkan XML yorum formatı ile kodlarımızı nasıl dökümante edebileceğimizi inceleyeceğiz.</span></p>
<p>Bildiğiniz gibi kodlarımıza yorum satırı koymamızdaki en büyük amaç kodların başkası tarafından kolaylıkla anlaşılabilir hale gelmesini sağlamaktır. Bazen bu işlemi kendimiz içinde yapmak durumunda kalabiliriz, zira bir çok karmaşık uygulamada yazdığımız kaynak koda yıllar sonra belkide aylar sonra baktığımızda vakt-i zamanında neler düşündüğümüz hemen aklımıza gelmeyebilir. Bu durumda en büyük yardımcımız o zamanlar tembellik etmeden yazdığımız yorum satırları olacaktır. Eğer kendinize yorum satırı ekleme alışkanlığını kazandırırsanız bunun getirisini ileride mutlaka göreceksiniz. Peki ne kadar yorum satırı gereklidir? Bu sorunun cevabı size ve yazdığınız kodların karmaşıklığına göre değişir. Eğer şiir gibi kod yazıyorum diyorsanız belkide bir cümlelik yorum satırı işinizi görebilir, yok arap saçı gibi kod yazıyorum diyorsanız belkide yazdığınız kod satırı sayısından daha fazla yorum yazmak zorunda kalabilirsiniz.</p>
<p>.NET bir çok meselede olduğu gibi yorum ekleme mekanizmasını da estetik bir şekilde çözmüştür. Çok değil daha bir kaç yıl öncesine kadar kaynak kodlarımızdaki yorum satırları // ve /* */karekterleri ile belirtiliyordu. .NET bu eski yorum yazma şeklini desteklemekle birlikte XML formatındaki yorum ekleme mekanizmasıyla ön plana çıkmaktadır. XML sayesinde artık kodlarımızdaki yorumlar standart hale getirilmiştir. Böylece bir XML yorumunda belirli bir etiketi gördüğümüzde o etiketin içindeki açıklamanın neyi ifade ettiğini anlarız. Aynı zamanda VS.NET kodlarımızdaki XML yorumlarını ayrıştırarak saf bir XML dosyası da üretebilmektedir. Bu sayede XML formatındaki yorum dosyasını istediğimiz sistem ile rahatlıkla entegre edebilirz, söz gelimi proje yöneticisine XML dosyasındaki yorum bilgilerini HTML formatında sunabiliriz.<br />
<strong><span><br />
XML Yorum Satırları</span></strong></p>
<p>C#&#8217;ta XML yorum satırları &#8221; /// (3 adet slash karakteri) &#8221; ile başlayan satırlarda yazılır. Önceden belirlenmiş bir takım standart XML etiketleri vardır, öyleki bu etiketler aynı zamanda ECMA tarafından da standart olarak kabul edilmiştir. Ancak XML etiketlerini programcı istediği şekilde şirketin ihtiyaçlarına yada kendi ihtiyaçlarına göre genişletebilir. XML yorum yazmadaki belkide tek kısıt XML sözdizimine uyma şartıdır. XML sözdizimine göre açılan bütün etiketler kapanmalıdır.</p>
<p>En çok kullanılan önceden tanımlı XML etiketleri <strong><em>&lt;param&gt;, &lt;remarks&gt;, &lt;summary&gt; ve &lt;returns&gt;</em></strong> etiketleridir. Bu etiketlerin bazıları intellisense ve &#8220;Object Browser&#8221; programı tarafından kullanılmaktadır. Örneğin VS.NET editöründe bir nesne yaratıldığında nesne türüne ait yapıcı metottaki parametrelerin kısa açıklaması editör penceresinde gösterilir. Aynı şekilde kendi yazdığımız sınıflar içinde bu açıklamaların çıkmasını istiyorsak XML yorum etiketlerini kullanmamız gerekir.</p>
<p>XML yorum etiketleri tür bazında, metot bazında ve parametre bazında olabilir. Tür bazında yorum ekleme işlemi sınıflar, temcilciler, indeksleyiciler, olaylar, numaralandırmalar(enums) ve yapılar(struct) için uygulanabilir. Metot bazındaki yorumlar herhangi bir metodun bildiriminden önce yapılır. Parametre bazındaki yorumlar ise bir metodun parametreleri ve geri dönüş değerleri ile ilgilidir.</p>
<p>Açıklayıcı olması açısından örnek bir sınıf üzerinde XML yorumlarını ve VS.NET gibi akıllı editörlerde bu yorumların ne gibi etkilerinin olduğunu inceleyelim.</p>
<p>Şimdi yeni bir &#8220;Class Library&#8221; projesi açıp aşağıdaki sınıf bildirimini yazın.</p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td><span><em>using</em></span><span><em> System;</em></span><span><em></em></span>  </p>
<p><span><em>namespace</em></span><span><em> XMLYorum<br />
{<br />
      </em></span><span><em>///&lt;summary&gt;</em></span><span><em><br />
      </em></span><span><em>///</em></span><span><em> </em></span><span><em>Cebir sinifi bazi özel matematiksel   islemleri</em></span><span><em><br />
      </em></span><span><em>///</em></span><span><em> </em></span><span><em>yapmak için çesitli statik metotlar   sunar.</em></span><span><em><br />
      </em></span><span><em>///&lt;/summary&gt;</em></span><span><em><br />
      </em></span><span><em>public   class</em></span><span><em> Cebir<br />
      {<br />
            </em></span><span><em>/// &lt;remarks&gt;</em></span><span><em><br />
            </em></span><span><em>///</em></span><span><em> </em></span><span><em>Mutlak Deger Alma Islemi</em></span><span><em><br />
            </em></span><span><em>///&lt;/remarks&gt;</em></span><span><em><br />
            </em></span><span><em>///&lt;summary&gt;</em></span><span><em><br />
            </em></span><span><em>///</em></span><span><em> </em></span><span><em>Parametre olarak gelen sayinin</em></span><span><em><br />
            </em></span><span><em>///</em></span><span><em> </em></span><span><em>Mutlak Degerini alir.</em></span><span><em><br />
            </em></span><span><em>///&lt;/summary&gt;</em></span><span><em><br />
            </em></span><span><em>///&lt;param name=&#8221;Deger&#8221;&gt;</em></span><span><em>Mutlak Degeri alinacak sayi.</em></span><span><em>&lt;/param&gt;</em></span><span><em><br />
            </em></span><span><em>///&lt;returns&gt;</em></span><span><em>Paremetre   olarak gelen sayinin mutlak degeri.</em></span><span><em>&lt;/returns&gt;</em></span><span><em><br />
            </em></span><span><em>public static int</em></span><span><em> MutlakDeger(</em></span><span><em>int</em></span><span><em> Deger)<br />
            {<br />
                 </em></span><span><em> if</em></span><span><em>(Deger &lt;   0)<br />
                        return   -Deger;<br />
                 </em></span><span><em> else </em></span><span><em><br />
                     </em></span><span><em>   return </em></span><span><em>Deger;<br />
            }</em></span><span><em></em></span></p>
<p><span><em>            </em></span><span><em>/// &lt;remarks&gt;</em></span><span><em><br />
            </em></span><span><em>///</em></span><span><em> Kare Alma   Islemi</em></span><span><em><br />
            </em></span><span><em>///&lt;/remarks&gt;</em></span><span><em><br />
            </em></span><span><em>///&lt;summary&gt;</em></span><span><em><br />
            </em></span><span><em>///</em></span><span><em> </em></span><span><em>Parametre olarak gelen sayinin</em></span><span><em><br />
            </em></span><span><em>///</em></span><span><em> </em></span><span><em>karesini almak için kullanilir.</em></span><span><em><br />
            </em></span><span><em>///&lt;/summary&gt;</em></span><span><em><br />
            </em></span><span><em>///&lt;param name=&#8221;Deger&#8221;&gt;</em></span><span><em>Karesi alinacak sayi.</em></span><span><em>&lt;/param&gt;</em></span><span><em><br />
            </em></span><span><em>///&lt;returns&gt;</em></span><span><em>Parametre   olarak gelen sayinin karesi.</em></span><span><em>&lt;/returns&gt;</em></span><span><em><br />
            </em></span><span><em>public static double</em></span><span><em> KareAl(</em></span><span><em>double </em></span><span><em>Deger)<br />
            {<br />
                 </em></span><span><em> return</em></span><span><em> Deger * Deger;<br />
            }<br />
      }<br />
}</em></span></td>
</tr>
</tbody>
</table>
<p><span>Yukarıdaki örnek koddan görüldüğü üzere sınıf ve metot bildirimlerinden önce /// ile başlayan satırlarda XML formatında yorumlar yazılmıştır.VS.NET kod editörü /// karakterinden sonra &lt;summary&gt;, &lt;param name=&#8221;Deger&#8221;&gt; ve &lt;returns&gt; etiketlerini otomatik oluşturdu. &lt;remarks&gt; etiketini ise kendimiz yazmalıyız. XML yorum etiketleri de intellisense özelliklerinden faydalanır. Otomatik tamamlama işlemi etiketler içinde geçerlidir.</span></p>
<p>Yukarıdaki örnekte &lt;remarks&gt; etiketi ile sınıf yada metod ile ilgili kısa bir açıklama yapılır. &lt;summary&gt; etiketi içinde daha ayrıntılı bilgi verilir. Gerekirse çeşitli teknik bilgiler de bu etiket içinde belirtilir.</p>
<p>Şimdi C# derleyicisinin XML formatındaki yorumları kaynak koddan ne şekilde ayırdığını görmek için projeyi derleyelim. Projeyi derlemeden önce eğer VS.NET kulllanıyorsanız Proje özellikleri(Solutin Explorer&#8217;a sağ tıklayarak görebilirsiniz) penceresinden &#8220;Configuration Properties/Build&#8221; sekmesinin altındaki &#8220;XML Documentation File&#8221; kutusuna oluşturulacak XML dosyasının ismini aşağıdaki gibi yazmalısınız. Tabi VS.NET editörünün intellisense özelliklerinden faydalanmak istiyorsak XML dosyasının ismini oluşturulacak DLL ismiyle aynı verilmeliyiz.</p>
<p><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75"  o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:336.75pt;  height:152.25pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg"   o:href="http://www.csharpnedir.com/MImages/xml_comment1.jpg" /> </v:shape><![endif]--><img class="alignnone size-full wp-image-2099" title="c-xml-1" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-xml-1.jpg" alt="c-xml-1" width="424" height="206" /></p>
<p>Eğer VS.NET gibi akıllı bir editörünüz yoksa .NET Framework ile birlikte ücretsiz olarak dağıtılan ve komut satırından çalıştırılabilen C# derleyicisini kullanarak ta XML yorum dosyalarını oluşturabilirsiniz. Bunun için yapmanız gereken csc derleyicisini komut satırından aşağıdaki gibi çalıştırmaktır.<br />
<span><br />
csc  /t:library  <strong>/doc:XmlYorum.xml</strong>   XmlYorum.cs</span></p>
<p>VS.NET yada C# komut satırı ile oluşturulan XML dosyasının yapısı aşağıdaki gibidir.</p>
<p><!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" alt=""  style='width:319.5pt;height:276.75pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpg" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpg"   o:href="http://www.csharpnedir.com/MImages/xml_comment2.jpg" /> </v:shape><![endif]--><img class="alignnone size-full wp-image-2100" title="c-xml-2" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-xml-2.jpg" alt="c-xml-2" width="431" height="370" /></p>
<p>Şimdi birde oluşturduğumuz Cebir isimli bir sınıfa farklı bir projeden referans verip metotlarını kullanalım. Yeni bir Console uygulaması açın ve oluşturduğumuz Cebir sınıfına ait assembly dosyasına referans verin. Eğer komut satırı derleyicisi ile çalışıyorsanız &#8221; /r:Cebir.dll &#8221; parametresini ekleyin. Tabi bu durumda XML yorumlarının etkisini göremeyeceksiniz. Çünkü XML yorumlarını göstermek VS.NET teki akıllı editörün bir yeteneğidir. Notepad&#8217;in yada başka text editörlerinden bu tür imkanlar beklememek lazım!</p>
<p>Cebir sınıfının KareAl() metodunu kullanmak istediğimizde VS.NET&#8217;teki kod editörü bize KareAl() metoduna ilişkin XML formatındaki açıklamayı sarı kutucuk içinde aşağıdaki gibi gösterecektir. Böylece kullanacağımız metodun veya sınıfın bildirimine bakmamıza gerek kalmamıştır.</p>
<p><!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" alt=""  style='width:345.75pt;height:1in'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image003.jpg" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image003.jpg"   o:href="http://www.csharpnedir.com/MImages/xml_comment3.jpg" /> </v:shape><![endif]--><img class="alignnone size-full wp-image-2101" title="c-xml-3" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-xml-3.jpg" alt="c-xml-3" width="459" height="98" /></p>
<p>Aynı durum parametreler içinde geçerlidir. Örneğin KareAl() metodunun çağrım parantezini yazdığımız anda aktif parametre ile ilgili XML açıklaması aşağıdaki gibi gösterilir.</p>
<p><!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" alt=""  style='width:139.5pt;height:56.25pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image004.jpg" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image004.jpg"   o:href="http://www.csharpnedir.com/MImages/xml_comment4.jpg" /> </v:shape><![endif]--><img class="alignnone size-full wp-image-2102" title="c-xml-4" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-xml-4.jpg" alt="c-xml-4" width="185" height="75" /></p>
<p>Aynı XML yorumları VS.NET ile entegre çalışan &#8220;Object Browser&#8221; arayüzü ile de aşağıdaki gibi gösterilmektedir.<br />
<img class="alignnone size-full wp-image-2103" title="c-xml-5" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-xml-5.jpg" alt="c-xml-5" width="385" height="196" /></p>
<p><span>Not : &#8220;Object Browser&#8221; penceresine erişmek için (Ctrl + Alt + J) tuş kombinasyonunu kullanabilirsiniz.</span></p>
<p><strong><span>Diğer XML Yorum Etiketleri</span></strong></p>
<p>XML yorum etiketleri yukarıda anlatılanlar ile sınırlı değildir. Aşağıda kullanılabilecek standart etiketler alfabetik sıraya göre toplu bir şekilde tablo halinde açıklamalarıyla birlikte verilmiştir.</p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="95%">
<tbody>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;c&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>Açıklama içindeki bir bölümün   &#8220;kod fontu&#8221; şeklinde olduğunu vurgulmak için kullanılır.</span></p>
<p>Örnek :<br />
<span><br />
/// &lt;summary&gt;<br />
///</span><span> Bu sınıf</span><span> </span><span>&lt;c&gt;</span><span>Stream</span><span>&lt;/c&gt;</span><span> sınıfından türemiştir. </span><span><br />
/// &lt;/summary&gt; </span><span><br />
</span><span>public class</span><span> YeniSınıf<br />
{<br />
    &#8230;<br />
} </span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;code&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>XML açıklaması içinde uzun bir kod   bloğu örneği verilecekse diğer yazılardan ayırmak için kod bloğu bu etiket   arasında yazılır.</span></p>
<p>Örnek :<br />
<span><br />
/// &lt;summary&gt;<br />
///</span><span> </span><span>Bu metod iki Kompleks türeden sayıyı toplar. Örneğin</span><span><br />
</span><span>/// &lt;code&gt;</span><span><br />
</span><span>///</span><span> </span><span>Kompleks sayi1 = new Kompleks(5,6);</span><span><br />
</span><span>///</span><span> </span><span>Kompleks sayi2 = new Kompleks(0,1);</span><span><br />
</span><span>///</span><span><br />
</span><span>///</span><span> </span><span>Kompleks sayi3 = sayi1 + sayi2;</span><span><br />
</span><span>/// &lt;/code&gt;<br />
/// &lt;/summary&gt; </span><span><br />
</span><span>public </span><span>Kompleks </span><span>operator+</span><span>(Kompleks sayi1, Kompleks sayi2)<br />
{<br />
    &#8230;<br />
} </span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;example&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>Bir metodun yada sınıfın ne şekilde   kullanılacağını açıklayan blok bu etiket içinde yazılır. &lt;code&gt;   etiketinin kullanımı ile hemen hemen eşdeğerdedir. &lt;code&gt; etiketini   verilen örneğin aynısı &lt;example&gt; etiketi içinde geçerli olduğu ayrıca   bir örnek vermeye gerek yoktur.</span></p>
</td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;excepiton&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>Bir metodun fırlatabileceği   istisnai durumlarla ilgili bilgi vermek için kullanılır. &lt;exception&gt;   etiketi &#8220;cref&#8221; niteliği ile birlikte kullanılır. &#8220;cref&#8221;   niteliği ile fırlatılacak istisnai durum(exception) sınfının türü belirtilir.</span></p>
<p>Örnek :</p>
<p><span>/// &lt;summary&gt;<br />
///</span><span> </span><span>Bu metod iki Kompleks türeden sayıyı toplar. Örneğin</span><span><br />
/// &lt;/summary&gt; </span><span><br />
</span><span>///</span><span><br />
</span><span>/// &lt;exception   cref=&#8221;IndexOutOfRange&#8221;&gt;</span><span><br />
</span><span>/// &lt;/exception&gt;</span><span><br />
</span><span>/// &lt;exception   cref=&#8221;OzelIstisnaiDurum&#8221;&gt;</span><span><br />
</span><span>/// &lt;/exception&gt;</span><span><br />
</span><span>public </span><span>Kompleks </span><span>operator+</span><span>(Kompleks sayi1, Kompleks sayi2)<br />
{<br />
    &#8230;<br />
} </span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;list&gt;</span></strong></p>
</td>
<td width="87%" valign="top"><span>HTML kodlarındaki &lt;li&gt;   etiketine benzer bir amacı vardır. Liste şeklinde bir yapı oluşması gerektiği   bildirilir. &lt;listheader&gt; listedeki başlık bilgisini, &lt;item&gt;   listedeki her elemanı, &lt;term&gt; her elemandaki terimi ve &lt;description&gt;   bu eleman hakkındaki detaylı bilgiyi bildirir.  </p>
<p>Örnek :</p>
<p><span>///</span><span> </span><span>&lt;remarks&gt;</span><span>Bu bir liste örneğidir.</span><span><br />
</span><span>///</span><span><br />
</span><span>///</span><span> </span><strong><span>&lt;list   type=&#8221;number&#8221;&gt;</span></strong><span><br />
</span><span>///</span><span><br />
</span><span>/// &lt;listheader&gt;<br />
///     &lt;item&gt;<br />
///         &lt;term&gt;</span><span>term 1</span><span>&lt;/term&gt;<br />
///         &lt;description&gt;</span><span>Açıklama 1</span><span>&lt;/description&gt;<br />
///     &lt;/item&gt;<br />
/// &lt;/listheader&gt; </span><span><br />
</span><span>///</span><span><br />
</span><span>/// &lt;item&gt;<br />
///     &lt;term&gt;</span><span>term   2</span><span>&lt;/term&gt;<br />
///     &lt;description&gt;</span><span>Açıklama 2</span><span>&lt;/description&gt;<br />
/// &lt;/item&gt; </span><span><br />
</span><span>///</span><span><br />
</span><span>/// &lt;item&gt;<br />
///     &lt;term&gt;</span><span>term   3</span><span>&lt;/term&gt;<br />
///     &lt;description&gt;</span><span>Açıklama 3</span><span>&lt;/description&gt;<br />
/// &lt;/item&gt; </span><span><br />
</span><span>///</span><span><br />
</span><span>/// <strong>&lt;/list&gt;</strong><br />
///</span><span> </span><span>&lt;/remarks&gt;</span><span><br />
</span><span>public class</span><span> YeniSınıf<br />
{<br />
    &#8230;<br />
}</span></p>
<p>Not : Liste tipi<strong><span>(&lt;list   type=&#8221;number&#8221;&gt;</span></strong><span>)   &#8220;number&#8221; olabileceği gibi &#8220;bullet&#8221; ve &#8220;table&#8221;   da olabilir.</span></p>
<p> </p>
<p></span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;para&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>&lt;summary&gt; gibi uzun açıklama   bloklarında bir paragrafı belirtmek için kullanılır.</span></p>
<p>Örnek :</p>
<p><span>/// &lt;summary&gt;<br />
///</span><span> Bu sınıf</span><span> </span><span>Stream sınıfından türemiştir. </span><span><br />
///</span><span> </span><span>&lt;para&gt;<br />
///</span><span> Bu sınıf aynı zamanda IDisposable   arayüzünü uygulamıştır.</span><span><br />
</span><span>///</span><span> </span><span>&lt;/para&gt;<br />
/// &lt;/summary&gt; </span><span><br />
</span><span>public class</span><span> YeniSınıf<br />
{<br />
    &#8230;<br />
} </span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;param&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>Bir metodun parametreleri ile   ilgili bilgi vermek için kullanılır.</span></p>
<p>Örnek :</p>
<p><span>///&lt;param   name=&#8221;Sayi1&#8243;&gt;</span><span>Toplanacak   birinci sayı</span><span>&lt;/param&gt;</span><span><br />
</span><span>///&lt;param   name=&#8221;Sayi2&#8243;&gt;</span><span>Toplanacak   ikinci sayı</span><span>&lt;/param&gt;</span><span><br />
</span><span>public static double</span><span> Topla(</span><span>int</span><span> Sayi1, </span><span>int</span><span> Sayi2)<br />
{<br />
    </span><span> return</span><span> Sayi1 + Sayi2;<br />
} </span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;paramref&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>&lt;paramref&gt; etiketleri   içerisine alınan yerde aslında metodun ilgili parametresinin olduğu   bildirilir. Böylece oluşacak XML yorum dosyasınıdaki bu etiketi farklı bir   biçimde yorumlama şansına sahip oluruz.</span></p>
<p>Örnek :</p>
<p><span>/// &lt;summary&gt;<br />
///</span><span> Bu sınıfın </span><span>&lt;paramref name=&#8221;Sayi1&#8243;/&gt;</span><span> , ve </span><span><br />
///</span><span> </span><span>&lt;paramref name=&#8221;Sayi2&#8243;/&gt;</span><span> ve biçiminde iki parametresi vardır.</span><span><br />
/// &lt;/summary&gt; </span><span><br />
</span><span>public static double</span><span> Topla(</span><span>int</span><span> Sayi1, </span><span>int</span><span> Sayi2)<br />
{<br />
    </span><span> return</span><span> Sayi1 + Sayi2;<br />
} </span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;permission&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>Üye elemanla ilgili güvenlik   bilgisi vermektedir. Örneğin bir metoda yada sınıfa kimlerin erişeceği ve ne   şekilde erişeceği bu etiket kullanılarak belirtilebilir.</span></p>
<p>Örnek :</p>
<p><span>///&lt;permission   cref=&#8221;Private&#8221;&gt;</span><span>Herkes bu   metoda erişebilir.</span><span><br />
</span><span>///&lt;/permission&gt;</span><span><br />
</span><span>public static double</span><span> Topla(</span><span>int</span><span> Sayi1, </span><span>int</span><span> Sayi2)<br />
{<br />
    </span><span> return</span><span> Sayi1 + Sayi2;<br />
} </span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;remarks&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>Bir tür hakkında kısa bir açıklama   vermek için kullanılır.</span></p>
<p>Örnek :</p>
<p><span>///&lt;remarks&gt;</span><span><br />
</span><span>///</span><span> </span><span>Özel cebirsel işlemleri tanımlar. </span><span><br />
</span><span>///&lt;/remarks&gt;</span><span><br />
</span><span>public class</span><span> Cebir<br />
{<br />
   &#8230;.<br />
} </span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;returns&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>Bir metodun geri dönüş değeri   ilgili bilgi vermek için kullanılır.</span></p>
<p>Örnek :</p>
<p><span>/// &lt;remarks&gt;</span><span><br />
</span><span>///</span><span> Kare Alma Islemi</span><span><br />
</span><span>///&lt;/remarks&gt;</span><span><br />
</span><span>///&lt;summary&gt;</span><span><br />
</span><span>///</span><span> </span><span>Parametre olarak gelen sayinin</span><span><br />
</span><span>///</span><span> </span><span>karesini almak için kullanilir.</span><span><br />
</span><span>///&lt;/summary&gt;</span><span><br />
</span><span>///&lt;param   name=&#8221;Deger&#8221;&gt;</span><span>Karesi   alinacak sayi.</span><span>&lt;/param&gt;</span><span><br />
</span><span>///&lt;returns&gt;</span><span>Parametre olarak gelen sayinin karesi.</span><span>&lt;/returns&gt;</span><span><br />
</span><span>public static double</span><span> KareAl(</span><span>double </span><span>Deger)<br />
{<br />
     </span><span> return</span><span> Deger * Deger;<br />
} </span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;see&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>Yazı içinde bir bağlantının(link)   olacağını belirtir. &#8220;cref&#8221; niteliği ile birlikte kullanılır.   &#8220;cref&#8221; niteliği bağlantının olacağı üye elemanı simgeler.</span></p>
<p>Örnek :</p>
<p><span>/// &lt;summary&gt;<br />
///</span><span> </span><span>Bu metod iki Kompleks türeden sayıyı toplar. Örneğin</span><span><br />
/// &lt;/summary&gt; </span><span><br />
</span><span>///</span><span><br />
</span><span>/// &lt;see   cref=&#8221;KompleksAlgoritmalar&#8221;/&gt;</span><span><br />
</span><span>public </span><span>Kompleks </span><span>operator+</span><span>(Kompleks sayi1, Kompleks sayi2)<br />
{<br />
    &#8230;<br />
} </span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;seealso&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>Yazı içinde ilgili elemanla   yakından ilişkili olan diğer elemanlara bağlantı vermek için kullanılır.   Kullanımı &lt;see&gt; etiketi ile aynıdır.</span></p>
<p>Örnek :</p>
<p><span>/// &lt;summary&gt;<br />
///</span><span> </span><span>Bu metod iki Kompleks türeden sayıyı toplar. Örneğin</span><span><br />
/// &lt;/summary&gt; </span><span><br />
</span><span>///</span><span><br />
</span><span>/// &lt;seealso   cref=&#8221;operator-&#8221;/&gt;</span><span><br />
</span><span>/// &lt;seealso   cref=&#8221;operator/&#8221;/&gt;</span><span><br />
</span><span>/// &lt;seealso   cref=&#8221;operator*&#8221;/&gt;</span><span><br />
</span><span>public </span><span>Kompleks </span><span>operator+</span><span>(Kompleks sayi1, Kompleks sayi2)<br />
{<br />
    &#8230;<br />
} </span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;summary&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>Üye elemanla ilgili geniş açıklama   yazmak için kullanılan bir etikettir.</span></p>
<p>Örnek :</p>
<p><span>///&lt;summary&gt;</span><span><br />
</span><span>///</span><span> </span><span>Cebir sinifi bazi özel matematiksel   islemleri</span><span><br />
</span><span>///</span><span> </span><span>yapmak için çesitli statik metotlar   sunar.</span><span><br />
</span><span>///&lt;/summary&gt;</span><span><br />
</span><span>public class</span><span> Cebir<br />
{<br />
   &#8230;<br />
} </span></td>
</tr>
<tr>
<td width="13%" valign="top">
<p class="MsoNormal"><strong><span>&lt;value&gt;</span></strong></p>
</td>
<td width="87%" valign="top">
<p class="MsoNormal"><span>Sınıfın bir üye elemanı olan   özellikler (Property) hakkında bilgi vermek için kullanılır.</span></p>
<p>Örnek :</p>
<p><span>///&lt;value&gt;</span><span><br />
</span><span>///</span><span> </span><span>Kontrolün rengini belirtir.</span><span><br />
</span><span>///&lt;/value&gt;</span><span><br />
</span><span>public int </span><span>Renk<br />
{<br />
    </span><span>get</span><span> { </span><span>return</span><span> a;}<br />
    </span><span>set</span><span> { a = </span><span>value</span><span>;}<br />
} </span></td>
</tr>
</tbody>
</table>
<p><span>Kodlarınızı XML yorumları ile süslemiyi unutmayın !&#8230;</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yazilimogren.com/2009/04/cda-kaynak-kodunuzu-xml-ile-susleyin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual C# ile Windows Kontrolü Hazırlama</title>
		<link>http://www.yazilimogren.com/2009/04/visual-c-ile-windows-kontrolu-hazirlama/</link>
		<comments>http://www.yazilimogren.com/2009/04/visual-c-ile-windows-kontrolu-hazirlama/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 12:58:59 +0000</pubDate>
		<dc:creator>xqm26</dc:creator>
				<category><![CDATA[C# Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[C# Sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Resimli Anlatım]]></category>

		<guid isPermaLink="false">http://www.yazilimogren.com/?p=2084</guid>
		<description><![CDATA[Simdi sizlere Visual C# NET’te  bir Windows Control nasıl  yapılır ve bu Windows Control’ü programlarımızda nasıl kullanırız onu göstereceğiz. Göstereceğim örneği çok basit seçtim, bunun nedeni de yaratıcılığı siz arkadaslarıma  bırakmayı uygun görmemdir. Şimdi örneğimizi adım adım inceleyelim.
 
                I.  Visual Studio .NET’te yeni bir proje açalım ve Windows Control Library’yi seçelim ve adını değiştirelim(Ben burada NewControls [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><span lang="EN-US"><img class="alignleft size-full wp-image-2094" title="c-ders-144" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-ders-144.jpg" alt="c-ders-144" width="150" height="150" />Simdi sizlere Visual C# NET’te  bir Windows Control nasıl  yapılır ve bu Windows Control’ü programlarımızda nasıl kullanırız onu göstereceğiz. <span id="more-2084"></span>Göstereceğim örneği çok basit seçtim, bunun nedeni de yaratıcılığı siz arkadaslarıma  bırakmayı uygun görmemdir. Şimdi örneğimizi adım adım inceleyelim.</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">                I.</span><span lang="EN-US">  </span><span lang="EN-US">Visual Studio .NET’te yeni bir proje açalım ve Windows Control Library’yi seçelim ve adını değiştirelim(Ben burada NewControls adını verdim siz istediğiniz adı verebilirsiniz.)</span></p>
<p class="MsoNormal"><span lang="EN-US"> <img class="alignnone size-full wp-image-2093" title="c-visual-11" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-visual-11.jpg" alt="c-visual-11" width="500" height="349" /></span></p>
<p class="MsoNormal"><span><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600"  o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"  stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:398.25pt;  height:278.25pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image001.gif" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image001.gif"   o:href="http://www.csharpnedir.com/Mimages/windows_kontrol_acilis.gif" /> </v:shape><![endif]--></span></p>
<p class="MsoNormal" align="center"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">             II.</span><span lang="EN-US"> </span><span lang="EN-US">Daha sonra Anlamlı bir isim olması için UserControl1’in adını MyTextBox olarak değiştirelim.</span></p>
<p class="MsoNormal"><span> <img class="alignnone size-full wp-image-2086" title="c-visual-2" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-visual-2.jpg" alt="c-visual-2" width="500" height="516" /></span></p>
<p class="MsoNormal"><span lang="EN-US"><!--[if gte vml 1]><v:shape id="_x0000_i1026"  type="#_x0000_t75" alt="" style='width:400.5pt;height:416.25pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image002.gif" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image002.gif"   o:href="http://www.csharpnedir.com/Mimages/windows_kontrol_iki.gif" /> </v:shape><![endif]--> </span></p>
<p class="MsoNormal" align="center"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">           III.</span><span lang="EN-US"> </span><span lang="EN-US">Bu değişiklikleri yaptıktan sonra MyTextBox’ın üzerine bir TextBox yerleştirelim ve onun adını da değiştirelim. Ben burada adını myTBox olarak değiştirdim.</span></p>
<p class="MsoNormal"><span> <img class="alignnone size-full wp-image-2087" title="c-visual-3" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-visual-3.jpg" alt="c-visual-3" width="500" height="543" /></span></p>
<p class="MsoNormal"><span><!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75"  alt="" style='width:378pt;height:414pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image003.gif" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image003.gif"   o:href="http://www.csharpnedir.com/Mimages/windows_kontrol_üc.gif" /> </v:shape><![endif]--></span></p>
<p class="MsoNormal" align="center"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">          IV.</span><span lang="EN-US"> </span><span lang="EN-US">Evet şimdi MyTextBox’ın kodunu açalım ve bir TextBox’ın yapması gerektiğini düşündüğümüz özellikleri de eklemek için istediğimiz metodu buraya yazalım. Burada örnek olarak myTBox üzerindeki  bilgi</span><span>n</span><span lang="EN-US">i</span><span>n</span><span lang="EN-US"> integer olup olmadığını control eden bir metod yazalım ve metodun dönüş değeri eğer integer değilse 0 (sıfır) olsun. Eğer dön</span><span>üş değeri 1 olursa </span><span lang="EN-US">integer olsun.</span></p>
<p class="MsoNormal"><span> <img class="alignnone size-full wp-image-2088" title="c-visual-4" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-visual-4.jpg" alt="c-visual-4" width="500" height="409" /></span></p>
<p class="MsoNormal"><span><!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75"  alt="" style='width:429.75pt;height:344.25pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image004.gif" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image004.gif"   o:href="http://www.csharpnedir.com/Mimages/windows_kontrol_dort.gif" /> </v:shape><![endif]--></span></p>
<p class="MsoNormal" align="center"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">             V.</span><span lang="EN-US"> </span><span lang="EN-US">Kod yazımını tamamladıktan sonra derleyin, eğer derlemek yerine direk çalıştırırsanız(run) asagıdaki uyarıyı alırsınız(Kısaca verdiği uyarı : &#8220;Bu Windows Control tek basına çalışamaz. Bunu baska projelerde kullanmalısınız.&#8221;) Ama sorun değil çünkü yaptıgımız Windows control’ü zaten diğer projelerde  kullanmak üzere tasarladık.</span></p>
<p class="MsoNormal"><span lang="EN-US"><img class="alignnone size-full wp-image-2089" title="c-visual-5" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-visual-5.jpg" alt="c-visual-5" width="500" height="128" /> </span></p>
<p class="MsoNormal"><span><!--[if gte vml 1]><v:shape  id="_x0000_i1029" type="#_x0000_t75" alt="" style='width:471.75pt;height:119.25pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image005.gif" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image005.gif"   o:href="http://www.csharpnedir.com/Mimages/windows_kontrol_bes.gif" /> </v:shape><![endif]--></span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">Şimdi sorabilirsiniz bu Windows Control’ü projelerimizde nasıl kullanacağız? Yine adım adım anlatalım.</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">             I.</span><span lang="EN-US">  </span><span lang="EN-US">Yeni bir proje açın veya önceden var olan bir projeyi açın. Ben burada Deneme adında yeni bir proje açtım.</span></p>
<p class="MsoNormal"><span lang="EN-US">           II.</span><span lang="EN-US">  </span><span lang="EN-US">Daha sonra .Net’in Ana Proje Penceresindeki MenuBar’dan <strong>Tools</strong>’I tıklayın açılan menuItem’lardan <strong>Add/Remove ToolBoxItems’ı</strong> tıklayın.</span></p>
<p class="MsoNormal" style="text-align: left;"><span lang="EN-US"><img class="alignnone size-full wp-image-2090" title="c-visual-6" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-visual-6.jpg" alt="c-visual-6" width="500" height="404" /> </span></p>
<p class="MsoNormal"><span><!--[if gte vml 1]><v:shape id="_x0000_i1030" type="#_x0000_t75"  alt="" style='width:435pt;height:329.25pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image006.gif" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image006.gif"   o:href="http://www.csharpnedir.com/Mimages/windows_kontrol_alti.gif" /> </v:shape><![endif]--></span></p>
<p class="MsoNormal" align="center"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">                     III.</span><span lang="EN-US">  </span><span lang="EN-US">Daha sonra açılan pencereden <strong>.NET Framework Components</strong>’in seçili olmasına dikkat edin. Eğer seçili değilse onu seçin. Ve Browse diyerek daha önce kaydetmiş oldugumuz NewControls projesinin içine girilelim oradan bin’e oradan da Debug’ın içine girelim. Daha sonra karşımıza çıkan <strong>NewControls.dll</strong> adlı dosyayı seçip OK tuşuna basalım. Daha sonra tekrar <strong>NET Framework Components</strong>’in seçili oldugu pencerede OK tuşuna basalım.</span></p>
<p class="MsoNormal"><span lang="EN-US"><img class="alignnone size-full wp-image-2091" title="c-visual-7" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-visual-7.jpg" alt="c-visual-7" width="500" height="355" /> </span></p>
<p class="MsoNormal"><span><!--[if gte vml 1]><v:shape id="_x0000_i1031" type="#_x0000_t75"  alt="" style='width:428.25pt;height:302.25pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image007.gif" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image007.gif"   o:href="http://www.csharpnedir.com/Mimages/windows_kontrol_yedi.gif" /> </v:shape><![endif]--></span></p>
<p class="MsoNormal" align="center"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">                    IV.</span><span lang="EN-US"> </span><span lang="EN-US">Şimdi ToolBox’a bakalım. İste karşımızda <strong>MyTextBox</strong>’ımızın yazılı olduğu bir ToolBox’ımız oldu. Artık <strong>MyTextBox</strong>’ımızı diğer <strong>Tool</strong>’ları kullandığımız gibi kullanabiliriz.</span></p>
<p class="MsoNormal"><span><img class="alignnone size-full wp-image-2092" title="c-visual-8" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-visual-8.jpg" alt="c-visual-8" width="395" height="719" /> </span></p>
<p class="MsoNormal"><span><!--[if gte vml 1]><v:shape id="_x0000_i1032" type="#_x0000_t75"  alt="" style='width:294.75pt;height:540pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image008.gif" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image008.gif"   o:href="http://www.csharpnedir.com/Mimages/windows_kontrol_sekiz.gif" /> </v:shape><![endif]--></span></p>
<p class="MsoNormal" align="center"><span lang="EN-US"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yazilimogren.com/2009/04/visual-c-ile-windows-kontrolu-hazirlama/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C#’ta Inheritance(Miras) Kavramı</title>
		<link>http://www.yazilimogren.com/2009/04/c%e2%80%99ta-inheritancemiras-kavrami/</link>
		<comments>http://www.yazilimogren.com/2009/04/c%e2%80%99ta-inheritancemiras-kavrami/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 12:46:50 +0000</pubDate>
		<dc:creator>xqm26</dc:creator>
				<category><![CDATA[C# Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[C# Sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false">http://www.yazilimogren.com/?p=2081</guid>
		<description><![CDATA[Bu yazıda inheritance’ın   programlamada ne anlama geldiğinden bahsedeceğim. Inheritance aslında Oject   Oriented Programming in (Nesne Yönelimli Programlama) üç prensibinden bir   tanesidir. Diğer iki prensip ise encapsulation ve polymorphism’dir. Tabii ki   diğer iki prensibe bu yazıda değinmeyeceğim. En sade şekliyle: inheritance   sayesinde bir sınıfın metodlarını kullanan başka [...]]]></description>
			<content:encoded><![CDATA[<p><span><img class="alignleft size-full wp-image-2082" title="c-ders-143" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-ders-143.jpg" alt="c-ders-143" width="150" height="150" />Bu yazıda inheritance’ın   programlamada ne anlama geldiğinden bahsedeceğim. Inheritance aslında Oject   Oriented Programming in<span id="more-2081"></span> (Nesne Yönelimli Programlama) üç prensibinden bir   tanesidir. Diğer iki prensip ise encapsulation ve polymorphism’dir. Tabii ki   diğer iki prensibe bu yazıda değinmeyeceğim. En sade şekliyle: inheritance   sayesinde bir sınıfın metodlarını kullanan başka sınıflar türetilebilmesine   yarar diyebiliriz. Ancak ayrıntılarına birazdan ineceğim. Eğer daha önce   nesne tabanlı bir programlama dili kullandıysanız, (Java ve C++ gibi) C#’ta   inheritance’a çok çabuk adapte olursunuz. Aslında şu ana kadar bahsettiklerim   genel kültürden ibaretti ve eminim çoğunuz da bunları biliyordunuz. (Nesne   Tabanlı Programlama geçmişi olmayanları da düşünerek böyle bir giriş yaptım.)</span></p>
<p><span>Evet şimdi ana kısma yani programın   nasıl yazılacağına geliyoruz. Bunun için basit bir örnek vereceğim. Düşünün   ki student adında bir sınıfımız(class) olsun. Ayrıca bir de teacher adında   bir sınıfıımız olsun. Bunların ortak özellikleri nedir? Tabii ki insan   olmaları diyeceksiniz ve ana sınıfımıza yani person sınıfına ulaşmış   olacaksınız. Şimdi basitçe özetlersek person sınıf’ından teacher ve student   adında iki sınıf türetmiş olduk. Sırada bunun kodunu nasıl yazacağımız var.   Alışkanlıklara devam edip adım adım kodu yazalım. (Bunu program yazarken de   ilke edinirseniz faydalı olacağına inanıyorum. Önce ne yapacağınızı adım adım   belirleyin sonra belirlediklerinizi adım adım uygulamaya geçirin.)</span></p>
<p class="MsoNormal"><strong><span>I.</span></strong><span>            </span><strong><span>İlk önce person sınıfını yazalım. </span></strong></p>
<p class="MsoNormal"><span>  </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span><em>using</em></span><span><em> System;</em></span></p>
<p class="MsoNormal"><span><em>using</em></span><span><em> System.Windows.Forms;</em></span></p>
<p class="MsoNormal"><span><em>namespace</em></span><span><em> Miras</em></span></p>
<p class="MsoNormal"><span><em>{</em></span></p>
<p class="MsoNormal"><span><em>     public</em></span><span><em> </em></span><span><em>abstract</em></span><span><em> </em></span><span><em>class</em></span><span><em> Person </em></span></p>
<p class="MsoNormal"><span><em>     //sınıfın     sadece türetileceğini </em></span><span><em><br />
</em> </span><span><em>     //belirtmek     için sınıfı abstaract keyword’ünü kullanarak soyutladık</em></span><span><em><br />
</em> </span><span><em>     </em></span><span><em>//Ancak     burada abstaract keyword’ünün kullanılmasındaki temel </em></span></p>
<p class="MsoNormal"><span><em>     </em></span><span><em>//faktör     bu sınıfın abstract metod içermesidir.</em></span></p>
<p class="MsoNormal"><span><em>         {</em></span></p>
<p class="MsoNormal"><span><em>    </em></span><span><em>//Türetilen     sınıflarda kullanılmak üzere 3 tane değişken tanımladık. </em></span></p>
<p class="MsoNormal"><span><em>            </em></span><span><em>protected</em></span><span><em> </em></span><span><em>string</em></span><span><em> Name;</em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>protected</em></span><span><em> </em></span><span><em>int</em></span><span><em> Age;</em></span></p>
<p class="MsoNormal"><span><em>            </em></span><span><em>protected</em></span><span><em> </em></span><span><em>string</em></span><span><em> Gender;</em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>//Türetilen     sınıflarda metodun içi doldurulması için</em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>//abstract     olarak makeAction metodu tanımladık</em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>public</em></span><span><em> </em></span><span><em>abstract</em></span><span><em> </em></span><span><em>void</em></span><span><em> makeAction();</em></span></p>
<p class="MsoNormal"><span><em>                  </em></span></p>
<p class="MsoNormal"><span><em>            </em></span><span><em>public</em></span><span><em> Person()</em></span></p>
<p class="MsoNormal"><span><em>            {</em></span></p>
<p class="MsoNormal"><span><em>            }</em></span></p>
<p class="MsoNormal"><span><em>     }</em></span><span><em><br />
</em> </span><span><em>}</em></span><span> </span></td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span>  </span></p>
<p class="MsoNormal"><span>        </span></p>
<p class="MsoNormal"><strong><span>II.</span></strong><span>            </span><strong><span>Şimdi de Student sınıfını yazalım. </span></strong></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span><em>using</em></span><span><em> System;</em></span></p>
<p class="MsoNormal"><span><em>using</em></span><span><em> System.Windows.Forms;</em></span></p>
<p class="MsoNormal"><span><em>namespace</em></span><span><em> Miras</em></span></p>
<p class="MsoNormal"><span><em>{</em></span></p>
<p class="MsoNormal"><span><em>    </em></span><span><em>//Student     class&#8217;ı Person class&#8217;ından miras aldığını belirtiyoruz.</em></span></p>
<p class="MsoNormal"><span><em>    </em></span><span><em>public</em></span><span><em> </em></span><span><em>class</em></span><span><em> Student:Person </em></span></p>
<p class="MsoNormal"><span><em>    {</em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>//Person     sınıfında tanımlanan abstract metodu override ederek</em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>//metodun     içini istediğimiz gibi doldurduk.</em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>public</em></span><span><em> </em></span><span><em>override</em></span><span><em> </em></span><span><em>void</em></span><span><em> makeAction()</em></span></p>
<p class="MsoNormal"><span><em>        {</em></span></p>
<p class="MsoNormal"><span><em>            MessageBox.Show(&#8221;Ben     bir öğrenciyim&#8221;);</em></span></p>
<p class="MsoNormal"><span><em>        }</em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>public</em></span><span><em> Student(</em></span><span><em>string</em></span><span><em> name,</em></span><span><em>int</em></span><span><em> age,</em></span><span><em>string</em></span><span><em> gender)</em></span></p>
<p class="MsoNormal"><span><em>        {</em></span></p>
<p class="MsoNormal"><span><em>            </em></span><span><em>this</em></span><span><em>.Name=name;</em></span></p>
<p class="MsoNormal"><span><em>            </em></span><span><em>this</em></span><span><em>.Age =     age;</em></span></p>
<p class="MsoNormal"><span><em>            </em></span><span><em>this</em></span><span><em>.Gender=gender; </em></span></p>
<p class="MsoNormal"><span><em>        }</em></span></p>
<p class="MsoNormal"><span><em>    }</em></span></p>
<p class="MsoNormal"><span><em>}</em></span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><strong><span>III.</span></strong><span>            </span><strong><span>Sıra Teacher sınıfını yazmaya geldi. </span></strong></p>
<p class="MsoNormal"><span>  </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span><em>using</em></span><span><em> System;</em></span></p>
<p class="MsoNormal"><span><em>using</em></span><span><em> System.Windows.Forms;</em></span></p>
<p class="MsoNormal"><span><em>namespace</em></span><span><em> Miras</em></span></p>
<p class="MsoNormal"><span><em>{</em></span></p>
<p class="MsoNormal"><span><em>    </em></span><span><em>public</em></span><span><em> </em></span><span><em>class</em></span><span><em> Teacher:Person </em></span><span><em>//Teacher class&#8217;ı Person class&#8217;ından </em></span></p>
<p class="MsoNormal"><span><em>    </em></span><span><em>// miras     alıyor</em></span></p>
<p class="MsoNormal"><span><em>    {</em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>private</em></span><span><em> </em></span><span><em>string</em></span><span><em> Unvan; </em></span><span><em>//Teacher     sınıfında kullanılmak üzere</em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>//Unvan     adında bir değişken tanımladık.</em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>//Person     sınıfında tanımlanan abstract metodu override ederek</em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>//metodun     içini istediğimiz gibi doldurduk.</em></span></p>
<p class="MsoNormal"><span><em> </em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>public</em></span><span><em> </em></span><span><em>override</em></span><span><em> </em></span><span><em>void</em></span><span><em> makeAction()</em></span></p>
<p class="MsoNormal"><span><em>        {</em></span></p>
<p class="MsoNormal"><span><em>            MessageBox.Show(&#8221;Ben     bir öğretmenim&#8221;);</em></span></p>
<p class="MsoNormal"><span><em>        }</em></span></p>
<p class="MsoNormal"><span><em> </em></span></p>
<p class="MsoNormal"><span><em>        </em></span><span><em>public</em></span><span><em> Teacher(</em></span><span><em>string</em></span><span><em> name,</em></span><span><em>int</em></span><span><em> age,</em></span><span><em>string</em></span><span><em> gender,</em></span><span><em>string</em></span><span><em> unvan)</em></span></p>
<p class="MsoNormal"><span><em>        {</em></span></p>
<p class="MsoNormal"><span><em>            </em></span><span><em>this</em></span><span><em>.Name=name;</em></span></p>
<p class="MsoNormal"><span><em>            </em></span><span><em>this</em></span><span><em>.Age =     age;</em></span></p>
<p class="MsoNormal"><span><em>            </em></span><span><em>this</em></span><span><em>.Gender=gender;</em></span></p>
<p class="MsoNormal"><span><em>            </em></span><span><em>this</em></span><span><em>.Unvan=unvan;</em></span></p>
<p class="MsoNormal"><span><em>        }</em></span></p>
<p class="MsoNormal"><span><em>    }</em></span><span><em>// teacher     sınıfının sonu</em></span></p>
<p class="MsoNormal"><span><em>  </em></span></p>
<p class="MsoNormal"><span><em>}</em></span><span><em>// Miras     isim uzayının sonu</em></span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span> </span></p>
<p><span>Şimdi dikkat edilmesi gereken   noktaları sıralayalım:</span></p>
<p class="MsoNormal"><span>         </span><span>I.</span><span>            </span><span>Abstaract (soyut) sınıftan yeni bir sınıf türetilemez.   Örneğimizde person sınıfı abstract sınıftır ve new anahtar sözcüğü   kullanılarak yeni nesne oluşturulmaz. </span></p>
<p class="MsoNormal"><span>        </span><span>II.</span><span>         </span><span>Abstract metodların </span><span>mutlaka</span><span> içleri boş olarak yaratılır ve türetildikleri sınıflarda (en az bir sınıf   türetilmek zorunda) </span><span>mutlaka</span><span> içleri override anahtar sözcüğü kullanılarak      doldurulur. </span></p>
<p class="MsoNormal"><span>      </span><span>III.</span><span>            </span><span>Bir sınıftan miras yolu ile başka bir sınıf türetileceği zaman   temel sınıf(base class) illa ki abstract anahtar sözcüğü ile tanımlanmak   zorunda değildir. (Eğer abstract metod     içermiyorsa.) </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yazilimogren.com/2009/04/c%e2%80%99ta-inheritancemiras-kavrami/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# &#8216;ta Kapsülleme, Erişim Belirteçleri ve Polymorphism</title>
		<link>http://www.yazilimogren.com/2009/04/c-ta-kapsulleme-erisim-belirtecleri-ve-polymorphism/</link>
		<comments>http://www.yazilimogren.com/2009/04/c-ta-kapsulleme-erisim-belirtecleri-ve-polymorphism/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 12:44:20 +0000</pubDate>
		<dc:creator>xqm26</dc:creator>
				<category><![CDATA[C# Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[C# Sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false">http://www.yazilimogren.com/?p=2078</guid>
		<description><![CDATA[Türkçe karşılığına gelirsek kapsülleme demek. Ancak bilgisayar terimi olarak biraz açarsak kapsülleme, yönettiği kod ve veriyi birbirine bağlayan ve bu ikisini dış kaynaklı karıştırma ve yanlış kullanımdan koruyan bir mekanızmadır. Bu sayede veriyi dış ortamdan koruyan bir ambalaj vazifesi gördüğünü de söyleyebiliriz. Şimdi kapsüllemeyi biliyoruz da C#&#8217;ta yada .Net Framework&#8217;ünde ne gibi farklılıklar var diyeceksiniz? [...]]]></description>
			<content:encoded><![CDATA[<p><span><img class="alignleft size-full wp-image-2079" title="c-ders-142" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-ders-142.jpg" alt="c-ders-142" width="150" height="150" />Türkçe karşılığına gelirsek kapsülleme demek. Ancak bilgisayar terimi olarak biraz açarsak kapsülleme, yönettiği kod ve veriyi birbirine <span id="more-2078"></span>bağlayan ve bu ikisini dış kaynaklı karıştırma ve yanlış kullanımdan koruyan bir mekanızmadır. Bu sayede veriyi dış ortamdan koruyan bir ambalaj vazifesi gördüğünü de söyleyebiliriz. Şimdi kapsüllemeyi biliyoruz da C#&#8217;ta yada .Net Framework&#8217;ünde ne gibi farklılıklar var diyeceksiniz? Öncelikle .Net Framework&#8217;ünde gelen yeniliklerden bahsedelim.</span></p>
<p><span>I. Erişim belirteçlerinin(Access Modifiers) varlığı kapsüllemeyi çok daha rahat yapabilmemize olanak sağlar. Bu sayede bir metod veya bir değişken anahtar sözcükler(keywords) aracılığıyla sadece önceden belirlenen sınırlar dahilinde kullanılabilir. Yada bunlara belirlenen sınırlar içinden ulaşılabilir. Burada bahsedilen keyword&#8217;leri birazdan açıklayacağım. (Tabii ki C#&#8217;ta kullanılan keywordleri açıklayacağım. Ve kullanımlarını basitçe anlatacağım.) </span></p>
<p><span>II. Özellik(Property) Sahalarının kullanımı (Bunun yapımını ilerde C# kodu ile göstereceğim.) Bu sayede .Net Framework kapsüllemeyi destekler.</span></p>
<p><span>III. Soyut sınıf(abstract class) ve soyut metodların(abstract methods) kullanımı. Aslında kalıtım(inheritance) konusunu anlatırken taban sınıfımız(base class) soyut sınıf idi. Onun için bu kısmı sadece açıklayacağım. Örnek vermeyeceğim. Örneği görmek isteyenler miras(inheritance) konusunu anlattığım yazıdaki örneği incelerlerse istedikleri bilgiye ulaşabilirler. </span></p>
<p><span>Evet bu kadarlık giriş yeter. Şimdi yukarıda anlattığım 3 maddeyi enine boyuna tartışalım.</span></p>
<p><span>I. Erişim belirteçlerinin ne işe yaradıklarından yukarıda bahsettiğim için burada direkt erişim belirteçlerinin neler olduklarını yazalım ve erişim sınırlarını çizelim. Erişim sınırları geniş olandan dar olana doğru bir sıralama yaparsak.</span></p>
<ul type="disc">
<li class="MsoNormal"><span>public: Bütün her yerden erişilmek istenen veriler public anahtar      sözcüğü ile birlikte kullanılır. Sadece aynı proje içerisinden değil diğer      projeler içerisinden de erişilebilir. </span></li>
<li class="MsoNormal"><span>internal: Aynı assembly içindeki tüm sınıflar erişebilir. Yani      public anahtar sözcüğünün sadece aynı proje içinden erişilebileni. (VB      .Net&#8217;te ise Friend anahtar sözcüğüne karşılık gelir.) </span></li>
<li class="MsoNormal"><span>protected: Protected anahtar sözcüğü ile birlikte kullanılan      verilere ise sadece bir alt sınıfa kadar erişilebilir. </span></li>
<li class="MsoNormal"><span>private: Bu ise sadece tanımlandığı sınıfta geçerli olan veriler      için kullanılır. </span></li>
</ul>
<p><span>Ancak kontrollerde(controller) yaygın olan kullanım şekli kontrollerin dışarıdan erişilmesi istenen metodlarının(aynı anda diyelim ki 3 tane kontrol&#8217;ün belli metodlarının çalışması gerekli olabilir.) public anahtar sözcüğü kullanılan bir metod içinde tanımlanmasıdır. Şimdi bu durumun nasıl yapıldığını gösteren mini bir örnek kod yazalım. Kodda belirtilen kontrollerin daha önceden tanımlanmış olduğunu düşünelim.</span></p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span><em>public void ChangeColor(Color color)<br />
{<br />
    this.groupBoxLine.BackColor = color;<br />
    this.groupBoxOutCity.BackColor = color;<br />
    this.groupBoxExternalPriceDetails.BackColor = color;<br />
    this.groupBoxInternalPriceDetails.BackColor = color;<br />
    this.groupBoxUser.BackColor = color;<br />
    this.groupBox1.BackColor = color;<br />
    this.btnAddNewLine.BackColor = color;<br />
    this.btnAddNewUser.BackColor = color;<br />
    this.btnCentralReport.BackColor = color;<br />
    this.btnChangePassword.BackColor = color;<br />
    this.btnDeleteExternalLine.BackColor = color;<br />
    this.btnDeleteInternalLine.BackColor = color;<br />
    this.btnDeleteUser.BackColor = color;<br />
    this.btnExit.BackColor = color;<br />
}</em></span></td>
</tr>
</tbody>
</table>
<p><span> </span></p>
<p><span>Yukarıdaki metod bir renk parametresi gönderilerek çağrıldığı zaman yukarıda yazan bütün (daha öncede private anahtar sözcüğü ile tanımlanmış olduklarını kabul etmiştik.) kontrollerin rengini gönderilen renge değiştirmeye yarıyor. Bu sayede yukarıdaki kontrollerin hepsinin BackColor dışındaki metodları dış dünyadan soyutlanmış oluyor.</span></p>
<p><span>Aslında yaptığımız metod public anahtar sözcüğü ile tanımlanmayıp internal anahtar sözcüğü ile de tanımlanabilir. Bu bizim metodun içindeki kontrollere ait BackColor metodlarının dış dünyadan ne kadar soyutlanmasını istediğimiza bağlıdır.</span></p>
<p><span>II. Özellik sahaları sınıflara ait özel(private) değişkenlerin aynı metodlar gibi dış dünyaya açılmalarını sağlıyor. Sadece okuma amaçlı dışa açılım yapılabildiği gibi hem okuma-hem yazma amaçlı bir açılım da yapılabilir. Teorik olarak sadece yazma amaçlı da bir açılım olsa da ne kadar mantıklı olur bilmem!!!! Şimdi örneklerimize geçelim.</span></p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span>  </span></p>
<p><span><em>private   int currentExNumber = -1;<br />
private int loginStatus = 0;</em></span></p>
<p><span><em>public   int CurrentExNumber //Sadece okuma amaçlı özellik<br />
{<br />
    get<br />
    {<br />
        return currentExNumber;<br />
    }<br />
}</em></span></p>
<p><span><em>public   int LoginStatus //Hem okuma hem yazma amaçlı özellik<br />
{<br />
    get<br />
    {<br />
        return loginStatus;<br />
    }<br />
    set<br />
    {<br />
        loginStatus = value;<br />
    }<br />
}</em></span></td>
</tr>
</tbody>
</table>
<p><span>Şimdi yukarıdaki özellikleri kullanırken nesneadi.LoginStatus ve nesneadi.CurrentExNumber şeklinde kullanabiliriz. Yalnız dikkat etmemiz gereken CurrentExNumber kullanılacağı zaman sadece eşit işaretinin(=) sol tarafında kullanılabilecek olması. Çünkü başta da belirttiğimiz gibi sadece okuma yapabildiğimiz için get metodu var. Zaten bir değer atamaya kalkarsak hata verecektir.(Derleme esnasında özelliğin sadece okuma amaçlı olduğuna dair debug penceresinden mesaj verir.) Bu sayede de değiştirilmesini istemediğimiz ama kullanmak zorunda olduğumuz verilerin dış ortamdan hem soyutlanmasına hem de bunların dış ortama belirli izinler dahilinde açılımına izin vermiş olduk.</span></p>
<p><span>III. Aslında soyut sınıf ve soyut metod&#8217;dan daha önce az da olsa miras konusunu anlatırken bahsetmiştim. Ancak şimdi biraz polymorphism&#8217;den bahsederek bu kavramları biraz daha açacağım. Polymorphism kapsülleme ve miras&#8217;dan ayrı düşünülemez. Polymorphism Yunancada &#8220;çok formluluk&#8221; anlamına gelmektedir. Polymorphism ile soyut sınıf arasındaki ilşkiden bahsetmeden önce soyut sınıf ve soyut metodlarla ilgili bir iki ayrıntı daha verelim. Soyut sınıf sadece taban sınıflarında kullanılır ve yeni nesne yaratılmasında kesinlikle kullanılamaz. (Yani new anahtar sözcüğü kullanılamaz.) </span></p>
<p><span>Soyut metodlara gelince bunların ise soyut sınıflarda kullanılacağından bahsetmiştik. Bunun bize sağladığı avantaj bu metodların türetilen sınıflarda nasıl gerçekleştirildiğini bilmek zorunda olmamamızdır. Aslında bunu söyleyerek polymorphism&#8217;in yararından bahsetmiş olduk. Yani polymorphism veri soyutlaması yaparak sadece ilgilenmemiz gereken olaylar ve verilerle ilgilenmemize olanak sağlıyor. Bu sayede taban sınıfından türetilen ve aynı metodu farklı gerçekleştirimlerle(implementation) kullanan birden fazla sınıfa sahip olabiliyoruz. En basit örnek üçgen bir çokgen, kare de bir çokgen ve her ikisinin de bir alanı mevcut. Hemen basitçe bir taslak çıkarırsak çokgen sınıfı soyut taban sınıfı ve alan adında soyut bir metoda sahip. Üçgen ve kare sınıfları ise türetilen sınıflar ve alan metodunu istedikleri biçimde gerçekleştiriyorlar. (Bu işlemlerin nasıl yapıldığı miras konusunu anlattığım yazıda mevcuttur.) </span></p>
<p><span>Bir de soyut özellikler(abstract property) var. Bunların kullanımı ise soyut metodlar ile özelliklerin birlikte kullanımı ile ortaya çıkmakta. Buna bir örnek kod verirsem anlaşılması daha kolay olacaktır. Ancak bunların kullanımına çok sık rastlamadığımı belirtmem gerekir.</span></p>
<p><span>Sanırım aşağıdaki örnek kod parçası soyut özelliklerin kullanımını daha da netleştirmiştir.</span></p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td><span><em>abstract class Taban // Soyut sınıf<br />
{<br />
</em> </span><span><em>    </em></span><span><em>protected int CurrentExNumber = -1;</em><em><br />
</em></p>
<p><span><em>    </em></span><span><em>public abstract int GetCurrentExNumber// Soyut özellik<br />
</em> </span><span><em>    </em></span><span><em>{<br />
</em> </span><span><em>        </em></span><span><em>get;<br />
</em> </span><span><em>    </em></span><span><em>}<br />
}</em></span></p>
<p><span><em>class Turet: Taban //Turet adlı bir   sınıf türetiliyor<br />
{</em></span></p>
<p><span><em>    </em></span><span><em>public override int GetCurrentExNumber// overriding   property<br />
</em> </span><span><em>    </em></span><span><em>{<br />
</em> </span><span><em>        </em></span><span><em>get<br />
</em> </span><span><em>        </em></span><span><em>{<br />
</em> </span><span><em>            </em></span><span><em>return CurrentExNumber+1;<br />
</em> </span><span><em>        </em></span><span><em>}<br />
</em> </span><span><em>    </em></span><span><em>}<br />
}</em></span></p>
<p></span></td>
</tr>
</tbody>
</table>
<p><span>Polymorphism&#8217;den bahsettik. Şimdi ise yalancı polymorphism&#8217;den bahsedelim. Aslında bir örnekle biraz daha açarsam daha net olur. Diyelim ki bir karşılaştırma metodunuz var ve hem integer hem de string veri tiplerini karşılaştırmak istiyorsunuz. Yalancı polymorphism sayesinde aynı isimde iki metod yazarak bu isteğinizi gerçekleştirebilirsiniz. Bunun için mini bir örnek kod yazalım isterseniz.</span></p>
<p><span>Aşağıda yazacağım metodların aynı sınıf içinde yazıldığını düşünelim. Şimdi bu metodları kullanırken metodların içinde yer aldığı sınıftan üretilen nesneninadi.karsilastir( yazdığımız anda kod tamamlayıcısı bize iki seçenek sunar biri bu metodun iki tane integer veri tipi ile çalıştığı, ikincisi ise bu metodun iki tane string veri tipi ile çalıştığıdır. Bu sayede bir arabirim ile birden fazla metod gerçekleştirilmiş olur. </span></p>
<p><span>Aslında bir metodun birden fazla gerçekleştirime sahip olması olayına overloading denir. </span></p>
<p><span>Dikkat edilmesi gereken nokta overloading ile overriding&#8217;in birbirine karıştırılmamasıdır. Unutmayın overloading&#8217;te bütün işlemler aynı sınıf içerisinde oluyor. Overriding&#8217;te ise tek bir sınıf yerine taban sınıfı ile bu sınıftan türetilen sınıflar işin içine giriyor.</span></p>
<p><span><em>public void karsilastir(int sayi1, int sayi2)<br />
{<br />
    //Metodun iç implementasyonunu sizlere bıraktım.<br />
}</em></span></p>
<p><em>public void karsilastir(string data1, string data2)<br />
{<br />
    Metodun iç implementasyonunu sizlere bıraktım.<br />
}</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yazilimogren.com/2009/04/c-ta-kapsulleme-erisim-belirtecleri-ve-polymorphism/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# &#8216;da MD5 ile Veri Şifreleme</title>
		<link>http://www.yazilimogren.com/2009/04/c-da-md5-ile-veri-sifreleme/</link>
		<comments>http://www.yazilimogren.com/2009/04/c-da-md5-ile-veri-sifreleme/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 12:39:30 +0000</pubDate>
		<dc:creator>xqm26</dc:creator>
				<category><![CDATA[C# Programlama]]></category>
		<category><![CDATA[Web Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[C# Sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.yazilimogren.com/?p=2075</guid>
		<description><![CDATA[Bu makalemizde herhangi bir string ifadenin nasıl MD5 ile şifreleneceğini öğreneceğiz. Bu sırada web.config, Panel Nesnesi, Stored Procedure gibi konulara da değineceğiz.
Aşağıda verdiğim örnek, çoğu zaman kullandığımız Kayıt Formu ile Login Formundan oluşuyor. Kayıt olurken, email adresi ve parola bilgileri soruluyor. Bunun sonrasında parola bilgisi MD5 algoritması ile şifrelenip veritabanına veriler yazılıyor.
Login Formumuzda ise, aynı [...]]]></description>
			<content:encoded><![CDATA[<p><span><img class="alignleft size-full wp-image-2076" title="c-ders-141" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-ders-141.jpg" alt="c-ders-141" width="150" height="150" />Bu makalemizde herhangi bir string ifadenin nasıl MD5 ile şifreleneceğini öğreneceğiz. Bu sırada web.config, Panel Nesnesi, <span id="more-2075"></span>Stored Procedure gibi konulara da değineceğiz.</span></p>
<p>Aşağıda verdiğim örnek, çoğu zaman kullandığımız Kayıt Formu ile Login Formundan oluşuyor. Kayıt olurken, email adresi ve parola bilgileri soruluyor. Bunun sonrasında parola bilgisi MD5 algoritması ile şifrelenip veritabanına veriler yazılıyor.</p>
<p>Login Formumuzda ise, aynı veriler istenerek, yine parolamız MD5 algoritması ile veritabanına gönderiliyor. Yani SQL&#8217;deki &#8220;Select&#8221; cümlesi aracılığı ile kontrolümüzü yapıyoruz.</p>
<p>Örneğimize geçmeden önce örneğimiz içerisinde kullandığımız Panel nesnemizin bazı özelliklerini inceleyelim.</p>
<p>Height = Panelimizin yüksekliği (pixel cinsinden)<br />
Width = Panelimizin genişliği (pixel cinsinden)<br />
BackColor = Panelimizin arkafon rengi<br />
BackImageUrl = Panelimizin arkasında resim göstermek istiyorsak<br />
BorderColor = Panelimizin sınır çizgisinin rengi<br />
BorderWidth = Panelimizin sınır çizgisinin genişliği (pixel cinsinden)<br />
Font = Panelimizin içerisinde gösterilecek metinlerin Font adı<br />
Visible = Panelimizin görüntülenme ayarı (true/false değerleri alır)</p>
<p>Şimdi de veritabanına bağlanmak amaçlı kullandığımız bağlantı satırımızı nasıl kullandığımıza bakalım.</p>
<p>Klasik ASP içerisinde veritabanına bağlanmak istediğimizde bunu çoğu zaman asp dosyamızın içerisine yazıyorduk. Veya başka bir sayfaya yazıp, onu kullanacağımız sayfaya dahil ediyorduk. Hatırlarsanız bu yönteme &#8220;Include File&#8221; yöntemi deniyordu. Bu durum güvenlik açısından birçok açık ortaya çıkartmak ile beraber, yetersiz de kalıyordu.</p>
<p>.Net&#8217;te ise bu sıkıntılar atlatıldı. Şimdi projemiz ile ilgili birçok veriyi saklayabileceğimiz, güvenli bir dosyaya kavuştuk. İşte bu dosyanın adı web.config</p>
<p>Web.config dosyasının ayrıntılarını burada işleyemeyeceğim. Sadece veritabanı bağlantı satırımızı nasıl web.config sayfamıza yazmamız gerektiğini ve aspx dosyamızdan nasıl çağırıldığını göstereceğim.</p>
<p>Örneğin <strong><em>web.config</em></strong> dosyamızın içeriği:</p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre><span><em> </em></span></pre>
<pre><span><em>&lt;configuration&gt;</em></span></pre>
<pre><span><span><em>    </em></span><em>&lt;appSettings&gt;</em></span></pre>
<pre><span><span><em>        </em></span><em>&lt;add key="strConn" value="server=localhost;uid=dtuser;pwd=dtpass;database=dotnet" /&gt;</em></span></pre>
<pre><span><span><em>    </em></span><em>&lt;/appSettings&gt;</em></span></pre>
<pre><span><em>&lt;/configuration&gt;</em></span></pre>
</td>
</tr>
</tbody>
</table>
<p><span><br />
Gelelim aspx dosyamızdan nasıl çağırabileceğimize:</span></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span><em>string dbConnStr = ConfigurationSettings.AppSettings["strConn"]; </em></span></p>
</td>
</tr>
</tbody>
</table>
<p><span><br />
Sanırım artık konumuza dönebiliriz. İlgili tüm açıklamaları kod satırları arasında anlatmağa çalıştım. Ayrıca CodeBehind yönetimi kullanarak kodladım. Bu yöntemden de kısaca bahsetmek gerekirse, CodeBehind yöntemi ile kodumuz ile görselliğimizi tamamen ayırıyoruz. Böylelikle tasarım değişikliği gibi durumlarda hiçbir sıkıntı çekmiyoruz. Örneği incelediğinizde durumu da farkedeceksiniz.</span></p>
<p>Fakat öncelikle, veritabanamızın yapısını, stored procedure ve web.config dosyamızın ilgili kodlarını verelim.</p>
<p><strong><span style="text-decoration: underline;"><span>Tablomuz:</span></span></strong></p>
<p><strong><em>registerUser</em></strong></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre><em>user_id int (IDENTITY)
</em></pre>
<pre><span><em>user_email varchar 255</em></span></pre>
<pre><span><em>user_password binary 16</em></span></pre>
</td>
</tr>
</tbody>
</table>
<p><span><br />
<strong><span style="text-decoration: underline;"><span>Stored Procedure:</span></span></strong></span></p>
<p><strong><em>sp_ins_regUser</em></strong></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre><span> <em>CREATE PROCEDURE sp_ins_regUser </em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><em>@user_email varchar(255),</em></span></pre>
<pre><span><em>@user_password binary(16)</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><em>AS</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><em>INSERT INTO</em></span></pre>
<pre><span><span><em>            </em></span><em>registerUser</em></span></pre>
<pre><span><span><em>            </em></span><em>(user_email, user_password)</em></span></pre>
<pre><span><em>VALUES</em></span></pre>
<pre><span><span><em>            </em></span><em>(@user_email, @user_password)</em></span></pre>
<pre><span><em>GO</em></span></pre>
</td>
</tr>
</tbody>
</table>
<p><span><br />
<strong><em>sp_sel_loginCheck</em></strong> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre><em>CREATE PROCEDURE sp_sel_loginCheck
</em></pre>
<pre><span><em> </em></span></pre>
<pre><span><em>@uemail varchar(255),</em></span></pre>
<pre><span><em>@upwd binary(16)</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><em>AS</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><em>SELECT</em></span></pre>
<pre><span><span><em>            </em></span><em>user_id</em></span></pre>
<pre><span><em>FROM</em></span></pre>
<pre><span><span><em>            </em></span><em>registerUser</em></span></pre>
<pre><span><em>WHERE</em></span></pre>
<pre><span><span><em>            </em></span><em>user_email = @uemail AND</em></span></pre>
<pre><span><span><em>            </em></span><em>user_password = @upwd</em></span></pre>
<pre><span><em>GO</em></span></pre>
</td>
</tr>
</tbody>
</table>
<p><span><br />
<strong><em>Web.config</em></strong> </span></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre><span><em> &lt;configuration&gt;</em></span></pre>
<pre><span><span><em>    </em></span><em>&lt;appSettings&gt;</em></span></pre>
<pre><span><span><em>        </em></span><em>&lt;add key="strConn" value="server=localhost;uid=dtuser;pwd=dtpass;database=dotnet" /&gt;</em></span></pre>
<pre><span><span><em>    </em></span><em>&lt;/appSettings&gt;</em></span></pre>
<pre><span><em>&lt;/configuration&gt;</em></span></pre>
</td>
</tr>
</tbody>
</table>
<p>İlk önce görsel arayüzümün bulunduğu, kişinin kayıt olduğu sayfa olan:</p>
<p><strong><em>register.aspx</em></strong></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre><em>&lt;%@ Page Language="c#" Inherits="registerForm.regForm" Src="register.aspx.cs"%&gt;
</em></pre>
<pre><span><em>&lt;html&gt;</em></span></pre>
<pre><span><em>&lt;body&gt;</em></span></pre>
<pre><span><em>&lt;asp:Panel id="register" runat="server"&gt;</em></span></pre>
<pre><span><span><em>        </em></span></span><span><em>&lt;form id="regForm" method="post" runat="server"&gt;</em></span></pre>
<pre><span><span><em>        </em></span></span><span><em>&lt;table cellspacing="0" cellpadding="3" border="0"&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;tr&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;td colspan="2"&gt;Kayıt Formu&lt;/td&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;/tr&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;tr&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;td&gt;&lt;b&gt;E-posta Adresiniz&lt;/b&gt;&lt;/td&gt;</em></span></pre>
<pre><span><span><em>                        </em></span></span><span><em>&lt;td&gt;&lt;asp:TextBox id="emailAdr" runat="server" MaxLength="255"&gt;&lt;/asp:TextBox&gt;</em></span><span><em>&lt;/td&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;/tr&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;tr&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;td&gt;&lt;b&gt;Parolanız&lt;/b&gt;&lt;/td&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;td&gt;</em></span><span><em>&lt;asp:TextBox runat="server" MaxLength="10" id="parola" TextMode="Password"&gt;&lt;/asp:TextBox&gt;</em></span><span><em>&lt;/td&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;/tr&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;tr&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;td align="right" colspan=</em></span><span><em>"2"&gt;&lt;asp:Button id="btnOk" OnClick="doRegister" runat="server" text="Formu Gönder"/&gt;</em></span><span><em>&lt;/td&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;/tr&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;/table&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;/form&gt;</em></span></pre>
<pre><span><em>&lt;/asp:Panel&gt;</em></span></pre>
<pre><span><em>&lt;asp:Panel id="registerStatus" runat="server"&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;asp:Label id="lblInfo" runat="server"&gt;&lt;/asp:Label&gt;</em></span></pre>
<pre><span><em>&lt;/asp:Panel&gt;</em></span></pre>
<pre><span><em>&lt;/body&gt;</em></span></pre>
<pre><span><em>&lt;/html&gt;</em></span></pre>
</td>
</tr>
</tbody>
</table>
<p>Bu sayfanın kodlarını işleyen:</p>
<p><strong><em>register.aspx.cs</em></strong></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre><span><em> using System;</em></span></pre>
<pre><span><em>using System.IO;</em></span></pre>
<pre><span><em>using System.Web.UI; </em></span><span><em>//web textbox larına ulaşabilmemiz için gereken class</em></span></pre>
<pre><span><em>using System.Security.Cryptography; </em></span><span><em>//md5 için gerekli class</em></span></pre>
<pre><span><em>using System.Text; </em></span><span><em>//UTF fonksiyonu için gerekli class</em></span></pre>
<pre><span><em>using System.Data; </em></span><span><em>//veritabanı işlemleri için gerekli class</em></span></pre>
<pre><span><em>using System.Data.SqlClient; </em></span><span><em>//veritabanı işlemleri için gerekli class</em></span></pre>
<pre><span><em>using System.Configuration; </em></span><span><em>//web.config dosyamızdan veri okuyabilmek amaçlı class</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><em>namespace registerForm</em></span></pre>
<pre><span><em>{</em></span></pre>
<pre><span><span><em>            </em></span><em>public class regForm : System.Web.UI.Page</em></span></pre>
<pre><span><span><em>            </em></span><em>{</em></span></pre>
<pre><span><span><em>                        </em></span></span><span><em>//kodlamada kullanacağımız nesnelerimizi tanımlıyoruz.</em></span></pre>
<pre><span><span><em>                        </em></span><em>protected System.Web.UI.WebControls.TextBox emailAdr;</em></span></pre>
<pre><span><span><em>                        </em></span><em>protected System.Web.UI.WebControls.TextBox parola;</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                        </em></span><em>protected System.Web.UI.WebControls.Panel register;</em></span></pre>
<pre><span><span><em>                        </em></span><em>protected System.Web.UI.WebControls.Panel registerStatus;</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                        </em></span><em>protected System.Web.UI.WebControls.Label lblInfo;</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                        </em></span><em>public void Page_Load(Object Src, EventArgs E)</em></span></pre>
<pre><span><span><em>                        </em></span><em>{</em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//sayfa yüklendiğinde panellerimizin görüntülenme ayarlarını yapıyoruz.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>//form ekranı ilk olarak görüntülenecek.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>register.Visible = true;</em></span></pre>
<pre><span><span><em>                        </em></span><span><em>            </em></span><em>registerStatus.Visible = false;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>lblInfo.Text = "";</em></span></pre>
<pre><span><span><em>                        </em></span><em>}</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                        </em></span></span><span><em>//Formu Gönder butonuna tıklandığında çalışan fonksiyonumuz</em></span></pre>
<pre><span><span><em>                        </em></span><em>protected void doRegister(object sender, System.EventArgs e)</em></span></pre>
<pre><span><span><em>                        </em></span><em>{</em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//girilen verileri alıyoruz.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>string txtEmailAdr = emailAdr.Text;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>string txtParola = parola.Text;</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//işlem sonucu göstermek amaçlı ikinci panelimizi görünür kılıyoruz.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>register.Visible = false;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>registerStatus.Visible = true;</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                                     </em></span><em>try</em></span></pre>
<pre><span><span><em>                                     </em></span><em>{</em></span></pre>
<pre><span><span><em>                                                 </em></span></span><span><em>//parolanız şifrelenmesi için fonksiyona gönderiyoruz.</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>//şifrelenmiş verimiz byte haline geleceği için değişkenimizi </em></span></pre>
<pre><span><span><em>                                                 </em></span><em>//byte olarak tanımlıyoruz.</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>byte[] encyrptedPassword = md5Password(txtParola);</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                                                 </em></span></span><span><em>//veritabanına Email adresini ve şifrelenmiş Parolayı kayıt ediyoruz.</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["strConn"]); </em></span></pre>
<pre><span><span><em>                                                 </em></span><em>conn.Open();</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>SqlCommand sc = new SqlCommand ();</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>sc.Connection = conn;</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>sc.CommandType = CommandType.StoredProcedure;</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>sc.CommandText = "sp_ins_regUser"; </em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                                                 </em></span><em>sc.Parameters.Add("@user_email", SqlDbType.VarChar, 255, "user_email"); </em></span></pre>
<pre><span><span><em>                                                 </em></span><em>sc.Parameters["@user_email"].Value = txtEmailAdr; </em></span></pre>
<pre><span><span><em>                                                 </em></span><em>sc.Parameters.Add("@user_password", SqlDbType.Binary, 16, "user_password"); </em></span></pre>
<pre><span><span><em>                                                 </em></span><em>sc.Parameters["@user_password"].Value = encyrptedPassword;</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                                                 </em></span><em>sc.ExecuteNonQuery();</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>conn.Close();</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                                                 </em></span></span><span><em>//try-catch bloğuna soktuğumuz işlemimizde bir sorun çıkmadı ise</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>//ziyaretçimizi bilgilendiriyoruz.</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>lblInfo.Text = "Kayıt işleminiz başarı ile gerçekleştirilmiştir";</em></span></pre>
<pre><span><span><em>                                     </em></span><em>}</em></span></pre>
<pre><span><span><em>                                     </em></span><em>catch</em></span></pre>
<pre><span><span><em>                                     </em></span><em>{</em></span></pre>
<pre><span><span><em>                                                 </em></span></span><span><em>//veritabanında bir hata oluştuysa ziyaretçimizi bilgilendiriyoruz.</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>lblInfo.Text = "Kayıt işleminiz sırasında bir hata oluştu. Lütfen tekrar deneyiniz.";</em></span></pre>
<pre><span><span><em>                                     </em></span><em>}</em></span></pre>
<pre><span><span><em>                        </em></span><em>}</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                        </em></span><em>byte[] md5Password(string pass)</em></span></pre>
<pre><span><span><em>                        </em></span><em>{</em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//md5 şifrelenmesi için verimizin byte haline gelmesi gerekli.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>//veri 8-bit şeklinde dönüştürülmesi için ilk önce UTF fonksiyonuna gönderiliyor.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>UTF8Encoding encoder = new UTF8Encoding();</em></span></pre>
<pre><span><span><em>                                     </em></span><em>//md5 şifrelemesi için nesnemizi oluşturuyoruz.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>MD5 md5 = new MD5CryptoServiceProvider();</em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//verimizi md5 ile çalıştırıyoruz.</em></span></pre>
<pre><span><span><em>                       </em></span></span><span><em>//dikkat ederseniz UTF fonksiyonundan dönen değeri GetBytes ile alabildik.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>byte[] donenDeger = md5.ComputeHash(encoder.GetBytes(pass));</em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//şifrelenmiş değerimizi geri gönderiyoruz.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>return donenDeger;</em></span></pre>
<pre><span><span><em>                        </em></span><em>}</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>            </em></span><em>}</em></span></pre>
<pre><span><em>}</em></span></pre>
</td>
</tr>
</tbody>
</table>
<p>Kullanıcı adı, parola verilerinin girildiği görsel sayfa olan:</p>
<p><strong><em>login.aspx</em></strong></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre><span> </span></pre>
<pre><span><em>&lt;%@ Page Language="c#" Inherits="loginForm.Login" Src="login.aspx.cs"%&gt;</em></span></pre>
<pre><span><em>&lt;html&gt;</em></span></pre>
<pre><span><em>&lt;body&gt;</em></span></pre>
<pre><span><em>&lt;asp:Panel id="loginStatus" runat="server"&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;asp:Label id="lblInfo" runat="server"&gt;&lt;/asp:Label&gt;</em></span></pre>
<pre><span><em>&lt;/asp:Panel&gt;</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><em>&lt;asp:Panel id="pnlLogin" runat="server"&gt;</em></span></pre>
<pre><span><span><em>            </em></span><em>&lt;form id="loginForm" method="post" runat="server"&gt;</em></span></pre>
<pre><span><span><em>               </em></span></span><span><em>&lt;table cellspacing="0" cellpadding="3" border="0"&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;tr&gt;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>&lt;td colspan="2"&gt;Siteye Giriş&lt;/td&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;/tr&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;tr&gt;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>&lt;td&gt;&lt;b&gt;E-posta Adresiniz&lt;/b&gt;&lt;/td&gt;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>&lt;td&gt;</em></span><span><em>&lt;asp:TextBox id="emailAdr" runat="server" MaxLength="255"&gt;&lt;/asp:TextBox&gt;</em></span><span><em>&lt;/td&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;/tr&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;tr&gt;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>&lt;td&gt;&lt;b&gt;Parolanız&lt;/b&gt;&lt;/td&gt;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>&lt;td&gt;</em></span><span><em>&lt;asp:TextBox id="parola" runat="server" MaxLength="10" TextMode="Password"&gt;&lt;/asp:TextBox&gt;</em></span><span><em>&lt;/td&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;/tr&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;tr&gt;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>&lt;td align="right" co</em></span><span><em>lspan="2"&gt;&lt;asp:Button id="btnLogin" OnClick="doLogin" runat="server" text="Formu Gönder"/&gt;</em></span><span><em>&lt;/td&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;/tr&gt;</em></span></pre>
<pre><span><span><em>                        </em></span><em>&lt;/table&gt;</em></span></pre>
<pre><span><span><em>            </em></span></span><span><em>&lt;/form&gt;</em></span></pre>
<pre><span><em>&lt;/asp:Panel&gt;</em></span></pre>
<pre><span><em>&lt;/body&gt;</em></span></pre>
<pre><span><em>&lt;/html&gt;</em></span></pre>
</td>
</tr>
</tbody>
</table>
<p>login.aspx dosyamızı işleyen sayfamız:</p>
<p><strong><em>login.aspx.cs</em></strong></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre><em>using System;
</em></pre>
<pre><span><em>using System.IO;</em></span></pre>
<pre><span><em>using System.Web.UI; </em></span><span><em>//web textbox larına ulaşabilmemiz için gereken class</em></span></pre>
<pre><span><em>using System.Security.Cryptography; </em></span><span><em>//md5 için gerekli class</em></span></pre>
<pre><span><em>using System.Text; </em></span><span><em>//UTF fonksiyonu için gerekli class</em></span></pre>
<pre><span><em>using System.Data; </em></span><span><em>//veritabanı işlemleri için gerekli class</em></span></pre>
<pre><span><em>using System.Data.SqlClient; </em></span><span><em>//veritabanı işlemleri için gerekli class</em></span></pre>
<pre><span><em>using System.Configuration; </em></span><span><em>//web.config dosyamızdan veri okuyabilmek amaçlı class</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><em>namespace loginForm</em></span></pre>
<pre><span><em>{</em></span></pre>
<pre><span><span><em>            </em></span><em>public class Login : System.Web.UI.Page</em></span></pre>
<pre><span><span><em>            </em></span><em>{</em></span></pre>
<pre><span><span><em>                        </em></span></span><span><em>//kodlamada kullanacağımız nesnelerimizi tanımlıyoruz.</em></span></pre>
<pre><span><span><em>                        </em></span><em>protected System.Web.UI.WebControls.TextBox emailAdr;</em></span></pre>
<pre><span><span><em>                        </em></span><em>protected System.Web.UI.WebControls.TextBox parola;</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                        </em></span><em>protected System.Web.UI.WebControls.Panel pnlLogin;</em></span></pre>
<pre><span><span><em>                        </em></span><em>protected System.Web.UI.WebControls.Panel loginStatus;</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                        </em></span><em>protected System.Web.UI.WebControls.Label lblInfo;</em></span></pre>
<pre><span><span><em>                        </em></span></span></pre>
<pre><span><span><em>                        </em></span><em>public void Page_Load(object sender, System.EventArgs e)</em></span></pre>
<pre><span><span><em>                        </em></span><em>{</em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//sayfa yüklendiğinde panellerimizin görüntülenme ayarlarını yapıyoruz.</em></span></pre>
<pre><span><span><em>                       </em></span></span><span><em>//form ekranı ilk olarak görüntülenecek.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>pnlLogin.Visible = true;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>loginStatus.Visible = false;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>lblInfo.Text = "";</em></span></pre>
<pre><span><span><em>                        </em></span><em>}</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                        </em></span></span><span><em>//Formu Gönder butonuna tıklandığında çalışan fonksiyonumuz</em></span></pre>
<pre><span><span><em>                        </em></span><em>protected void doLogin(object sender, System.EventArgs e)</em></span></pre>
<pre><span><span><em>                        </em></span><em>{</em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//girilen verileri alıyoruz.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>string uid = emailAdr.Text;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>string pwd = parola.Text;</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//işlem sonucu göstermek amaçlı ikinci panelimizi görünür kılıyoruz.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>pnlLogin.Visible = false;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>loginStatus.Visible = true;</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//parolanız şifrelenmesi için fonksiyona gönderiyoruz.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>//şifrelenmiş verimiz byte haline geleceği için değişkenimizi </em></span></pre>
<pre><span><span><em>                                     </em></span><em>//byte olarak tanımlıyoruz.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>byte[] encyrptedPwd = md5Password(pwd);</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//veritabanına ilgili verileri göndererek kontrolümüzü yaparız.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["strConn"]); </em><span><em>                           </em></span></span></pre>
<pre><span><span><em>                                     </em></span><em>conn.Open();</em></span></pre>
<pre><span><span><em>                                     </em></span><em>SqlCommand sc = new SqlCommand ();</em></span></pre>
<pre><span><span><em>                                     </em></span><em>sc.Connection = conn;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>sc.CommandType = CommandType.StoredProcedure;</em></span></pre>
<pre><span><span><em>                                     </em></span><em>sc.CommandText = "sp_sel_loginCheck"; </em></span></pre>
<pre><span><span><em>                                                                         </em></span></span></pre>
<pre><span><span><em>                                     </em></span><em>sc.Parameters.Add("@uemail", SqlDbType.VarChar, 255, "uemail"); </em></span></pre>
<pre><span><span><em>                                     </em></span><em>sc.Parameters["@uemail"].Value = uid; </em></span></pre>
<pre><span><span><em>                                     </em></span><em>sc.Parameters.Add("@upwd", SqlDbType.Binary, 16, "upwd"); </em></span></pre>
<pre><span><span><em>                                     </em></span><em>sc.Parameters["@upwd"].Value = encyrptedPwd;</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                                     </em></span><em>try</em></span></pre>
<pre><span><span><em>                                     </em></span><em>{</em></span></pre>
<pre><span><span><em>                                                 </em></span></span><span><em>//Elimizdeki verilerle çalıştırdığımız SP'mizden geri bir kolon, bir satır döndüğü</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>//için SqlCommand nesnesinin ExecuteScalar() metodunu kullanıyoruz.</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>//user_id şuanda bizim işimize yaramıyor, fakat nasıl çekildiğini göstermek amacı ile </em></span></pre>
<pre><span><span><em>                                                 </em></span><em>//bu satırı da kodumuza ekledim.</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>string user_id = sc.ExecuteScalar().ToString();</em></span></pre>
<pre><span><span><em>                                                 </em></span></span><span><em>//Email ve parola doğru ise bilgilendiriyoruz.</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>lblInfo.Text = "Hoşgeldiniz ";</em></span></pre>
<pre><span><span><em>                                     </em></span><em>}</em></span></pre>
<pre><span><span><em>                                     </em></span><em>catch</em></span></pre>
<pre><span><span><em>                                     </em></span><em>{</em></span></pre>
<pre><span><span><em>                                                 </em></span></span><span><em>//Email ve parola yanlışsa tekrar girmesini istiyoruz.</em></span></pre>
<pre><span><span><em>                                                 </em></span><em>lblInfo.Text = "Yanlış E-posta Adresi/Parola. Lütfen bilgilerinizi kontrol edip tekrar deneyiniz.";</em></span></pre>
<pre><span><span><em>                                     </em></span><em>}</em></span></pre>
<pre><span><span><em>                                     </em></span><em>conn.Close();</em></span></pre>
<pre><span><span><em>                        </em></span><em>}</em></span></pre>
<pre><span><em> </em></span></pre>
<pre><span><span><em>                        </em></span><em>byte[] md5Password(string pass)</em></span></pre>
<pre><span><span><em>                        </em></span><em>{</em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//md5 şifrelenmesi için verimizin byte haline gelmesi gerekli.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>//veri 8-bit şeklinde dönüştürülmesi için ilk önce UTF fonksiyonuna gönderiliyor.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>UTF8Encoding encoder = new UTF8Encoding();</em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//md5 şifrelemesi için nesnemizi oluşturuyoruz.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>MD5 md5 = new MD5CryptoServiceProvider();</em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//verimizi md5 ile çalıştırıyoruz.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>//dikkat ederseniz UTF fonksiyonundan dönen değeri GetBytes ile alabildik.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>byte[] donenDeger = md5.ComputeHash(encoder.GetBytes(pass));</em></span></pre>
<pre><span><span><em>                                     </em></span></span><span><em>//şifrelenmiş değerimizi geri gönderiyoruz.</em></span></pre>
<pre><span><span><em>                                     </em></span><em>return donenDeger;</em></span></pre>
<pre><span><span><em>                        </em></span><em>}</em></span></pre>
<pre><span><span><em>                        </em></span></span></pre>
<pre><span><span><em>            </em></span><em>}</em></span></pre>
<pre><span><em>}</em></span></pre>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.yazilimogren.com/2009/04/c-da-md5-ile-veri-sifreleme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# ile Yazıcı Çıktısı Alma İşlemleri</title>
		<link>http://www.yazilimogren.com/2009/04/c-ile-yazici-ciktisi-alma-islemleri/</link>
		<comments>http://www.yazilimogren.com/2009/04/c-ile-yazici-ciktisi-alma-islemleri/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 12:23:46 +0000</pubDate>
		<dc:creator>xqm26</dc:creator>
				<category><![CDATA[C# Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[C# Sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Resimli Anlatım]]></category>

		<guid isPermaLink="false">http://www.yazilimogren.com/?p=2067</guid>
		<description><![CDATA[C# ile Windows iş uygulaması geliştiriyorsanız programınızın mutlaka yazıcı çıktısı alma bölümü olacaktır. Bu makalede C# ile nasıl yazıcı çıktısı alınabileceğinin temelleri üzerinde duracağım.
.NET sınıf kütüphanesi her alanda olduğu gibi yazıcı çıktısı alma ile ilgili bir takım sınıflar sağlamıştır. PrintDocument sınıfı yazı çıktısı alma ile ilgili en temel sınıftır. Bu yazıda bu sınıfın özelliklerini, olaylarını ve metotlarını ayrıntılı [...]]]></description>
			<content:encoded><![CDATA[<p><span><img class="alignleft size-full wp-image-2072" title="c-ders-140" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-ders-140.jpg" alt="c-ders-140" width="150" height="150" />C# ile Windows iş uygulaması geliştiriyorsanız programınızın mutlaka yazıcı çıktısı alma bölümü olacaktır. Bu makalede C# ile nasıl yazıcı çıktısı <span id="more-2067"></span>alınabileceğinin temelleri üzerinde duracağım.</span></p>
<p>.NET sınıf kütüphanesi her alanda olduğu gibi yazıcı çıktısı alma ile ilgili bir takım sınıflar sağlamıştır. <strong><em><span>PrintDocument</span></em></strong> sınıfı yazı çıktısı alma ile ilgili en temel sınıftır. Bu yazıda bu sınıfın özelliklerini, olaylarını ve metotlarını ayrıntılı bir şekilde inceleyip tek sayfalı yada çok sayfalı yazıcı çıktısının nasıl alınabileceğini göstereceğim. Ayrıca yazıcı çıktısı alma ile çok yakından ilgili  olan <em><strong><span>PrintPreview</span></strong></em>, <em><strong><span>PageSetupDialog </span></strong></em>ve <em><strong><span>PrintDialog </span></strong></em>gibi sınıflarıda inceleyeceğiz.</p>
<p><strong><span>PrintDocument Sınıfı</span></strong></p>
<p>Bu sınıf programlarımıza yazıcı çıktısı alma desteğini eklemek için kullanabileceğimiz en temel yapıdır. Bu sınıf türünden bir nesne yaratıldığında çıktı alma ile ilgili hemen her tür bilgiye erişmemiz mümkündür.</p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td><span><em>PrintDocument YaziciCiktisi =   new PrintDocument(); </em></span></td>
</tr>
</tbody>
</table>
<p><span>şeklinde bir tanımlama yaptığımızda varsayılan yazıcı(default printer) ile çalışılmaktadır. Bir dökümanı yazıcıya göndermek için PrintDocument sınıfının <em><strong><span>Print() </span></strong></em>metodu kullanılır. Print() metodu çağrıldığı anda <em><strong><span>PrintPage</span></strong></em> olayı meydana gelir. Bu olayı yakalayan kontrol yazıcıya gönderilecek döküman üzerinde işlemler yaparak çıktının şeklini belirlemelidir. Her bir sayfa için ayrıca PrintPage olayı meydana geleceği için her bir olay içinde doğru sayfaları yazıcıya göndermek için bir takım işlemler yapmak gerekecektir. Aksi halde her defasında birinci sayfayı yazıcıya gönderme ihtimalimiz vardır. Kısacası PrintPage olayı olmadan yazıcıya çıktı bilgilerini gönderemeyiz. Bu yüzden ilk olarak PrintPage olayını ve bu olaya ait argümanları içeren <em><strong><span>PrintPageEventArgs</span></strong></em> sınıfını inceleyelim.</span></p>
<p>Önce PrintPage olayının argümanlarını içeren PrintPageEventArgs sınıfının üye elemanlarını inceleyelim, ardında bir konsol uygulamasından yazıcıya nasıl bir döküman göndereceğimizi göstereceğim.</p>
<p><span>PrintPageEventArgs sınıfnın üye elemanları :</span></p>
<p><strong><span>Graphics </span></strong>: Yazıcıya gönderilecek döküman bilgilerini belirleyen grafik nesnesidir. Yazıcya gönderilecek bilgilerin tamamı bu nesne içerisinde belirtilecektir. Not : Graphics sınıf GDI+ kütüphanesinin en önemli sınıfıdr. </p>
<p><strong><span>Cancel </span></strong>: Çıktı alma işleminin iptal edilip edilemeyeceği ile ilgili bilgi veren bool türünden bir elemandır. Eğer değeri true ise çıktı alma işlemi iptal edilecektir.</p>
<p><strong><span>HasMorePages </span></strong>: Yazıcıya gönderilecek çıktının birden fazla sayfa kapladığı durumlarda PrintPage olayına ilişkin metotta bu özelliğin true olarak değiştirilmesi gerekir. Böylece bundan sonraki PrintPage olaylarında bu değişken kontrol edilerek diğer sayfaların çıktıya gönderilmesi ile ilgili işlemler yapılır.<br />
<strong><br />
<strong><span>MarginBounds </span></strong></strong>: Yazıcıya gönderilen çıktı dökümanının en ve boyutlarını temsil eden <strong><span>Rectangle</span></strong> türünden bir özelliktir. Rectangle sınıfıda GDI+ kütüphanesinin bir parçasıdır. Bu özellikte yazıcıya gönderilecek çıktının sadece üzerine çizim yapılabilen kısmı belirtilir.</p>
<p><strong><span>PageBounds</span></strong> : Yazıcıya gönderilen dökümanın tamamının en ve boy değerlerini tutan yine Rectangle sınıfı türünden bir elemandır.</p>
<p><strong><span>PageSettings</span></strong>: İlgili dökümana ait sayfa ayarlarını tutan ve <strong><span>PageSettings</span></strong> sınıfı türünden bir elemandır. PageSettings sınıfının Color, Landscape, Margins, PaperSize, PaperSource, PrinterResolution gibi sayfa ile ilgili bilgi tutan üye özellikleri bulunmaktadır.</p>
<p>Şimdi basit bir örnekle yazıcıya çıktı gönderelim. Örneğimizde varsayılan yazıcınıza, sol üst köşesi (20,20) koordinatlarında eni ve boyu 100 olan bir dörtgen içeren sayfayı göndereceğiz. Gönderilecek sayfadaki dörtgeni çizmek için tahmin edeceğiniz üzere Graphics nesnesini kullanacağız.</p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span><em>using</em></span><span><em> System;<br />
</em> </span><span><em>using</em></span><span><em> System.Drawing.Printing;<br />
</em> </span><span><em>using</em></span><span><em> System.Drawing;</em></span></p>
<p><span><em>class</em></span><span><em> Printer<br />
{ <br />
    </em></span><span><em>static void</em></span><span><em> Main() <br />
    { <br />
        PrintDocument PD = </em></span><span><em>new</em></span><span><em> PrintDocument(); <br />
        PD.PrintPage += </em></span><span><em>new</em></span><span><em> PrintPageEventHandler(OnPrintDocument); </em></span></p>
<p><em>         </em><span><em>try <br />
</em> </span><span><em>        { <br />
            PD.Print(); <br />
        } <br />
         </em></span><span><em>catch <br />
</em> </span><span><em>        { <br />
            Console.WriteLine(&#8221;Yazıcı   çıktısı alınamıyor&#8230;&#8221;); <br />
        } <br />
         </em></span><span><em>finally <br />
</em> </span><span><em>        { <br />
            PD.Dispose(); <br />
        } <br />
    } </em></span></p>
<p><em>    </em><span><em>private static   void</em></span><span><em> OnPrintDocument(</em></span><span><em>object</em></span><span><em> sender,   PrintPageEventArgs e) <br />
    { <br />
        e.Graphics.DrawRectangle(Pens.Red,20,20,100,100); <br />
    }<br />
} </em></span></td>
</tr>
</tbody>
</table>
<p><span><br />
Yukarıdaki programı derleyip çalıştırdığınızda hiç bir uyarı eğer verilmeden sisteminize bir yazıcı bağlı OnPrintDocument() metodunda hazırlanan içerik yazıcıya gönderilecektir. Eğer sisteminize bağlı bir yazıcı yoksa doğal olarak catch bloğundaki kod çalışacaktır.</span></p>
<p>Çizilen dörtgen nesnesinin kağıdın neresine basılacağını biz belirliyoruz. MarginBounds özelliğini kullanarak çizilecek içeriğin doğru noktaya çizilmesini sağlayabiliriz. Bu özellik sizin yazıcı ayarlarınız ile ilgili olduğu için programlama yolu ile kod içerisinden değiştirilemez. Yani bu özellik &#8220;read only&#8221; bir özelliktir. Dikkat edilmesi gereken diğer bir noktada yazıcıya gönderilecek içeriğin PageBounds özelliği ile belirtilen dörtgenin dışına taşmamasıdır. Bu yüzden çizimleri yapılırken bu özellik baz alınmalıdır.</p>
<p>Yukarıda yazdığımız basit programda eksiklik bulunmaktadır. Bu eksiklik çizilecek dörtgenin tek bir sayfaya sığmadığı durumlarda görülür. Söz gelimi eğer dörtgenin yüksekliğini 2000 yaparsak yazıcıdan sadece ilk kağıda sığan bölümü çıkacaktır. Birden fazla sayfası olan çıktıları yazıcıya göndermek için PrintPageEventArgs sınıfnın <strong><span>HasMorePages</span></strong> özelliği kullanılır. Bu özellik OnPrintDocument() metodu içerisinde <strong><span>true </span></strong>değerine çekilerek çıktı alma işleminin devam ettiği belirtilmelidir. Ayrıca her bir sayfanın içeriğide metot her çağrıldığında farklı bir biçimde oluşturulacağı için programcının bu ayrımı da kodlaması gerekmektedir. Örneğin yüksekliği 2000 pixel olan bir dikdörtgeni tek sayfada bastıramayacağımız için ilk sayfaya sığmayan diğer bölümleri parçalayarak her bir sayfaya sığacak şekilde ayarlamalıyız. Bu işlem için PrintPageEventArgs sınıfnın HasMorePages değişkenini kullanacağız.</p>
<p>Hemen diğer bölümlere geçmeden önce birden fazla sayfalı yazıcı çıktısı alma işlemine örnek verelim. Bu örnekte bir text dosyasının içeriğini yazıcıya nasıl gönderebileceğimizi inceleyeceğiz. Tabi burda yazının birden fazla sayfada olup olmadığının kontrolünü yapmamız gerekir. Yazıları yazıcı çıktısına göndermek için Graphics sınıfnın DrawString metodunu kullanacağız. Bu metot grafik arayüzüne belirli bir fontta ve font büyüklüğünde yazı yazmamızı sağlar. Önce örneği inceleyelim ardından örnek üzerinde biraz konuşacağız.</p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td><span><em>using</em></span><span><em> System;<br />
</em> </span><span><em>using</em></span><span><em> System.IO;<br />
</em> </span><span><em>using</em></span><span><em> System.Drawing;<br />
</em> </span><span><em>using</em></span><span><em> System.Windows.Forms;<br />
</em> </span><span><em>using</em></span><span><em> System.Drawing.Printing;</em><em><br />
</em></p>
<p><span><em>class</em></span><span><em> Printer<br />
{<br />
    </em></span><span><em>private static</em></span><span><em> StreamReader dosyaAkimi;  </em></span></p>
<p><em>    </em><span><em>static void</em></span><span><em> Main(</em></span><span><em>string</em></span><span><em>[] args) <br />
    { <br />
        dosyaAkimi = </em></span><span><em>new</em></span><span><em> System.IO.StreamReader(&#8221;C:\\Print.txt&#8221;); </em></span></p>
<p><em>        PrintDocument PD = </em><span><em>new</em></span><span><em> PrintDocument(); <br />
        PD.PrintPage += </em></span><span><em>new</em></span><span><em> PrintPageEventHandler(OnPrintDocument); </em></span></p>
<p><em>        </em><span><em>try <br />
</em> </span><span><em>        { <br />
            PD.Print(); <br />
        } <br />
        </em></span><span><em>catch </em></span><span><em><br />
        { <br />
            Console.WriteLine(&#8221;Yazici   çiktisi alinamiyor&#8230;&#8221;); <br />
        } <br />
       </em></span><span><em> finally </em></span><span><em><br />
        { <br />
            PD.Dispose(); <br />
        } <br />
    } </em></span></p>
<p><em>    </em><span><em>public static   void </em></span><span><em>OnPrintDocument(</em></span><span><em>object </em></span><span><em>sender,PrintPageEventArgs   e) <br />
    { <br />
        Font font = </em></span><span><em>new</em></span><span><em> Font(&#8221;Verdana&#8221;, 11)   ; <br />
        float yPozisyon = 0 ; int   LineCount = 0 ; <br />
        float leftMargin =   e.MarginBounds.Left; <br />
        float topMargin =   e.MarginBounds.Top; </em></span></p>
<p><em>        </em><span><em>string</em></span><span><em> line=</em></span><span><em>null</em></span><span><em>; </em></span></p>
<p><em>       </em><span><em> float</em></span><span><em> SayfaBasinaDusenSatir = e.MarginBounds.Height /   font.GetHeight() ; </em></span></p>
<p><em>       </em><span><em> while</em></span><span><em> (((line=dosyaAkimi.ReadLine()) != </em></span><span><em>null</em></span><span><em>) &amp;&amp; LineCount &lt;   SayfaBasinaDusenSatir) <br />
        { <br />
            yPozisyon   = topMargin + (LineCount * font.GetHeight(e.Graphics)); <br />
            e.Graphics.DrawString   (line, font, Brushes.Red, leftMargin,yPozisyon); </em></span></p>
<p><em>            LineCount++; <br />
        } </em></p>
<p><em>        </em><span><em>if </em></span><span><em>(line = = </em></span><span><em>null</em></span><span><em>) <br />
            e.HasMorePages   = </em></span><span><em>false </em></span><span><em>; <br />
       </em></span><span><em> else</em></span><span><em> <br />
            e.HasMorePages   = </em></span><span><em>true</em></span><span><em> ; </em></span></p>
<p><em>    }<br />
}</em></p>
<p></span></td>
</tr>
</tbody>
</table>
<p><span>Yukarıdaki program herhangi bir text formatındaki dosyayı yazıcıya gönderek çıktı almanızı sağlayacaktır. Dosyanın içeriğini yazıcıya gönderirken çıktının ne şekilde olacağı tamamen programlama yolu ile bizim tarafımızdan yapılmaktadır. Örneğin çıktının yazı fontunu GDI+ kütüphanesinin bir sınıfı olan Font ile yazı renginide yine GDI+ kütüphanesinin Brushes sınıfının üye elemanları ile rahatlıkla değiştirebiliriz.</span></p>
<p>Yukarıdaki örnek uygulamada en önemli kısım dosya içeriğinin yazıcıyı gönderilmesi sırasında görülür. Dosya içeriğinin birden fazla sayıda sayfa içermesi durumunda dosya akımından bir sayfaya sığacak kadar satır okunmalıdır. Eğer dosya akımının sonuna gelinmediyse <strong><span>HasMorePages</span></strong> özelliği true yapılarak OnPrintDocument metodunun yeniden çağrılması gerekir. Kaynak koddanda gördüğünüz üzere dosya akımından okunan satır null değereeşit olduğunda yani dosyanın sonuna gelindiğinde HasMorePages özeliiği false yapılarak Print() metodunun icrası sonlandırılmıştır.</p>
<p>Bir diğer önemli nokta ise yazıcıya gönderilecek her bir sayfada kaç satırın bulunacağının belirlenmesidir. Sayfa başına düşen satır sayısı, sayfanın yazıcıya gönderilecek bölümünün yüksekliğinin yani <strong><span>e.MarginBounds.Height</span></strong> &#8216;in çıktıya gönderilecek yazıya ait fontun yüksekliğine bölümü ile elde edilir. Sayfa başına üşen satır sayısı elde edildikten sonra herbir sayfanın içeriği while döngüsü yardımı ile hazırlanır. Okunan satır sayısı <strong><span>null</span></strong> değere eşit olmayana kadar ve okunan satır sayısı sayfa başına düşen satır sayısı olana kadar döngüye devam edilir. Döngü içerisinde<strong><span> PrintPageEventArgs</span></strong> olay argümanlarını içeren sınıfın Graphics nesnesine <strong><span>DrawString()</span></strong> metodu yardımıyla dosya akımından okunan satır yazılır. Bir sonraki satırın çıktı ekranının neresinden başlayacağını tutmak için ise her bir satır okunduğunda yPozisyon&#8217;u kullanılan font&#8217;un yüksekliği kadar artırılır. Bütün bu işlemleri yaptıktan sonra HasMorePages özelliği ayarlanır ki sonraki sayfalar çıktıya gönderilsin. Eğer dosya sonuna gelinmişse artık basılacak sayfa yok demektir ve <strong><span>HasMorePages</span></strong> özelliği false olarak belirlenir.</p>
<p><strong><em><span>Not</span></em></strong><em><span> :</span></em> <em><span>Dosya akımının neden OnPrintDocument() metodunun içinde tanımlanmadığını merak ediyor olabilirsiniz. Bunun sebebi OnPrintDocument() metodunun her bir sayfa için yeniden çağrılmasıdır. Eğer dosya akımını bahsi geçen metotta tanımlamış olsaydık her defasında dosya akımı baştan okunacağı için hiç bir zaman dosya akımının sonuna gelemeyecektik ve her defasında sonsuza dek ilk sayfayı çıktıya göndermiş olacaktık. Bu yüzden dosya akımını global düzey diyebileceğimiz bir noktada yani ana sınıfımın bir üye elamanı olacak şekilde tanımladık.</span></em><em><span><br />
</span></em><span><br />
Aklınıza takılmış olabilecek diğer bir nokta ise yazıcının renk ayarlarıdır. Eğer yazcınız renkli çıktı almayı desteklemiyorsa DrawString() metoduna parametre olarak geçtiğimiz <strong><span>Brushes.Red</span></strong> parametresinin bir önemi olmayacaktır. Bu yüzden dökümanları yazıcya göndermeden yazcının renkli baskıyı desteleyip desteklemediğini kontrol etmek en akıllıca yöntemdir.  Bu şekildeki bri kontrol için PrintDocument sınıfının <strong><span>PrinterSettings</span></strong> özelliği kullanılabilir. Bu özellik varsayılan yazcınız ile ilgili bir takım ayarları yapısında barındıran özelliklere sahiptir. Örneğin varsayılan yazıcınızın renkli bakıyı destekleyip desteklemediğini kontrol etmek için <strong><span>SupportsColor</span></strong> özelliğini aşağıdaki gibi kullanabilirsiniz. Not : SupportsColor özelliği bool türündendir.</span></p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="MsoNormal"><span><em>using</em></span><span><em> System;<br />
</em> </span><span><em>using</em></span><span><em> System.Drawing.Printing;<br />
</em> </span><span><em>using</em></span><span><em> System.Drawing;</em></span></p>
<p><span><em>class</em></span><span><em> Printer<br />
{ <br />
    </em></span><span><em>static void</em></span><span><em> Main() <br />
    { <br />
        PrintDocument PD = </em></span><span><em>new</em></span><span><em> PrintDocument(); <br />
        PD.PrintPage += </em></span><span><em>new</em></span><span><em> PrintPageEventHandler(OnPrintDocument); </em></span></p>
<p><em>         </em><span><em>if </em></span><span><em>( </em><strong><span><em>PD.PrinterSettings.SupportsColor</em></span></strong><em> )<br />
         {<br />
             </em></span><span><em> </em></span><span><em>//renkli   baskı ayarları</em></span><span><em><br />
         }<br />
</em> </span><span><em>         else</em></span><span><em><br />
         {<br />
              </em></span><span><em>//renksiz baskı ayarları</em></span><span><em><br />
         }</em></span></p>
<p><em>    } </em></p>
<p><em>    </em><span><em>private static   void</em></span><span><em> OnPrintDocument(</em></span><span><em>object</em></span><span><em> sender,   PrintPageEventArgs e) <br />
    { <br />
        &#8230;. <br />
    }<br />
} </em></span></td>
</tr>
</tbody>
</table>
<p> </p>
<p>PrinterSettings yolu ile elde edebileceğimiz diğer önemli özellikler aşağıda listelenmiştir.</p>
<p><strong><span>CanDuplex</span></strong> : bool türünden olan bu değişken yazıcının arkalı önlü çıktı almayı destekleyip desteklemediğini belirtir.</p>
<p><strong><span>Copies</span></strong>: short türünden olan bu değişken yazıcıya gönderilecek dökümanın kaç kopya çıkarılacğını belirtir. Eğer 10 sayfalık bir döküman için bu özelliği 5 olarak girerseniz 50 adet kağıdınızı yazıcıya yerleştirmeyi unutmayın.<br />
<strong><br />
<strong><span>CanDuplex</span></strong></strong> : bool türünden olan bu değişken yazıcının arkalı önlü çıktı almayı destekleyip desteklemediğini belirtir.</p>
<p><strong><span>Duplex</span></strong> : Duplex enum sabiti türünden olan bu değişken arkalı önlü baskı özelliğini belirler. Duplex numaralandırması Default,Sizmplex,Horizontal ve Vertical olmak üzere dört tane üyesi vardır.</p>
<p><strong><span>IsDefaultPrinter</span></strong> : PrinterName ile belirtilen yazıcının bilgisayarınızdaki varsayılan yazıcı(default printer) olup olmadığını belirtir.<br />
<strong><br />
<strong><span>IsValid</span></strong></strong> : PrinterName ile belirtilenin  gerçekten sisteminize ait bir yazıcı olup olmadığını belirtir.</p>
<p><strong><span>PaperSizes</span></strong> : Yazıcı tarafından desteklenen sayfa ebatlarının <strong><span>PaperSizeCollection</span></strong> türünden bir koleksiyon nesnesi ile geri döner. Bu koleksiyondaki her bir eleman System.Drawing isim alanında bulunan <strong><span>PaperSize </span></strong>türündendir. PaperSize sınıfnın Width(sayfa eni), Height(sayfa boyu),Kind(sayfa türü) gibi özellikleri bulunmaktadır.</p>
<p><strong><span>PaperSources</span></strong> : Yazıcı tarafından desteklenen sayfa kağıt alma kaynaklarını <strong><span>PaperSourceCollection</span></strong> türünden bir koleksiyon nesnesi ile geri döner. Bu koleksiyondaki her bir eleman System.Drawing isim alanında bulunan <strong><span>PaperSource </span></strong>türündendir. PaperSource sınıfnın <strong><span>Kind</span></strong> özelliği <strong><span>PaperSourceKind </span></strong>numaralandırması türünden bir nesne olup kağıt kaynağının tipini belirtir.Bu numaralandırmanın bazı semboleri şunlardır : Envelope, Cassette, Custom, Manuel, TractorFeed.</p>
<p><strong><span>PrintToFile</span></strong> : Çıktının herhangi port yerine bir dosyaya yazdırılıp yazdırılmayacağını tutan bool türünden bir değişken. Bu değişken daha çok birazdan göreceğimiz PrintDialog ekranının görüntülenmesi sırasında değiştirilip kullanılır.</p>
<p><strong><span>Çıktı Ön-İzleme Penceresi</span></strong></p>
<p>Profesyonel uygulamaların tamamında yazıcıya çıktı göndermeden önce kullanıcıya ön izleme imkanı sağlanır. .NEt ortamında program geliştiriyorsanız Windows&#8217;un standart ön izleme penceresini programlama yolu ile görüntülemeniz son derece kolaydır. Bu ekranın görüntülenmesi için System.Drawing isim alanında bulunan <strong><span>PrintPreviewDialog</span></strong> sınıfı kullanılır. Bu sınıf ile ilişkilendirilmiş <strong><span>PrintDocument </span></strong>nesnesinin PrintPage olayına ilişkin metot çalıştırılarak ön-izleme penceresindeki içerik elde edilir.</p>
<p>Bir PrintPreviewDialog nesnesi oluşturulduktan sonra nesnenin <strong><span>Document </span></strong>özelliğine PrintDocument türünden bir nesne atanır. Ve ardından PrintPreviewControl türünden olan nesne üzerinden <strong><span>Show()</span></strong> yada <strong><span>ShowDialog()</span></strong> metotları kullanılarak ön izleme ekranı gösterilir.</p>
<p>Ön izleme çıktısnın görüntülendiği pencereyi elbette PrintDocument sınıfnın Print() metodunu çağırmadan önce göstermeliyiz. Daha önce yaptığımız ve dosya içeriğini yazıcıya gönderen uygulmanın Main() metodunu aşağıdaki gibi değiştirerek ön izleme ekranından çıktıya gönderilecek içeriği görüntüleyelim.</p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td><span><em>static void</em></span><span><em> Main(</em></span><span><em>string</em></span><span><em>[] args) <br />
{ <br />
        dosyaAkimi = </em></span><span><em>new</em></span><span><em> System.IO.StreamReader(&#8221;C:\\Print.txt&#8221;); </em><em><br />
</em></p>
<p><em>        PrintDocument PD = </em><span><em>new</em></span><span><em> PrintDocument(); <br />
        PD.PrintPage += </em></span><span><em>new</em></span><span><em> PrintPageEventHandler(OnPrintDocument); </em></span></p>
<p><strong><span><em>         PrintPreviewDialog   pdlg = new PrintPreviewDialog(); </em></span></strong><strong><em><br />
</em> <strong><span><em>         pdlg.Document =   PD; </em></span></strong><em><br />
</em> <strong><span><em>         pdlg.ShowDialog(); </em></span></strong></strong></p>
<p><em>        </em><span><em>try <br />
</em> </span><span><em>        { <br />
            PD.Print(); <br />
        } <br />
        </em></span><span><em>catch </em></span><span><em><br />
        { <br />
            Console.WriteLine(&#8221;Yazici   çiktisi alinamiyor&#8230;&#8221;); <br />
        } <br />
       </em></span><span><em> finally </em></span><span><em><br />
        { <br />
            PD.Dispose(); <br />
        } <br />
} </em></span></p>
<p></span></td>
</tr>
</tbody>
</table>
<p><span><br />
Programı yeni haliyle derleyip çalıştırdığımızda ilk önce öıktı ön izleme ekranı aşağıdaki gibi gösterilecektir. Not : Çıktıya gönderilecek dosyanın yolu örneğimiz için &#8220;C:\Print.txt&#8221; şeklinde olmalıdır.</span></p>
<p><span><img class="alignnone size-full wp-image-2069" title="c-print-1" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-print-1.jpg" alt="c-print-1" width="373" height="397" /></span></p>
<p><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75"  o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="IMG1" o:spid="_x0000_i1025" type="#_x0000_t75"  alt="" style='width:282pt;height:297.75pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg"   o:href="http://www.csharpnedir.com/Mimages/PrintPreviewDialog1.jpg" /> </v:shape><![endif]--></p>
<p><strong><span>Sayfa Düzenleme Ekranı (PageSetupDialog Sınıfı)</span></strong></p>
<p>Dökümanı çıktıya göndermeden önce gönderme işleminin hangi yazıcı ayarları ile yapılacağını belirlemek için genellikle sayfa düzenleme ekranı gösterilir. Bu ekranda kağıt tipinden, yazcının kağıt kaynağına kadar bir çok özelliği değiştirmeniz mümkündür. Bu ekranda yapılan bütün değişiklikler PrintDocument sınıfının PrinterSettings özelliğine aktarılır. Sayfa düzenleme ekrana System.Drawing isim alanında bulunan <strong><span>PrintSetupDialog</span></strong> sınıfı ile gerçekleştirilir. Bu sınıfının kullanımı <strong><span>PrintPreviewDialog</span></strong> sınıfının kullanımı ile nerdeyse aynıdır. Bu yüzden ayrıca açıklmaya gerek duymuyorum.</p>
<p>Son olarak yazıcı ön izleme ekranından önce sayfa düzenleme ekranının gösterilmesini sağlamak için uygulamamaızın Main() metodunu aşağıdaki gibi değiştirin ve çalıştırın.</p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td><span><em>static void</em></span><span><em> Main(</em></span><span><em>string</em></span><span><em>[] args) <br />
{ <br />
        dosyaAkimi = </em></span><span><em>new</em></span><span><em> System.IO.StreamReader(&#8221;C:\\Print.txt&#8221;); </em><em><br />
</em></p>
<p><em>        PrintDocument PD = </em><span><em>new</em></span><span><em> PrintDocument(); <br />
        PD.PrintPage += </em></span><span><em>new</em></span><span><em> PrintPageEventHandler(OnPrintDocument); </em></span></p>
<p><strong><span><em>         PrintDialog   pdiyalog = new PrintDialog(); </em></span></strong><strong><em><br />
</em> <strong><span><em>         pdiyalog.Document   = PD; </em></span></strong><em><br />
</em> <strong><span><em>         pdiyalog.ShowDialog();</em></span></strong></strong></p>
<p><em>        PrintPreviewDialog pdlg   = </em><span><em>new</em></span><span><em> PrintPreviewDialog(); <br />
        pdlg.Document = PD; <br />
        pdlg.ShowDialog(); </em></span></p>
<p><em>        </em><span><em>try <br />
</em> </span><span><em>        { <br />
            PD.Print(); <br />
        } <br />
        </em></span><span><em>catch </em></span><span><em><br />
        { <br />
            Console.WriteLine(&#8221;Yazici   çiktisi alinamiyor&#8230;&#8221;); <br />
        } <br />
       </em></span><span><em> finally </em></span><span><em><br />
        { <br />
            PD.Dispose(); <br />
        } <br />
} </em></span></p>
<p></span></td>
</tr>
</tbody>
</table>
<p><span><br />
Programı derleyip çalıştırdığınızda karşınıza ilk çıkacak görüntü aşağıdaki ekran olacaktır.</span></p>
<p><span><img class="alignnone size-full wp-image-2071" title="c-print-2" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-print-2.jpg" alt="c-print-2" width="436" height="328" /></span></p>
<p><!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" alt=""  style='width:327.75pt;height:246pt'> <v:imagedata src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpg" mce_src="file:///C:\Users\Bilal\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpg"   o:href="http://www.csharpnedir.com/Mimages/PrintPreviewDialog2.jpg" /> </v:shape><![endif]--></p>
<p>Bu örnekle birlikte yazıcı çıktısı alma ile ilgili temel işlemlerin anlatıldığı yazımızın sonuna geldik. .NET teki yazıcı çıktısı alma işlemleri bu anlattıklarımla sınırlı değildir. Ancak bu yazıda anlatılanlar bu konuya çok hızlı bir giriş yapmanızı sağlamıştır. İlerleyen yazılarda görüşmek dileğiyle.</p>
<p>Kaynaklar :</p>
<p>MSDN Yardım Dökümanları</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yazilimogren.com/2009/04/c-ile-yazici-ciktisi-alma-islemleri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# Düzenli İfadeler(Regular Expressions) Nedir?</title>
		<link>http://www.yazilimogren.com/2009/04/c-duzenli-ifadelerregular-expressions-nedir/</link>
		<comments>http://www.yazilimogren.com/2009/04/c-duzenli-ifadelerregular-expressions-nedir/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 12:01:56 +0000</pubDate>
		<dc:creator>xqm26</dc:creator>
				<category><![CDATA[C# Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[C# Sharp]]></category>
		<category><![CDATA[ders]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false">http://www.yazilimogren.com/?p=2063</guid>
		<description><![CDATA[Regular expression bir metni düzenlemek yada metin içerisinden belli kurallara uyan alt metinler elde etmek için kullandığımız bir dildir. Bir regular expression, string tipindeki karakter topluluğuna uygulanır. Sonuç olarak substringler oluşur yada orjinal metnin bir kısmını içeren değiştirilmiş yeni metinler elde edilir.
Regular Expression’larda Kullanılan Özel Karakterler ve Etkileri
Regular expression desenleri tanımlamada kullanılan özel karakterleri örnekleri [...]]]></description>
			<content:encoded><![CDATA[<p><span><img class="alignleft size-full wp-image-2065" title="c-ders-139" src="http://www.yazilimogren.com/wp-content/uploads/2009/04/c-ders-139.jpg" alt="c-ders-139" width="150" height="150" />Regular expression bir metni düzenlemek yada metin içerisinden belli kurallara uyan alt metinler elde etmek için kullandığımız bir dildir. <span id="more-2063"></span>Bir regular expression, string tipindeki karakter topluluğuna uygulanır. Sonuç olarak substringler oluşur yada orjinal metnin bir kısmını içeren değiştirilmiş yeni metinler elde edilir.</span></p>
<p><strong>Regular Expression’larda Kullanılan Özel Karakterler ve Etkileri</strong></p>
<p class="MsoNormal"><span>Regular expression desenleri tanımlamada kullanılan özel karakterleri örnekleri ile anlatırsak sanırım regular expressionlar daha tanıdı ve kolay gelebilir.</span></p>
<p><span><strong>1.)  “.” Karakteri</strong></span></p>
<p class="MsoNormal"><span>Tek bir karakteri temsil eder(yeni satır karakteri hariç).<br />
“CSharp.edir” şeklindeki bir desen CSharpnedir, CSharpNedir, CSharpSedir, CSharp3edir gibi stringleri döndürebilir.</span></p>
<p><span><strong>2.)  “[]” Karakterleri</strong></span></p>
<p class="MsoNormal"><span>Bir arrayi yada aralığı temsil eder.<br />
“CSharp[SNY]edir” deseni, CSharpSedir, CSharpNedir ve CSharpYedir stringlerini döndürür.<br />
“CSharp[a-z]edir” şeklindeki kullanım aralık belirtmeye yarar.<br />
“CSharp[0-9]edir” şeklindeki kılanlım ise sayısal aralık belirtmeye yarar.</span></p>
<p><span><strong>3.)  “?” Karakteri</strong></span></p>
<p class="MsoNormal"><span>Kendinden önceki karakterin stringte olması yada olmamasını sağlar.<br />
“CSharpn?edir” deseni CSharpedir yada CSharpnedir döndürür.</span></p>
<p><span><strong>4.)  “\” Karakteri</strong></span></p>
<p class="MsoNormal"><span>Kendinden sonraki özel karakterin stringe dahil edilmesini sağlar.<br />
“CSharpnedir\?” deseni CSharpnedir? Stringini döndürür. (Eğer “\” karakterini kullanmamış olsaydık CSharpnedi yada CSharpnedir dönerdi.)</span></p>
<p><span><strong>5.)  “*” Karakteri</strong></span></p>
<p class="MsoNormal"><span>Kendinden önceki karakterin yada stringin hiç olmaması yada istediği sayıda olmasını sağlar.<br />
“CSharpnedir*” deseni, CSharpnedi, CSharpnedir, CSharpnedirr, CSharpnedirrr, &#8230; döndürür. “CSharp(nedir)*” deseni ise CSharp, CSharpnedir, CSharpnedirnedir, &#8230; döndürür.</span></p>
<p><span><strong>6.)  “{}” Karakterleri</strong></span></p>
<p class="MsoNormal"><span>Kendinden önce gelen karakterin belirtilen sayıda tekrar etmesini sağlar.<br />
“C{4}Sharpnedir” deseni, CCCCSharpnedir stringini döndürür.</span></p>
<p><span><strong>7.)  “^” Karakteri</strong></span></p>
<p class="MsoNormal"><span>Satır başını ifade eder.<br />
“^CSharpnedir” deseni, satır başında “CSharpnedir” stringi varsa bunu döndürür.</span></p>
<p><span><strong>8.)  “$” Karakteri</strong></span></p>
<p class="MsoNormal"><span>Satır sonunu ifade eder.<br />
“CSharpnedir$” deseni, satır sonunda “CSharpnedir” stringi varsa bunu döndürür.</span></p>
<p><strong>Basit Bir Tarih Deseni Yapalım</strong></p>
<p class="MsoNormal"><span>Şimdi işin pratiğine gelelim ve adım adım tarih deseni oluşturalım. Daha sonra ise oluşturduğumuz bu tarih desenini bir konsol programında kullanalım.</span></p>
<p>Tarih desenimiz bir string içerisindeki, GG/AA/YYYY formatlarındaki tarihleri yakalayacak yapıda olsun.</p>
<p>Önce desenimizin GG yani tarihin gün belirtilen kısmını tanımlayalım :</p>
<p class="code2"><span>“(0?[1-9])”<br />
// 1, 2, .., 9, 01, 02, &#8230;, 09 gibi yazılmış günleri tanımlar.</span></p>
<p>“([12][0-9])”<br />
// 10, 11, &#8230;, 29 gibi yazılmış günleri tanımlar.</p>
<p>“(3[01])”<br />
// 30, 31 günlerini tanımlar.</p>
<p>// Bu üç tanımı OR (|) işlemiyle<br />
// birleştirirsek gün tanımını elde ederiz.</p>
<p>// Gün tanımı :<br />
“((0?[1-9])|([12][0-9])|(3[01]))”</p>
<p class="MsoNormal"><span><br />
Şimdi desenimizin AA yani tarihin ay belirtilen kısmını tanımlayalım :</span></p>
<p class="code2"><span>“(0?[1-9])”<br />
// 1, 2, .., 9, 01, 02, .., 09 gibi yazılmış ayları tanımlar.</span></p>
<p>“(1[0-2])”<br />
// 10, 11, 12 aylarını tanımlar.</p>
<p>// Bu iki tanımı OR işlemiyle<br />
// birleştirirsek ay tanımını elde ederiz.</p>
<p>// Ay Tanımı :<br />
“((0?[1-9])|(1[0-2]))”</p>
<p class="MsoNormal"><span><br />
Şimdi desenimizin YYYY yani tarihin yıl belirtilen kısmını tanımlayalım :</span></p>
<p class="code2"><span>“([12][0-9][0-9][0-9])”<br />
//1000 ile 2999 yılları arasındaki tüm yılları içerir.</span></p>
<p class="MsoNormal"><span><br />
Ve son olarak tanımladığımız gün, ay ve yıl desenlerini “/” ile birleştirelim :</span></p>
<p class="code2"><span>“((0?[1-9])|([12][0-9])|(3[01]))(/)(0?[1-9]|1[0-2])(/)([12][0-9][0-9][0-9]))”</span></p>
<p><span><strong>Basit Bir Test Programı Yazalım</strong></span></p>
<p class="MsoNormal">Şimdi elde ettiğimiz tarih desenini test edebileceğimiz basit bir konsol programı yazalım. Ek bilgi olarak “?” şeklindeki bir ifadeyi desenin önüne ilave ederseniz, bir desen grubu ifade etmiş olursunuz ve birkaç deseni aynı anda kontrol edebilirsiniz.</p>
<table class="MsoNormalTable" border="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<p class="code"><span class="spelle"><span><em>using</em></span></span><span><em> </em><span class="spelle"><em>System</em></span><em>; </em></span></p>
<p class="code"><span class="spelle"><span><em>using</em></span></span><span><em> </em><span class="spelle"><em>System</em></span><em>.</em><span class="spelle"><em>Text</em></span><em>.</em><span class="spelle"><em>RegularExpressions</em></span><em>;</em></span></p>
<p class="code"><span class="spelle"><span><em>class</em></span></span><span><em> Test</em></span></p>
<p class="code"><span><em>{ </em></span></p>
<p class="code"><span><em>      </em></span><span class="spelle"><span><em>public</em></span></span><span><em> </em></span><span class="spelle"><span><em>static</em></span></span><span><em> </em></span><span class="spelle"><span><em>void</em></span></span><span><em> </em><span class="spelle"><em>Main</em></span><em>()</em></span></p>
<p class="code"><span><em>      {</em></span></p>
<p class="code"><span><em>            </em></span><span><em>// </em><span class="spelle"><em>Regular</em></span><em> </em><span class="spelle"><em>Expression</em></span><em> için   bir desen (</em><span class="spelle"><em>pattern</em></span><em>) tanımlıyoruz :</em></span></p>
<p class="code"><span><em>            </em></span><span class="spelle"><span><em>string</em></span></span><span><em> </em><span class="spelle"><em>tarihDeseni</em></span><em>=@&#8221;(?((0?[1-9])|([12][0-9])|(3[01]))(/)(0?[1-9]|1[0-2])(/)([12][0-9][0-9][0-9]))&#8221;;</em></span></p>
<p class="code"><span><em>            </em></span><span><em>// </em><span class="spelle"><em>Regular</em></span><em> </em><span class="spelle"><em>Expression&#8217;umuzu</em></span><em> tanımlıyoruz :</em></span></p>
<p class="code"><span><em>            </em><span class="spelle"><em>Regex</em></span><em> </em><span class="spelle"><em>benimRegex</em></span><em>=</em></span><span class="spelle"><span><em>new</em></span></span><span><em> </em><span class="spelle"><em>Regex</em></span><em>(</em><span class="spelle"><em>tarihDeseni</em></span><em>);</em></span></p>
<p class="code"><span><em>            </em></span><span><em>//   Kullanıcıdan tarih içeren metni talep ediyoruz :</em></span></p>
<p class="code"><span><em>            </em><span class="spelle"><em>Console</em></span><em>.</em><span class="spelle"><em>WriteLine</em></span><em>(&#8221;Lütfen   içinde tarih olan bir metin giriniz :&#8221;);</em></span></p>
<p class="code"><span><em>            </em></span><span><em>//   Tarih arayacağımız metni konsoldan alıyoruz :</em></span></p>
<p class="code"><span><em>            </em></span><span class="spelle"><span><em>string</em></span></span><span><em> metin=</em><span class="spelle"><em>Console</em></span><em>.</em><span class="spelle"><em>ReadLine</em></span><em>();</em></span></p>
<p class="code"><span><em>            </em></span><span><em>//   Metin içerisindeki tarihleri (birden fazla olabilir) </em><span class="spelle"><em>Collection</em></span><em> nesnesine atıyoruz :</em></span></p>
<p class="code"><span><em>            </em><span class="spelle"><em>MatchCollection</em></span><em> </em><span class="spelle"><em>benimMatchCollection</em></span><em>=</em><span class="spelle"><em>benimRegex</em></span><em>.</em><span class="spelle"><em>Matches</em></span><em>(metin);</em></span></p>
<p class="code"><span><em>            </em></span><span><em>//   Metin içindeki </em><span class="spelle"><em>herbir</em></span><em> tarihi ekrana yazdırıyoruz :</em></span></p>
<p class="code"><span><em>            </em></span><span class="spelle"><span><em>foreach</em></span></span><span><em>(</em><span class="spelle"><em>Match</em></span><em> </em><span class="spelle"><em>benimMatch</em></span><em> </em></span><span><em>in</em></span><span><em> </em><span class="spelle"><em>benimMatchCollection</em></span><em>)</em></span></p>
<p class="code"><span><em>              {</em></span></p>
<p class="code"><span><em>                  </em><span class="spelle"><em>Console</em></span><em>.</em><span class="spelle"><em>WriteLine</em></span><em>(</em><span class="spelle"><em>benimMatch</em></span><em>.</em><span class="spelle"><em>Groups</em></span><em>["tarih"]);</em></span></p>
<p class="code"><span><em>              }</em></span></p>
<p class="code"><span><em>            </em><span class="spelle"><em>Console</em></span><em>.</em><span class="spelle"><em>Read</em></span><em>();</em></span></p>
<p class="code"><span><em>      }</em></span></p>
<p class="code"><span><em>}</em></span></p>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.yazilimogren.com/2009/04/c-duzenli-ifadelerregular-expressions-nedir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
