https://www.buraksenyurt.com/Burak Selim Şenyurt - Windows Forms2012-01-31T16:24:52+00:00Matematik Mühendisi Bir Bilgisayar Programcısının NotlarıBurak Selim SenyurtBlogEngine.Net Syndication Generatorhttps://www.buraksenyurt.com/opml.axdBurak Selim SenyurtMatematik Mühendisi Bir Bilgisayar Programcısının Notlarıtr-TRBurak Selim Şenyurt0.0000000.000000https://www.buraksenyurt.com/post/Tek-Fotoluk-Ipucu-45(NumPad-Yapalim)Tek Fotoluk İpucu-45(NumPad Yapalım)2012-01-03T09:33:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Diyelim ki Windows Forms programlama ile ilgileniyorsunuz. Çalışma zamanında bileşen üretilmesini öğrendiniz. Form' lar arası geçişleri biliyorsunuz ve öğrendiklerinizi tatbik etmek niyetindesiniz. Hatta Extension Method kavramını da biliyorsunuz hatta Anonymous Method yazmayı da öğrendiniz. Öyleyse mesela bir NumPad formunun dinamik olarak üretilmesini ve üstündeki sayı düğmelerine basıldığında kaynak olarak gelen bir TextBox bileşeninin içinin doldurulmasını tecrübe etmeyi deneyebilirsiniz. Nasıl mı ? <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" src="http://www.buraksenyurt.com/pics/wlEmoticon-winkingsmile_62.png" alt="Winking smile" /></p>
<p><a href="http://www.buraksenyurt.com/pics/PhotoIpucu45.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="PhotoIpucu45" src="http://www.buraksenyurt.com/pics/PhotoIpucu45_thumb.png" border="0" alt="PhotoIpucu45" width="645" height="758" /></a></p>
<p><a href="http://www.buraksenyurt.com/pics/2011%2f8%2fNumpad.rar">Numpad.rar (38,02 kb)</a></p>2012-01-03T09:33:00+00:00win formswindows formsanonymous methodsextension methodsflowlayoutpanelbsenyurthttps://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=7c55ee1c-6edc-4d85-9453-8d0ea20b793b0https://www.buraksenyurt.com/trackback.axd?id=7c55ee1c-6edc-4d85-9453-8d0ea20b793bhttps://www.buraksenyurt.com/post/Tek-Fotoluk-Ipucu-45(NumPad-Yapalim)#commenthttps://www.buraksenyurt.com/syndication.axd?post=7c55ee1c-6edc-4d85-9453-8d0ea20b793bhttps://www.buraksenyurt.com/post/Tek-Fotoluk-Ipucu-29-(Ne-Kadar-TextBox-Varsa)Tek Fotoluk İpucu-29 (Ne Kadar TextBox Varsa)2011-08-26T03:17:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Kaliteli kod yazmak için aslında biraz titiz düşünmek gerekir. Söz gelimi bir Windows programlamada bir Container kontrol içerisindeki tüm TextBox' ların içeriğini temizlemek istediğiniz bir durumda nasıl kodlama yaparsınız? İşin içerisine Recursive metod formatını katabilirsiniz. Hatta bunu bir Extension Method haline de getirebilirsiniz. Nasıl mı? <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" src="http://www.buraksenyurt.com/pics/wlEmoticon-winkingsmile_47.png" alt="Winking smile" /></p>
<p><a href="http://www.buraksenyurt.com/pics/PhotoTrick29.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="PhotoTrick29" src="http://www.buraksenyurt.com/pics/PhotoTrick29_thumb.png" border="0" alt="PhotoTrick29" width="642" height="760" /></a></p>
<p><a href="http://www.buraksenyurt.com/pics/2011%2f7%2fWindowsFormsApplication1.rar">WindowsFormsApplication1.rar (40,37 kb)</a></p>2011-08-26T03:17:00+00:00c#c# temelleriwindows formsextension methodstextboxbsenyurthttps://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=1afc02e6-5352-46f3-a6f9-6090120db8d33https://www.buraksenyurt.com/trackback.axd?id=1afc02e6-5352-46f3-a6f9-6090120db8d3https://www.buraksenyurt.com/post/Tek-Fotoluk-Ipucu-29-(Ne-Kadar-TextBox-Varsa)#commenthttps://www.buraksenyurt.com/syndication.axd?post=1afc02e6-5352-46f3-a6f9-6090120db8d3https://www.buraksenyurt.com/post/Windows-Uygulamalarc4b1nda-Daha-Kolay-Thread-Yonetimi-bsenyurt-com-danWindows Uygulamalarında Daha Kolay Thread Yönetimi2006-01-05T08:00:00+00:00bsenyurt<p>Değerli Okurlarım Merhabalar,</p>
<p>Windows uygulamalarında, arka planda çalışan iş parçalarının (process) çok uzun sürdüğü durumlar ile sıkça karşılaşırız. Bu gibi durumlarda genellikle kullanıcı ekranı (UI - User Interface) kısa süreliğine de olsa arka plan işlemleri tamamlanıncaya kadar donar. Bunun önüne geçmek için Thread sınıflarını kullanabiliriz. Ancak .Net 2.0 ile birlikte windows uygulamalarında arka planda asenkron olarak çalıştırılabilecek tipteki işlemleri kolayca yönetebileceğimiz <strong>BackgroundWorker</strong> isimli yeni bir görsel bileşen gelmektedir. Bu makalemizde bu bileşen yardımıyla, UI kitlenmelerine neden olacak tarzdaki süreçleri nasıl yönetebileceğimizi görmeye çalışacağız.</p>
<blockquote>
<p>BackgroundWorker bileşeni çalışma zamanında, asenkron olarak işlem yürütebilmemizi ve bu sayede kullanıcı ekranının gereksiz şekilde donmasını (freeze) engellemek amacıyla kolay ve güçlü bir süreç yönetimi sunar.</p>
</blockquote>
<p>Herşeyden önce, bir windows uygulamasında özellikle kullanıcı arayüzünü (user interface) uzun süre duraksatabilecek, bir başka deyişle kullanıcının arabirim üzerindeki herhangibir kontrol ile etkileşimini geçici süre engelleyebilecek durumların neler olabileceğini düşünmekte fayda vardır. Duraksatmaya neden olacak örnek durumlar aşağıdaki tabloda verilmiştir.</p>
<table id="table8" style="border-collapse: collapse; width: 404px;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffff">
<tbody>
<tr>
<td style="width: 392px;" width="392"><strong> Ekran Donmalarına Neden Olabilecek Durumlar</strong></td>
</tr>
<tr>
<td width="392">Yoğun veritabanı işlemleri. Örneğin CRUD işlemleri sırasında.</td>
</tr>
<tr>
<td width="392">Dosyalara ilişkin download ve upload işlemlerinde.</td>
</tr>
<tr>
<td width="392">Web servislerine ait metodların yürütülmesinde.</td>
</tr>
<tr>
<td width="392">Resim dosyalarının uygulama ortamına yüklenmesinde.</td>
</tr>
</tbody>
</table>
<p><br />BackgroundWorker bileşeni, ilgili iş parçasını asenkron olarak yürütebilme ve anlık olarak durum bilgisini verebilme (progress status) gibi imkanlar sunmaktadır. Bu nesneye ait 3 önemli olay bulunmaktadır. Bunlar <strong>DoWork</strong>, <strong>ProgressChanged</strong>, <strong>RunWorkerCompleted</strong> olaylarıdır. DoWork olayı, asenkron olarak yürütülecek kodların yer aldığı işlemleri ele alır. Asenkron olarak yürütülen işlemler çalışmaya devam ederken, kullanıcı arayüzü(UI) herhangibir şekilde donmaz ve kullanıcı aktivitelerine cevap vermeye devam eder. Yürütülen iş parçası sonlandığında ise, RunWorkerCompleted olayı tetiklenir. Bunu, asenkron olarak yürütülen süreç sonlandığında devreye giren callback metodu olarakta düşünebilirsiniz. RunWorkerCompleted metodu sadece işlemler tamamlandığında değil, iptal edildiğinde (cancel) veya bir exception sonucu işlemler kesildiğinde de devreye girer. ProgressChanged olayı ise, asenkron olarak yürütülen iş parçasının anlık durumunu bildirmek amacıyla kullanılabilir.</p>
<p>BackgrounWorker bileşeninin en önemli metodu <strong>RunWorkerAsync</strong>' dir. Bu metod, DoWork olayını tetikleyerek, asenkron olarak yürütülmek istenen komutların devreye girmesini sağlamak gibi önemli bir rolu üstlenir. Dilersek RunWorkerAsync metodundan, DoWork olay metoduna ortam parametresi taşıyabiliriz. Bu önemlidir çünkü çoğu zaman, asenkron yürütülecek iş parçalarına ait kodlar, dış parametreler bağımlıdır. Benzer şekikde DoWork olayından da işlemler bittiğinde tetiklenen RunWorkerCompleted olayına parametre aktarımını yapabiliriz. (Örneğin süreç sona erdiğinde elde edilen sonuçların aktarılması gibi.)</p>
<p>Bileşenin kullanımını daha kolay anlayabilmek için basit bir örnek üzerinden makalemize devam edeceğiz. Bir windows uygulamamız olduğunu ve arka planda son derece uzun sürebilecek bir operasyonu gerçekleştirmeye çalıştığımızı düşünelim. Örneğin matematiksel bir uygulamada 1' den 1000' e kadar olan elemanların karelerinin toplamına ihtiyacımız olduğunu düşünelim.</p>
<blockquote>
<p>Özellikle Asenkron olarak yürütülecek bir veya daha fazla sql komutunun söz konusu olduğu veritabanı operasyonlarında bir windows uygulaması kullanılıyor ise, BackgroundWorker bileşeni yerine, asenkron komut yürütme tekniklerinin (polling, callback, wait modelleri) ele alınması tercih edilmelidir. Nitekim BackgroundWorker nesne örnekleri ile, sql komutlarının asenkron yönetimi sanıldığı kadar kolay değildir.</p>
</blockquote>
<p>Konuyu en basit haliyle anlamak için aşağıdaki örneği geliştirelim. Windows uygulamamız aşağıdaki ekran görüntüsüne sahip olan tek bir Form' dan oluşmaktadır. Hesapla başlıklı butona basıldığında, 1' den 1000' e kadar olan sayıların karelerinin toplamının bulunduğu süreç, arka planda çalıştırılmaktadır. İptal başlıklı button kontrolümüz ise, çalışmakta olan arka plan işlemini iptal etmek için kullanılır. Uygulamamızda bir adet TextBox ve ProgressBar kontrolümüz yer alıyor. Bu kontrollerden TextBox kontrolümüzü, işlemler hesap edilirken kullanıcının ekran ile etkileşebildiğini göstermek amacıyla kullanmaktayız. ProgressBar kontrolümüzü ise, arka planda yapılan hesaplamanın hangi konumda olduğunu yüzdesel olmamakla birlikte vurgulamaya çalışmak için kullanıyoruz. Elbette, 1' den 1000'e kadar olan sayıların karelerinin toplamını hesap etmek anlık bir işlemdir. Biz süreci uzatmak için küçük bir hile yapacağız. Bu hilede amacımız süreci yeterince uzatmak olduğu için, hesaplamar arasında 10 milisaniyelik gecikme süreleri koyacağız.</p>
<p><img src="/makale/images/mk143_1.gif" alt="" width="371" height="271" border="0" /></p>
<p>Uygulama kodlarımız ve açıklamaları aşağıda yer almaktadır.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace UsingBackGroundWorkerProcess
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//Hesaplama işlemini yaptığımız metod. İptal işlemini burada ele alabilmek için DoWork olayından buraya DoWorkEventArgs parametresinide gönderiyoruz.
private double Compute(int endValue, DoWorkEventArgs e)
{
double Total = 0;
for (int i = 1; i <= endValue; i++)
{
// Eğer iptal işlemi için btnComputeCancel kontrolüne basılmışsa, BackgroundWorker sınıfının CancelAsync metodu çalıştırılmış demektir. Bu durumda, BackgroundWorker nesnesine bir iptal talebi (Cancel Request) gider. Bu if yapısında bunu kontrol ederek hesaplama işleminin iptalini gerçekleştiriyoruz.
if (bgwProcess.CancellationPending == true)
{
e.Cancel = true;
}
else
{
// Hesaplama işleminden sonra, süreci biraz daha uzatabilmek için arka planda çalışan thread' imizi 10 milisanine kadar duraksatıyoruz. Bu sadece olayları izlemeyi kolaylaştırmak için yapılmış bir hile. Nitekim bize gerçekten arka planda uzun süren bir işlem gerekiyor.
Total += i * i;
System.Threading.Thread.Sleep(10);
// ReportProgress metodu ile hesaplanan değeri, raporlama amacı ile ProgressChanged olayına gönderiyoruz.
bgwProcess.ReportProgress(i);
}
}
return Total;
}
// DoWork olayımız, hesaplamaların arka planda yürütülmesini ve işlem sonucunun DoWorkEventArgs parametresinin Result özelliğine atanmasını sağlar. Süreç sona erdiğinde, RunWorkerCompleted metodunda bu result özelliğinin değerini alabiliriz.
private void bgwProcess_DoWork(object sender, DoWorkEventArgs e)
{
e.Result=Compute(Convert.ToInt32(e.Argument),e);
}
// RunWorkerCompleted olayı, arka plan süreci tamamlandığında devreye girmektedir. Burada basit olarak işleme ait iptal talebi (Cancel Request) olup olmadığı kontrol edilir ve yoksa sonuç kullanıcıya bir MessageBox yardımıyla bildirilir. Bu metodu asenkron olarak çalışan bir işlemin tamamlanması sonrası devreye giren Callback metodu olarak düşünebilirsiniz.
private void bgwProcess_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("İşleminiz iptal edildi...");
pgbStatus.Value = 0;
txtFreeZone.Text = "";
}
else
{
MessageBox.Show(e.Result.ToString());
}
btnComputeCancel.Enabled = false;
btnComputeStart.Enabled = true;
}
private void btnCompute_Click(object sender, EventArgs e)
{
pgbStatus.Maximum = 1000;
pgbStatus.Minimum = 0;
pgbStatus.Value = 0;
// Hesaplama işleminin arka planda asenkron olarak yürütülmesini başlatan metod çağırılır. Dikkat ederseniz metodumuza birde parametrik değer gönderiyoruz.
bgwProcess.RunWorkerAsync(1000);
btnComputeCancel.Enabled = true;
btnComputeStart.Enabled = false;
}
private void btnComputeCancel_Click(object sender, EventArgs e)
{
// Arka planda yürütülen işleme, iptal talebini (cancel request) CancelAsync metodu ile göndermekteyiz.
bgwProcess.CancelAsync();
btnComputeCancel.Enabled = false;
btnComputeStart.Enabled = true;
}
private void Form1_Load(object sender, EventArgs e)
{
btnComputeCancel.Enabled = false;
}
// Bu olay ile, anlık olarak arka planda devam eden işlemin hangi aşamada olduğunu ele alabiliriz. İlgili değeri ProgressChangedEventArgs parametresinin ProgressPercentage özelliği ile alıyoruz. Bu değer aslında Compute fonksiyonu içerisinde, ReportProgress metodu ile gönderdiğimiz değerin aynısıdır. İstenirse, burada bu değere göre yüzdesel gösterimler de yapılabilir.
private void bgwProcess_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pgbStatus.Value = e.ProgressPercentage;
}
}
}</pre>
<p>Uygulamamızı bu haliyle çalıştırdığımızda aşağıdaki Flash videosunda görülen sonuçları elde ederiz.</p>
<p><em>(Not : Aşağıdaki görüntüyü seyredebilmek için tarayıcınızda Flash Player' ın son sürümünün olması tavsiye edilir. Eğer sisteminizde XP Service Pack 2 yüklüyse ilgili uyarıyı dikkate alıp içeriğe izin vermelisiniz. (Allow Blocked Content). Videoyu yönetmek için sağ tıklayıp çıkan menüyü kullanabilirsiniz.)</em></p>
<p><object id="obj1" width="349" height="249" classid="clsid:D27CDB6E-AE6D-11CF-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" border="0">
<param name="movie" value="http://www.buraksenyurt.com/makale/images/BackgroundWorkerDemo.swf" />
<param name="quality" value="High" /> <embed type="application/x-shockwave-flash" width="349" height="249" src="http://www.buraksenyurt.com/makale/images/BackgroundWorkerDemo.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" name="obj1" quality="High" /></object></p>
<p>Gördüğünüz gibi, Windows uygulamalarında arka planda çalışacak işlemleri yönetmek için BackgroundWorker bileşeni oldukça büyük kolaylıklar sağlamaktadır. Aslında şu bir gerçektir ki, aynı işlevselliği Thread nesnelerini kullanaraktanda yapabilmekteyiz.</p>
<blockquote>
<p>Çok Kanallı Programlama ve Threading hakkında daha fazla bilgi için bkz; <a href="http://www.bsenyurt.com/makalegoster.aspx?ID=33">Çok Kanallı(Multithread) Uygulamalar</a>, <a href="http://www.bsenyurt.com/makalegoster.aspx?ID=34"> Thread'leri Belli Süreler Boyunca Uyutmak ve Yoketmek</a>, <a href="http://www.bsenyurt.com/makalegoster.aspx?ID=35"> Thread'lerde Öncelik(Priority) Durumları</a>, <a href="http://www.bsenyurt.com/makalegoster.aspx?ID=36">İşe Yarar Bir MultiThreading(Çok Kanallı) Uygulama Örneği</a></p>
</blockquote>
<p>Aslında Windows uygulamalarını hedef alan bu gelişmenin, thread yönetimini kolaylaştırıcı bir yenilik olduğunu düşünebiliriz. Böylece geldik bir makalemizin daha sonuna. Bir sonraki makalemizde görüşünceye dek hepinize mutlu günler dilerim.</p>2006-01-05T08:00:00+00:00windows formsthreadbackgroundworkerbsenyurtWindows uygulamalarında, arka planda çalışan iş parçalarının (process) çok uzun sürdüğü durumlar ile sıkça karşılaşırız. Bu gibi durumlarda genellikle kullanıcı ekranı (UI - User Interface) kısa süreliğine de olsa arka plan işlemleri tamamlanıncaya kadar donar. Bunun önüne geçmek için Thread sınıflarını kullanabiliriz. Ancak .Net 2.0 ile birlikte windows uygulamalarında arka planda asenkron olarak çalıştırılabilecek tipteki işlemleri kolayca yönetebileceğimiz BackgroundWorker isimli yeni bir görsel bileşen gelmektedir. Bu makalemizde bu bileşen yardımıyla, UI kitlenmelerine neden olacak tarzdaki süreçleri nasıl yönetebileceğimizi görmeye çalışacağız.https://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=45f9aca9-bfaf-42cc-990a-c844d6a32de50https://www.buraksenyurt.com/trackback.axd?id=45f9aca9-bfaf-42cc-990a-c844d6a32de5https://www.buraksenyurt.com/post/Windows-Uygulamalarc4b1nda-Daha-Kolay-Thread-Yonetimi-bsenyurt-com-dan#commenthttps://www.buraksenyurt.com/syndication.axd?post=45f9aca9-bfaf-42cc-990a-c844d6a32de5https://www.buraksenyurt.com/post/Bir-Form-ve-Kontrollerinin-Elle-Programlanmasc4b1c2a0-bsenyurt-com-danBir Form ve Kontrollerinin Elle Programlanması2003-11-21T12:00:00+00:00bsenyurt<p>Değerli Okurlarım, Merhabalar.</p>
<p>Bugünkü makalemizde, bir Formu kodla nasıl oluşturacağımızı, bu form üstüne nasıl kontroller ekleyeciğimizi, bu kontoller için nasıl olaylar yazacağımızı vb. konuları işlemeye çalışacağız. Bildiğiniz gibi Visual Studio.NET gibi grafiksel ortamlar ile Form ve Form nesnelerini görsel olarak, kolay ve hızlı bir şekilde oluşturabilmekteyiz. Bu bizim programlama için ayıracağımız sürede , ekran tasarımlarının daha hızlı yapılabilmesine olanak sağlamaktadır.</p>
<p>Ancak bazen elimizde sadece csc gibi bir C# derleyicisi ve .Net Framework vardır. İşte böyle bir durumda, Windows Form’larını tasarlamak için manuel olarak kodlama yapmamız gerekmektedir. Ayrıca, iyi ve uzman bir programcı olabilmek için özellikle Visual ortamlarda Windows Form, Button, TextBox gibi kontrollerin nasıl oluşturulduğunu, nasıl kodlandığını olaylara nasıl ve ne şekilde bağlandığını bilmek, oldukça faydalıdır. Bu aynı zamanda kontrolün bizde olmasını da sağlayan bir unsur olarak karşııza çıkmar ve kendimize olan güvenimizi dahada arttırır.</p>
<p>Dilerseniz konuyu anlamak için basit ama etkili bir örnekle başlayalım. Bu örneğimizde basit olarak boş bir Form oluşturacağız ve bunu csc.exe (C# Compiler) ile derleyeceğiz. Bir Windows Formu aslında System.Windows.Forms sınıfından türeyen bir nesnedir. Bu nedenle oluşturacağımız C# sınıfı içersinde bu bildirimi gerçekleştirmeliyiz. Ayrıca sınıfımızın Form nesnesine ait elemanlarıda kullanabilmesi için, Form sınıfından türetmeliyiz(Inherting). Bunlara ek olarak Formumuzu ekranda gösterebilmek için Application nesnesini ve buna bağlı Run metodunu kullanacağız. Hemen bir text editor açalım ve burada aşağıdaki kodları girelim.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System.Windows.Forms;
public class BirForm:Form // Form sınıfının elemanlarını kalıtısal olarak devralıyoruz.
{
public static void Main() // Programın başladığı nokta.
{
BirForm yeni1=new BirForm(); // BirForm sınıfından bir nesne tanımlıyoruz.
Application.Run(yeni1);
/* yeni1 isimli Form nesnemiz Application nesnesi tarafından görüntülenir. Bu noktadan itibaren programın işleyişi bir döngüye girer. Bu döngüde Application nesnesi sürekli olarak programın işleyişini sonlandıracak bir olayın tetiklenip tetiklenmediğini de kontrol eder. Bu arada tabi yazılan diğer olaylar ve metodlar çalışır. Ancak program sonlandırma ile ilgili ( örneğin Close metodu ) bir kod ile karşılaşıldığında veya kullanıcı Form’un varsa kapatma simgesine tıkladığında (veya ALT+F4 yaptığında) Application nesnesi artık programın işleyişini durdurur. */
}
}</pre>
<p>Yazdığımız bu dosyayı cs uzantısı ile kaydetmeyi unutmayalım. Şimdi bu dosyayı csc.exe ile derleyelim. Programı derlerken dikkat etmemiz gereken bir nokta var. System.Windows.Forms ‘ un programa referans edilmesi gerekir. Bunu sağlamak için derleme komutumuzun nasıl yazıldığına dikkat edelim. /reference: burada devreye girmektedir. </p>
<p align="left"><img src="/makale/images/mk6_1.gif" alt="" width="638" height="333" border="0" /></p>
<p align="left"><em>Şekil 1. İlk Derleme</em></p>
<p>Görüldüğü gibi, csc dosyamızı derlemiş ve CreateForm.exe dosyasını olşturmuştur. Burada /t:winexe programı Windows işletim sistemine, " Ben bir WinForm’um " olarak tanıtmaktadır. Şimdi bu dosyayı komut satırından çalıştıracak olursak aşağıdaki şekilde görülen sonucu elde ederiz. </p>
<p align="left"><em><img src="/makale/images/mk6_2.gif" alt="" width="300" height="300" border="0" /></em></p>
<p align="left"><em>Şekil 2. Oluşturulan Form Nesnemiz.</em></p>
<p align="left">Şekil 2.'de oluşturulumuş olduğumuz Form nesnesini görebilirsiniz. Yazmış olduğumuz kodlarda bu Form nesnesine ait özellikleri değiştirerek farklı Form görünümleride elde edebiliriz. Bu noktada size Form oluşturma olaylarının kodlama tekniğinin aslen nasıl yapılması gerektiğini göstermek isterim. Bu bir tarzdır yada uygulanan bir formattır ancak en uygun şekildir. Nitekim Visual Studio.NET ortamında bir Windows Application geliştirdiğinizde, uygulama kodlarına bakıcak olursanız bahsetmiş olduğumuz formasyonun uygulanmış olduğunu göreceksiniz.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System.Windows.Forms;
public class BirForm:Form
{
public BirForm() // Constructor(Yapıcı) metodumuz.
{
InitializeComponent(); /* BirForm sınıfından bir Form nesnesi üretildiğinde new yapılandırıcısı bu constructora bakar ve InitializeComponent metodunu çağırır. */
}
private void InitializeComponent()
{
/* Burada Form'a ait özellikler ve Form üzerinde yer alacak nesneler tanılanır. Tanılanan nesneler aynı zamanda Form'a burada eklenir ve özellikleri belirlenir. */
}
public static void Main()
{
Application.Run(new BirForm());
}
}</pre>
<p align="left">Bu yazım tekniği daha anlamlı değil mi ? Kodumuzu bu şekilde değiştirip çalıştırdığımızda yine aynı sonucu elde ederiz. Ancak dilersek bu kodu şu şekilde de yazabiliriz.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System.Windows.Forms;
public class BirForm:Form
{
public BirForm()
{
NesneleriAyarla();
}
private void NesneleriAyarla()
{
}
public static void Main()
{
Application.Run(new BirForm());
}
} </pre>
<p align="left">Yine aynı sonucu alırız.Şimdi Formumuza biraz renk katalım ve üstünede bir kaç nesne ekleyelim. </p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Windows.Forms;
using System.Drawing;
public class BirForm:Form
{
/* Kullanacağımız nesneler tanımlanıyor. Iki adet Label nesnesi, iki adet TextBox nesnesi ve birde Button kontrolü. */
private Label lbl1;
private Label lbl2;
private TextBox txtUsername;
private TextBox txtPassword;
private Button btnOK;
public BirForm()
{
NesneleriAyarla();
}
private void NesneleriAyarla()
{
this.Text="Yeni Bir Form Sayfası"; /* this anahtar kelimesi oluşturulan Form nesnesini temsil eder.*/
this.BackColor=Color.Silver; /* Formun arka plan rengini belirliyoruz. Color Enumaration'ınını kullanabilmek için Drawing sınıfının eklenmiş olması gereklidir. */
this.StartPosition=FormStartPosition.CenterScreen; /* Form oluşturulduğunda ekranın ortasında görünmesi sağlanıyor. */
this.FormBorderStyle=FormBorderStyle.Fixed3D; /* Formun border çizgileri 3 boyutlu ve sabit olarak belirleniyor. */
/* Label nesnelerini oluşturuyor ve özelliklerini ayarlıyoruz. */
lbl1=new Label();
lbl2=new Label();
lbl1.Text="Username";
lbl1.Location=new Point(50,50); /* lbl1 nesnesini 50 birim sağa 50 birim aşağıya konumlandırıyoruz */
lbl1.AutoSize=true; /* Label'ın boyutunun text uzunluğuna göre otomatik olarak ayarlanmasını sağlıyoruz. */
lbl2.Text="Password";
lbl2.Location=new Point(50,100); /* Bu kez 50 birim sağa, 100 birim aşağıya yerleştiriyoruz. */
lbl2.AutoSize=true;
/* TextBox nesnelerini oluşturuyor ve özelliklerini ayarlıyoruz. */
txtUsername=new TextBox();
txtPassword=new TextBox();
txtUsername.Text="";
txtUsername.Location=new Point(lbl1.PreferredWidth+50,50); /* Textbox nesnemizi lbl1 in uzunluğundan 50 birim fazla olucak şekilde sağa ve 50 birim aşağıya konumlandırıyoruz. */
txtPassword.Text="";
txtPassword.Location=new Point(lbl2.PreferredWidth+50,100);
/* Button nesnemizi oluşturuyor ve özelliklerini belirliyoruz */
btnOK=new Button();
btnOK.Text="TAMAM";
btnOK.Location=new Point(0,0);
/* Buraya btnOK nesnesi için olay procedure tanımı eklenecek. */
/* Şimdi kontrollerimizi Formumuza ekleyelim . Bunun için Form sınıfına ait Controls koleksiyonunu ve Add metodunu kullanıyoruz. */
this.Controls.Add(lbl1);
this.Controls.Add(lbl2);
this.Controls.Add(txtUsername);
this.Controls.Add(txtPassword);
this.Controls.Add(btnOK);
this.Width=lbl1.PreferredWidth+txtUsername.Width+200; /* Son olarak formun genişliğini ve yüksekliğini ayarlıyoruz. */
this.Height=lbl1.PreferredWidth+lbl2.PreferredWidth+200;
}
/* Buraya btnOK için Click olay procedure kodları eklenecek. */
public static void Main()
{
Application.Run(new BirForm());
}
} </pre>
<p align="left">Evet bu kodu derleyip çalıştırdığımızda aşağıdaki Form görüntüsünü elde etmiş oluruz.</p>
<p align="left"><em><img src="/makale/images/mk6_3.gif" alt="" width="356" height="310" /></em></p>
<p align="left"><span style="font-style: italic; font-family: Verdana;">Şekil 3. Form tasarıını geliştiriyoruz. </span></p>
<p>Şimdi işin en önemli kısılarından birine geldi sıra. Oda olay güdümlü kodları yazmak. Yani kullanıcı etkilerine tepki vericek kodları yazmak. Kısaca Event-Handler. Kullanıcı bir eylem gerçekleştirdiğinde programın hangi tepkileri vereceğini belirtmek durumundayız. Bunun için şu syntax’ı kullanırız.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">protected void metodunAdi(object sender,System.EventArgs e) </pre>
<p>Burada metodumuzun hangi nesne için çalıştırılacağını sender anahtar kelimesi belirtir. Metod protected tanımlanır. Yani bulunduğu sınıf ve bulunduğu sınıftan türetilen sınıflarda kullanılabilir. Geri dönüş değeri yoktur. Bu genel formasyonla tanımlanan bir olay procedure’ünü nesne ile ilişkilendirmek için System.EventHandler delegesi kullanılır.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">nesneAdi.OlayinTanılayiciBilgisi+= new System.EventHandler(this.metodunAdi)</pre>
<p>Yukarıdaki örneğimizde klasik örnek olarak, Button nesnemize tıklandığında çalıştırılması için bir Click olay procedure’ü ekleyelim. </p>
<p class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;" align="justify"><span style="color: black;">Şimdi</span></p>
<p><span style="font-family: Tahoma;"><span style="font-family: Tahoma; color: black;"><span style="font-family: Verdana; color: green;"> /* Buraya btnOK nesnesi için olay procedure tanımı eklenecek */ yazan yere , aşağıdaki kod satırını ekliyoruz<span style="font-family: Verdana; color: green;">. </span></span></span></span></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">btnOK.Click+=new System.EventHandler(this.btnOK_Tiklandi);</pre>
<p>Bu satır ile btnOK nesnesine tıklandığında btnOK_Tiklandi isimli procedure’ün çalıştırılacağını belirtiyoruz. <span style="color: #008000;">/* Buraya btnOK için Click olay procedure kodları eklenecek */ yazan yere ise olay procedure’ümüzün ve kodlarını ekliyoruz.</span></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">protected void btnOK_Tiklandi(object sender,System.EventArgs e)
{
MessageBox.Show(txtUsername.Text+" "+txtPassword.Text);
} </pre>
<p>Şimdi programı tekrar derleyip çalıştırdığımızda aşağıdaki sonucu elde ederiz.</p>
<p align="left"> <img src="/makale/images/mk6_4.gif" alt="" width="356" height="310" /> <img src="/makale/images/mk6_5.gif" alt="" width="118" height="108" /></p>
<p align="left"><em>Şekil 4. Event-Handler sonucu. </em></p>
<p>Evet geldik bir makalemizin daha sonuna. Bir sonraki makalemizde görüşmek dileğiyle hepinize mutlu ve huzurlu günler dilerim.</p>2003-11-21T12:00:00+00:00windows formsbsenyurtBugünkü makalemizde, bir Formu kodla nasıl oluşturacağımızı, bu form üstüne nasıl kontroller ekleyeciğimizi, bu kontoller için nasıl olaylar yazacağımızı vb. konuları işlemeye çalışacağız.https://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=7be58462-c924-4cfb-8ecb-cfaf5fbd60650https://www.buraksenyurt.com/trackback.axd?id=7be58462-c924-4cfb-8ecb-cfaf5fbd6065https://www.buraksenyurt.com/post/Bir-Form-ve-Kontrollerinin-Elle-Programlanmasc4b1c2a0-bsenyurt-com-dan#commenthttps://www.buraksenyurt.com/syndication.axd?post=7be58462-c924-4cfb-8ecb-cfaf5fbd6065