C# etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
C# etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

10 Nisan 2010 Cumartesi

ASP.NET - Xml WebServices (2 - Uygulamalı Örnek)

Tekrar merhaba,

Bu makale de basit bir Web Service yazıp nasıl kullanıldığını bir örnek üzerinde görmeye çalışacağız. Bir önceki yazımda anlattığım üzere çeşitli nedenlerden dolayı Web Service kullanma ihtiyacı ortaya çıkabilir. Peki nasıl ve nereden başlamalı? Gelin hep birlikte sıfırdan bir proje oluşturalım.

Servis'i yazmadan önce Web Service'leri ile ilgili biraz hatırlatma yapmak isterim. Web Service'ler daha doğrusu Xml Web Service'ler adı üstüne Xml (eXtensible Markup Language) yapısını taşıdığı için data gönderim ve almada bize kolaylıklar sağlarlar. Bu kolaylığı sağlamaları için kullandıkları bazı protokoller vardır. Xml Web Service'leri de Xml tabanlı olduklarından SOAP (Simple Object Access Protocol, Basit Nesne Erişim Protokolü) protokol'ünü kullanırlar.

SOAP protokolünde taşınacak her bir datanın belli bir standartta olması gerekir. Bunun için SOAP ile taşınan bir datayı üç aşamada inceleyebiliriz.

Envelope - Header - Body

Envelope : Bu yapının en geniş kümesidir. Şekilde de görüldüğü gibi her bir SOAP Envelope'u bünyesinde Header ve Body'i içermelidir.

Header : Gönderilecek olan datanın ön bilgisini taşır.
Body : Gönderilecek olan datanın içeriğini taşır.


Artık projeyi geliştirmeye başlayabiliriz. Her zaman ki gibi Visual Studio arayüzünden yeni ve boş bir Solution oluşturuyorum. İsmide blogWebService olsun. Bu Solution'ıma bir adet Web Service ve bir adet de bu Web Service'i tüketecek yani test edeceğimiz bir Web Projesi ekleyeceğim

İlk olarak servisimizi yazalım. Solution'a sağ tıklayıp Add sekmesinden NewProject diyorum ve karşıma gelen arayüzden ASP.NET Web Service Application sekmesini seçip ismine de blogService adını veriyorum.

Web servisimizi oluşturduğumuz anda Visual Studio bize standart bir Web Service'te olması gereken yapıları ve de bir metot örneği ile oluşturup getiriyor.

Şimdi gelelim asıl soruya. Peki bu servis ne iş yapacak?

Gelin basit bir metot yazalım ve metot bizden string bir değer alıp bunu içinde işleyip tekrar string olarak geri döndürsün. HelloWorld metodunu silip yerine kendi Hosgeldin metodumuzu ekleyelim.



Kural 1 - Eğer bir Web Service için metot yazıyorsanız, her zaman metodun başına [WebMethod] etiketini koymanız gerekir. Bu, metodun sisteme tanıtılmasını sağlar.

Kural 2 - Web Service'te yazdığımız metotlar Public olmalı ki dışarıdan çağırılabilsinler.

Kural 3 - Ve son olarak metodun geri dönüş tipinin Serializable (Serileşebilir) bir tip olması gereklidir. Serileşme'yi başka bir makalede uzun uzun anlatmak daha doğru olur.

Evet gelelim metodumuza. Metot bizden string "ad" ve "soyad" olarak iki değer alıp bunları işleyip, tekrar string olarak geri veriyor olsun.

























Metodumuzu yazdık. Test edelim bakalım servis çalışıyormu. ".asmx" uzantılı Web Service'imize sağ tıklayıp "View in Browser" diyoruz. Ve evet yazdığımız metot çağırılmak üzere üretilip getirilmiş. Tıklayıp değerleri girelim bakalım çalışacak mı ?





Güzel. Sıra geldi bu servisi kullanmaya. Peki bu servisi nasıl kullanacağız?

Servisi kullanabilmek için önce ona ulaşmak gerekir öyle değil mi? Peki bu nasıl olacak?

Bu noktada bazı hatırlatmaları yapmakta fayda var. Web Service'ler bir web sayfası gibi ulaşılabilirdir. Yani temelinde her web sayfasında olduğu gibi URL (Uniform Resource Locator)' i mevcuttur. Ve bu URL üzerinden ulaşılırlar.

Şimdi gelelim WebService'imizi dışarıya açmaya. Bu işlem için tabiki IIS (Internet Information Server)' ı kullanacağız. WebService'imizi dışarı açmak için (Publishing) Visual Studio arayüzümüzü de kullanabiliriz. Bunun için servisimize sağ tıklayıp Publish diyoruz.


Açılan arayüzden "..." diyip


















Burada ilk olarak Local IIS'i seçiyoruz. Ardından Web Service'i hangi dizin altında oluşturmak istediğimizi seçiyoruz. Ben test amaçlı olduğundan Default Web Site (Varsayılan Web Sitesi)'ı seçtim siz tabiki istediğiniz bir dizin oluşturabilirsiniz.
Daha sonra sağ üstte bulunan Create New Web Application diyip URL'imizin ismini veriyoruz. Ve son olarakda Open'ı diyip ilk karşımıza gelen menüde seçimlerimizin oluştuğunu görüyoruz.

Burada da Publish diyip servisimizi Local IIS'e açmış bulunuyoruz.



















Gördüğünüz gibi artık Web Service'imize "http://localhost/blogHosgeldinService/" adresinden erişebiliriz. Tabiki sonuna servisi ekleyerek. Yani "http://localhost/blogHosgeldinService/Service1.aspx"'i bir browser'da açar iseniz servisin çalıştığını göreceksiniz.

Artık servisi test edecek projeyi geliştirmeye başlayabiliriz. Bunun için Solution'ımıza yeni bir Web Project ekliyorum. İsmide blogServConsumer olsun.

Tüketici (Consumer) projemize bir adet Label, iki Textbox ve Button koyuyorum. Button'un click olayında Web Service'i de ki metodu çağırıp girdiğimiz değerleri Label'da göstereceğim.

Sıra Web Service'i projemize eklemeye geldi. Bunun için References kısmına sağ tıklıyorum. Gördüğünüz gibi karşımıza Add Reference, Add Web Reference, Add Service Reference isimli üç adet referans ekleme seçeneği çıktı. Peki neden üç farklı yol var ? "Neden ?" sorusu bir yazılımcı için olmazsa olmaz fakat bu sorunun cevabını başka bir makalede uzun uzun anlatmam gerekecek.

Bunu şimdilik geçip Add Service Reference diyorum.



















Karşımıza referans ekleme arayüzü geliyor. Burada referans eklemenin çeşitli yolları var. Örneğin sağ üstte bulunan Discover'a tıklayarak bu Solution içinde eklenebilecek servisleri listeleyip ekleyebilirsiniz. Veya Address kısmına direkt servisinizin URL'ini yazmak. Başka bir yol sol altta bulunan Advanced... seçeneğini seçerek
























Karşımıza gelen Service Reference Settings arayüzünden Compatibility kısmında bulunan ve açıklamasına yine girmeyeceğim Add Web Reference...'ı kullanmaktır.


































Karşımıza gelen arayüzden Web services in this solution'ı seçip bu solution içinde ki Web Service'leri listeliyoruz. Buradan da servisimizi seçtikten sonra çağırırken kullanmak üzere ismini verip (Web reference name : "blogServis") Add Reference diyip işlemimizi bitiriyoruz. Evet nihayet servisi ekleyebildik :)

Bir kaç saniyelik işlemden sonra servisin referenslara eklendiğini göreceksiniz. Gelin şimdide servisimizi kullanalım. Eklediğimiz Button'a çift tıklayıp kod tarafına geçiyorum. Servisi her event içinde çağırmamak için Page_Load metodunun üstüne servisimizin yeni bir Instance'ını alıyorum.

blogServis.Service1 blogServis = new blogServConsumer.blogServis.Service1();

Sırada button'a tıklanında metodu çağırmak kaldı. Click eventinde blogServis ismiyle oluşturduğum servisimizi çağırıp gerekli işlemleri gerçekleştiriyorum.

LabelSonuc.Text = blogServis.Hosgeldin(TextBoxAd.Text, TextBoxSoyad.Text);























Bakalım çalışıyor mu? Default.aspx sayfamı çağırıp gerekli bilgileri giriyorum ve "Göster" diyorum...













Web Service kullanarak ilk uygulamamızı geliştirdik. Bundan sonra ki dönem de Web Service ipuçlarını (Güvenlik, Performans, Asenkron Çözümler, Gerçek bir Web Service için gerekli ayarlar...) ele alacağım.

Tekrar görüşmek üzere.

Download : blogWebService

6 Şubat 2010 Cumartesi

ASP.NET - Xml WebServices (1 - Giriş)

XML WebServices

Merhabalar,

Bu yazıda web ortamında çok işimize yarayan Xml WebService'lerini inceleyeceğiz. Bu incelemeyi yaparken WebService'lerine neden ihtiyaç duyarız? Ne zaman kullanılmalı? gibi sorulara da yanıt arayıp bu işin mantığını anlamaya çalışacağız.

Şimdi düşünün ki bir firma için yazılım geliştiriyorsunuz ve geliştirdiğiniz yazılımda bu firmanın çok gizlilikle elde ettiği veya sakladığı verilerin bazılarını alıp kullanmanız gerekiyor. Bu verilere ulaşmanın bazı yolları var. Mesela bu verileri bir kağıda basıp size gönderebilirler. Ama bu çok ilkel ve bazen de işinize yaramaz bir çözüm olabilir. Çünkü verileri incelemek yerine veri yapısına göre bir algoritma hazırlıyor olabilirsiniz. Sonuçta firmanın kullanacağı bir yazılım yazıyorsunuz. Bu yazılımın veri kısmı firmanın kullandığı veri yapısına bağımlı. Neyse ikinci seçenek olarak firma kendi Database'ini size açabilir. Size bir kullanıcı oluşturur siz de bu sayede girip istediğiniz veriye ulaşırsınız. Fakat bu noktada sizi kendi Database'lerine almaları güvenli değil. Bunu istemeyebilirler.

Veya başka bir örnek ise; Yine bir firma için yazılım geliştiriyorsunuz. Geliştirdiğiniz yazılımda o firmanın kendi yazılımcılarının oluşturduğu Class'ları ve metotları kullanmanız gerekiyor. Peki nasıl ulaşacaksınız o class'lara ve  metotlara? Çözüm ne mi? Tabi ki Xml WebServices.

Not: Microsoft'un şimdilerde patlatmaya hazırlandığı WCF (Windows Communication Foundation) Xml WebService'lerine bir alternatif (hatta abisi) durumunda. Belki ileride WebService'ler yerine WCF kullanacağız.

Xml WebServisleri bize veriye ulaşma ve yönetme kısmında güvenli ve rahat bir ortam sunuyor. Xml WebService'i İnternet'e açılmış veriler topluluğu olarak da düşünebiliriz.

Peki Xml (Extensible Markup Language) diyip duruyorumda Xml bunun neresinde? Xml adı üstünde bir Markup Language (Etiketleme/Biçimlendirme Dili). WebService'in Xml tabanlı olması, onu platform bağımsız bir hale getiriyor. Yani Xml yapısında ki bir veriyi biz her tür işletim sistemi ve program ile alıp kullanabiliriz. Xml'in Text tabanlı olması da güvenliği bir kat daha arttırıyor. (Xml text tabanlı olduğundan Firewall'a takılmaz)
WebService'lerinin kullandığı diğer protokoller ise HTTP (Hypertext Transfer Protocol) ve SOAP (Simple Object Access Protocol - Basit Nesne Erişim Protokolü)
HTTP ile Web ortamını temsil ederken. SOAP ile gönderilen verilerin iç bilgilerini sakladığı bir yapıdan bahseder.

Bu yazıda işin mantığını anlatmaya çalıştım. Bir sonra ki yazımda uygulamalı örneğini ve bazı ipuçları ele alacağım.

Devam edecek...

8 Ocak 2010 Cuma

Mobile - Windows Mobile 6.1 "NETCFv35.Messages.EN.wm.cab Hatası"

"An error message is available for this exception but cannot be displayed because these messages are optional and are not currently installed on this device. Please install ‘NETCFv35.Messages.EN.wm.cab’ for Windows Mobile 5.0 and above or  ‘NETCFv35.Messages.EN.cab’ for other platforms. Restart the application to see the message."

Merhabalar,

Geçenlerde başıma gelen ve çok can sıkıcı bir olayı ve çözümünü paylaşmak istedim. Windows Mobile 6.1 için bir uygulama geliştiriyordum. Bu uygulama bir WebService'i kullanarak bir takım verileri göstermek üzere tasarlanmıştı. Herşey güzel giderken tam verileri alma sırasında

"Bu özel durum için bir hata iletisi var, ancak bu iletiler isteğe bağlı olduğundan ve şu anda bu aygıta yüklü olmadığından görüntülenemiyor. Lütfen Windows Mobile 5.0 veya üzeri için ‘NETCFv35.Messages.EN.wm.cab’ dosyasını, diğer platformlar için ‘NETCFv35.Messages.EN.cab’ dosyasını yükleyin. İletiyi görmek için uygulamayı yeniden başlatın."

gibi bir hata ile karşılaştım. Hatada da dediği gibi "NETCFv35.Messages.EN.wm.cab" dosyasını Mobil cihaza yüklemem gerekiyordu. Bilgisayarda yaptığım aramada cab dosyasını "C:\Program Files\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\Diagnostics" klasörü içinde buldum. Dosyayı Mobil cihaza kopyalayıp sorunsuz bir şekilde kurdum. Acaba çalışırmı derken yine aynı sorun karşıma çıktı.

Biraz araştırdıktan sonra NETCFv35.Messages.EN.wm.cab dosyasını açarak içinde ki SYCCFA~1.001
dosyasını System.SR.dll olarak değiştirdim ve bu dll'i geliştirdiğim projede referans olarak ekledim.

Benim için sorunsuz çalıştı. Umarım yardımcı olmuştur...

Not: Eğer PocketPC'lerde WebService'e bağlantıda sorun yaşarsanız. WebService'inizin yolunu http://localhost/.. gibi değilde localhost yada her ne var ise IP'nizle ( http://192.168.1.1 gibi) değiştirmelisiniz.
Çünkü cihazın kendi IP'si olduğu için localhost onun için birşey ifade etmez. Bizim gidip IP adresini ona göstermemiz lazım.

Basit olarak tekrar üstünden geçeyim:

1 - C:\Program Files\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\Diagnostics
e giderek NETCFv35.Messages.EN.wm.cab dosyasını mobil cihazımıza atıp yüklüyoruz.

2 - NETCFv35.Messages.EN.wm.cab dosyasını açarak (Winzip ile mesela) içinden SYCCFA~1.001 dosyasını bir yere atıp adını System.SR.dll olarak değiştiriyoruz.

3 - System.SR.dll dosyasını kullandığımız projeye referans olarak ekliyoruz.

27 Kasım 2009 Cuma

GDI+ - Basit çizim (HatchBrush)


Tekrar merhaba. Uzun süredir zaman bulup birşeyler yazamıyordum. Bulmuşken fazla çene yapmayıp icraata geçeyim hemen.
Bugün kronolojik ilerleme yönteminden vaz geçip, karışık entry girme yöntemine geçişimizi kutluyoruz. Evet artık bir oradan bir buradan konu seçip makaleler gireceğim. Belli bir düzende ilerlemekten sıkıldım.

Gelin şimdi GDI+ ile (Graphic Design Interface) bir ASP sayfasında uygulama geliştirelim.


Hatta size şuan benimde kullandığım arka planı nasıl GDI+ ile çizebileceğimize bakalım.

Hemen Web sekmesinde yeni bir ASP.NET Web Application açıyorum. Şimdi resmi nerede gösterelim? ASP.Net i kullanalım ve Asp:Image kontrol'ünü seçelim. ToolBox'tan bir asp:image kontrolü ekliyorum. ID'sinede "resim" diyorum. Peki resmi nerede çizelim? Web taraflı bir GDI+ örneği olacağı için (yani resim ram'de saklanacak, yer kaplamayacak) resmi çizmek için boş bir web sayfasını kullanabiliriz. Bunun için Projeye picture isimli yeni bir web form'u ekliyorum. Ve burada sadece resmi göstereceğim için "Page" kısmı hariç geri kalan tüm etiketleri siliyorum.




F7 ile kod tarafına geçiyorum

Şimdi GDI+ ile çizim yapabilmemiz için Drawing koleksiyonunu eklememiz gerekir. Onun içinde yukarıya using System.Drawing i ekliyorum. Çizimi birşeyin üstünde yapmam gerekir öyle değilmi? Boşluğa birşey çizebilirmisiniz? İlla önünüzde bir kagıt bir madde olması gerekir. Bizim burada kullandığımız ise Bitmap nesnesi. Bitmap nesnemi tanımlıyorum;

Bitmap bmp = new Bitmap(300,200);

Benden genişlik ve uzunluk olarak parametre istiyor. Çizeceksinde nereye diyor kendileri.

Ok şimdi Graphics nesnemi oluşturmam gerekli çizimi yapacak olan o çünkü.

Graphics g = Graphics.FromImage(bmp); 

Dikkat ederseniz Griphics nesnemizi new'lemedik. Çünkü Graphics nesnesi bizden üzerinde çalışacağı alanı vermemizi ister. Bizde ona FromImage metodu ile Bitmap'imizi (bmp) verdik.

Tamamdır. Şimdi çizimi yapacağız ama ne çizeceğiz? Ne demiştik blog'un background resmini değil mi?
Evet ok ozaman diyelim ki ben bir Dikdörtgen çizeceğim efem. Ve Dikdörtgenim'in tepeden uzaktığı "0", soldan uzaklığı "0" genişliği "300" yüksekliği ise "200" olsun. Aynen şu şekilde diyoruz;

Rectangle r1 = new Rectangle(0, 0, 300, 200);

Bunuda hallettik. Şimdi çizicem ama neyle çizeyim ? Kurşun kalem mi? Yağlı boyamı ? Benim bu uygulamada kullanacağım brush tipi HatchBrush. Ve HatchBrush'ı kullanabilmek için "using System.Drawing.Drawing2D" koleksiyonunu eklememiz gerekir.
HatchBrush'ın kendi içinde çok güzel stilleri var. Bunlardan HorizontalBrick yani YatayTuğla düzenini kullanacağız.

HatchBrush'ımızı oluşturalım;

HatchBrush brush = new HatchBrush(HatchStyle.HorizontalBrick, Color.Gray, Color.Red);

Bizden üç parametre aldı. İlki ne çizmemiz gerektiği, ikinci ve üçüncü ise renklerinin ne olması gerektiği.

Şimdi artık Dikdörtgen'imizi boyama vakti geldi. Bu işlemi Graphics nesnemizle yapacağız demiştik öyle değilmi?

g. diyip FillRectangle metodunu çağırıyoruz. Bu metot bizden iki parametre istiyor. İlki hangi kalemle çizeceğimiz yani brush, ikincisi ise nereye çizeceğimiz yani Rectangle'ımız.

g.FillRectangle(brush, r1);
Gerekli parametreleri girdim.

Şimdi resmi oluşturduk ama resim şuan Ram'de duruyor. Yani hiçbir boyut kazanmadı. Bir yerde görebilmemiz için Bitmap'in save metodunu kullanmamız gerekir.

bmp.Save diyip Save metodunu çağırıyoruz. Save metodunun beş adet Overload'u var. Biz bu resmi bir web sayfasında göstereceğimiz için saklayacağımız kaynağı Response.OutputStream olarak seçiyoruz. İkinci parametre olarakta formatını belirlememizi istiyor. ImageFormat yazıp "ctrl + ." yapıp (elle yukarıya yazmakla aynı işlemi yapar) yukarıya using System.Drawing.Imaging'i ekliyoruz.


bmp.Save(Response.OutputStream, ImageFormat.Jpeg);

Evet kaydettik. Geriye ramde oluşturduğumuz alanı silmek kaldı. Çizmek için kullandığımız Graphics (g) ve
HatchBrush (brush) kaldırıyoruz, Dispose ediyoruz.


g.Dispose();
brush.Dispose();


Tamamdır. Default sayfamıza View in Browser diyip gözlemleyelim bakalım neler yapmışız?

Evet hiç birşey yok. Neden? hmm ok buldum; Çünkü default sayfamızdaki asp:Image kontol'üne bir kaynak vermedik değilmi? Default sayfama gelip F7 ile kod tarafına geçip sayfanın Load'una gerekli kodları yazıyoruz.

resim.ImageUrl = "picture.aspx";

Tekrar çalıştırıp gözlemliyoruz.



Ok görev tamamdır. Eğer bu resmi arkaplan olarak kullanmak isterseniz Body etiketinin "background-image" özelliğine resmi atamanız yeterlidir.

Tekrar görüşmez üzere şimdilik bu kadar.






KODLAR:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;//Bitmap
using System.Drawing.Drawing2D;//Brush
using System.Drawing.Imaging;//ImageFormat

namespace blogGDIplus
{
    public partial class picture : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Bitmap bmp = new Bitmap(300, 200);
            Graphics g = Graphics.FromImage(bmp);

            Rectangle r1 = new Rectangle(0, 0, 300, 200);
            HatchBrush brush = new HatchBrush(HatchStyle.HorizontalBrick, Color.Gray, Color.White);
            g.FillRectangle(brush, r1);

            bmp.Save(Response.OutputStream, ImageFormat.Jpeg);
            g.Dispose();
            brush.Dispose();
        }
    }
}

7 Kasım 2009 Cumartesi

C# - Windows Application ; KacanButton

C# - Windows Application ; KacanButton


Tekrar merhaba. Bu uygulamamızda çeşitli nesnelerin özelliklerini, if yapısını, eğlenceli olduğunu düşündüğüm
bir uygulamada öğreneceğiz.

Hemen yeni bir Windows Form Application açıyorum, ismine 'blogKacanButton' diyorum.
Şimdi ilk olarak formumuzun border özelliğine bakalım. Bunun için; Form u seçip F4 ile onun özelliklerine gidiyoruz. Buradan FormBorderStyle (Font içinde) özelliğini "none" yapıp gözlemliyoruz. Evet gördüğünüz gibi üstteki title ve kapatma, küçültme düğmeleri kayboldu. Form'un özelliklerinde Layout kısmında StartPosition ise; Bize Form'un açıldığında nerede açılmasını istediğimizi verir. Bunada "CenterScreen" diyorum.

Ok. Uygulamamızın başlığı olarak bir Label düşünüyorum. Hemen Toolbox'tan yeni bir Label alıp ekliyorum. Label özelliklerinde AutoSize'ını "false" ve Dock özelliğini "top" ayarlıyorum. Dock özelliği, o nesnenin formun neresinde olacağını belirler. Normalde biz Label'ı çekip genişletip, yerini kendimizde verebilirdik. Dock bize bu kolaylığı sağlıyor.
Label'ımızın dock'unu top yaptıktan sonra rengi ve fontuyla oynayıp güzel bir başlık haline getiriyorum.

Form'unda BackColor özelliğini "Gray" yapıyorum. Button eklemek kaldı, hemen bir Button ekliyorum.
Button'un özelliklerinden; Text'ini "Tıkla",FlatStyle'ını "Flat" ve BackColor'ını Turuncu, FlatAppearance sekmesinden BorderSize'ını "2" olarak ayarlıyorum.



Design tamamdır. Burası kolay zaten.Şimdi geldik en zevkli kısma.
Kodlar:
Şimdi biraz düşünelim. Kod yazmaya nereden başlamalı, ihtiyaçlar neler? Karışımıza çıkacak problemler neler olabilir? Biz uygulama açılınca Button'un sürekli hareket halinde olmasını ve tıklanmasının zor olmasını istiyoruz öyle değilmi? Ozaman kod'u Form'un Load eventine yazarız ki form açıldığında çalışmaya başlasın. Fakat ozaman da sadece form açıldığında çalışır ve tekrarlanmaz öyle değilmi? Nereye yazmalı? Bizim tekrarlanan nesnemiz neydi, Timer. Ok ozaman Timer'ın "Tick" eventine yazmamız gerekir. Böylece her 1sn'de bir Timer tick olacak ve içindeki kodları çalıştıracak. Yani Button'un yerini değiştirecektir. Hemen bir Timer ekleyip enable'ını True yapıyorumki form açılır açılmaz başlasın saymaya. Interval'i de 1000 olsun (1sn). Timer'a çift tıklayıp kod tarafına geçiyorum.

Temel olarak bir nesnenin yerini nasıl değiştiririz sorusu var. Bir nesnenin Left ve Top özelliklerini değiştirerek yerini değiştirebiliriz. Bizimde bu uygulamada yapacağımız şey bu. Ama bu Left ve Top değerinin sürekli değişmesi gerekiyor öyle değilmi? O zaman Random nesnesini kullanacağız. Random'dan kendimize Left ve Top değerleri alıp bunu Button'umuza vereceğiz. Peki bu Button'un Left ve Top özelliğinin değişme sıklığı nasıl olacak? Yani düşünün bir kere değişip öylece kaldığını? Hiç işimize yaramaz öyle değilmi. Örnek mesela her 1sn'de bir yer değiştirse? Peki böyle tekrarlanan şeyler için ne kullanıyorduk? Daha öncede söylediğimiz gibi cevap "Timer". Evet yavaştan kafamızda oluşmaya başladı nasıl birşey olacağı. Buda bir programcı için iyi birşeydir. Önce zihninde oluşturur daha sonra dener ve karşılaştığın problemleri gidermeye çalışırsın.

Timer'ın enable'ını true yapıyorumki form açılır açılmaz başlasın saymaya. Interval'i de 1000 olsun (1sn)

Random nesnemi üretiyorum. 

    Random rnd = new Random();

Şimdi kordinatları üretme zamanı. Form'un genişliği 300px olduğunu düşünün. Ben eğer Button'un Left ine (yani soldan olan uzaklığına) 300 verirsem Button nerede olur? Dışarıda kalır öyle değilmi? Çünkü Button'unda bir genişliği var. Oda soldan başlar. Genişliğinin 15px olduğunu varsayarsak, benim maksimum Left' i 300 - 15 vermem gerekirki Button görünebilsin. Yani Button'un sağ köşesine göre hesap yapmam lazım.
Tamamdır Left parametremizi x, top parametremizi de y diye int bir değişkene atıyorum.

int x = rnd.Next(this.Width - button1.Width);
int y = rnd.Next(this.Height - (label1.Height + button1.Height));

ve Random nesnesi ile rastgele ürettiğim aralıkları Button'umuzun left ve top'ına veriyorum:

button1.Left = x;
button1.Top = y;

Dipnot: Uygulamanın kapatma tuşunu iptal ettiyseniz. Yani FormBorderStyle'ı "none" seçtiyseniz; Uygulamayı kapatmak için VS2008'e gelip üstteki sekmelerden Stop button'una basmanız yeterlidir.

Çalıştırıp gözlemliyorum. Hmm Label'ın içine giriyor Button öyle değilmi? Bir problem var. Demek ki "y" parametrem doğru çalışmıyor.
Biraz düşünelim şimdi. "y" neden üst'e girdi? Hmm ok başlangıç olarak "0" değerini alıyorda ondan. Random'un Next() metodunun 2 "Overload"u (2 farklı şekilde yazım yöntemi) vardır.
İlki; Next(sayi) girersiniz ve size 0 dan sayi'ya kadar rastgele rakamlar üretir.
İkinci yöntem ise; Başlangıç sayısı verebilirsiniz Ör) Next(0,10) bu ise size 0 ile 10 arası değerler getirir.

Dipnot: 0 dahildir ama 10 dahil değildir. yani 0 <= x < 10 gibi düşünebilirsiniz.

Ozaman hemen y parametremi modifiye ediyorum. Başlangıç değeri Label1'in yüksekliği (height) kadar ayarlıyorum.

int y = rnd.Next(label1.Height, this.Height - (label1.Height + button1.Height));

Çalıştırıp gözlemliyorum. Güzel fakat nasıl kapatılacak bu uygulama? Şöyle olsun mu: iki olasılık olsun,
1 - ESC tuşuna basıldığında uygulama kapansın
2 - Button'a tıklandığında mesaj versin ve uygulama kapansın.

- 2'yi hemen yapalım; Button'a çift tıklayıp kapatan kodu yazıyorum:

private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Tebrikler! Kazandın");
            this.Close();//button'a tıklarsa kapatsın
        }

- 1'e gelelim. Şimdi ESC tuşunu bilgisayara tanıtmamız lazım. Yani algılaması gerekir. Bunun için form'un özelliklerine F4 ile gidiyoruz. Oradan yukarıda sarı bir şimşek işareti var. Bu "Event" anlamına gelir. Ona basıp eventlerine geçiyoruz form'un. Key sekmesinde "KeyDown", "KeyPress", "KeyUp" gibi eventler var gördüğünüz gibi.

KeyUp : Bir tuşa basıp çektiğiniz anca çalışan eventtir.
KeyDown : ESC, Enter, Delete, Insert gibi tuşları algılamada kullanılan eventtir.
KeyPress : Buda "a,b" gibi klavye tuşlarını algılamada kullanılır.

Biz KeyDown'ı kullanacağız. Bunun için KeyDown'a çift tıklayarak kod tarafına geçiyoruz.



private void Form1_KeyDown(object sender, KeyEventArgs e)

Şimdi gördüğünüz gibi biz genellikle "EventArgs e" yi görürdük eventlerde öyle değilmi. Buradaki "KeyEventArgs e"; "e." yaparak yeni özellikleri, parametreleri kullanabilirsin demektir. Yani eğer eventte "EventArgs e" den farklı birşey yazıyorsa, her zaman "e." yaparak onun özelliklerini kullanabiliriz.

Bizde aynen "e." yaparak bakıyoruz özelliklerine. Gördüğünüz gibi bir sürü özellik geldi. Biz burda KeyCode'u kullanacağız. Gelelim kod'u yazmaya. Şimdi ne dedik? 'ESC'ye basınca' dedik öyle değilmi? Bu bir koşul cümlesi dikkatinizi çekerim. Koşulları kontrol ettirmek için çoğu program dilinde "if" yapısı kullanılır.

if de parantez içi Boolean tiptir. Yani geriye ya True yada False döndürür. Ör) if(sayi == 2) Bu örnekte sayi'nın 2 olup olmadığı kontrol ediliyor. Eğer sayı 2 ise True değil ise False geri dönüyor.

Dipnot : C#'ta bir eşitlik kontrol ettirmek isteniyorsa; Çift eşit (==) kullanılır.

Kendi örneğimize gelirsek.

if (e.KeyCode == Keys.Escape)
            {
                this.Close();
            }

Çalıştırıp gözlemleyelim. Çalışmıyor, sebebi herhangi bir key'i algılatmak istediğinizde, eğer form'un özelliklerinden "KeyPreview"i True yapmazsanız, bu kodların hiç birini algılatamazsınız. Ozaman True yapalım değilmi.

Tamamdır hallettik. Yalnız bir detay var, ki programcılık detay işidir. Space'e basınca Button'a basılmış olarak algılıyor ve kapatıyor. Bunu engellemek için bir if daha lazım. Hemen ekleyelim. Hatta MessageBox'ta mesaj yazalım Space'e basılınca:

else if (e.KeyCode == Keys.Space)
            {
                MessageBox.Show("Yemezler müdür!");
            }

Bir MessageBox'ta üstteki ne ekliyim daha güzel olsun. Çalıştırıp gözlemliyorum. Hmm bu biraz kolay olmuş değilmi? :) Zorlaştıralım. Timer'ın interval'ini 200 yaptım.

Güzel oldu gibi. Şimdilik benden bu kadar, tekrar görüşmek üzere.


KODLAR:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace blogKacanButton
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Random rnd = new Random();//nesnemi ürettim
            int x = rnd.Next(this.Width - button1.Width);//genişlik değerimi ürettim
            int y = rnd.Next(label1.Height, this.Height - (label1.Height + button1.Height));//yükseklik değerimi ürettim
            button1.Left = x;//genişliği button'a atadım
            button1.Top = y;//yüksekliği button'a atadım
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Tebrikler! Kazandın");
            this.Close();//button'a tıklarsa kapatsın
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)//ESC e basılmış ise
            {
                MessageBox.Show("Görüşürüz Müdür");
                this.Close();//formu kapat
            }
            else if (e.KeyCode == Keys.Space)
            {
                MessageBox.Show("Yemezler müdür!");
            }
        }
    }
}

Link : KacanButton

22 Ekim 2009 Perşembe

C# - Yer değiştiren form ; Timer ve Random Kullanımı


Tekrar merhaba. Bugün güzel ve sık kullanılan kontrollerden biri olan Timer'ı ve daha sık kullanılan class'lardan biri olan Random'u inceleyeceğiz.
Timer'ın pek fazla özelliği yoktur. Kullanım amacı bir şeyi belirli aralıklarla tekrar yapmaktır. Örnek olarak bu Event tetikleme olabilir.
Timer'ın en çok kullanılan yönü "tick event"dir. Tick Event'i verilmiş bir zaman aralığında (ki bunuda Interval ile yapıyoruz) Event'inin içinde bulunan kodları çalıştırır.

Örnek uygulama olarak gelin belirli bir zaman aralığında, mesela her 3sn de bir yer değiştiren bir form uygulaması yapalım. Hatta form'un bir saat göstergesi de olsun.

Ok hemen yeni bir Windows Form uygulaması açıp ismine timerSaat diyorum. Kolay olandan başlayalım önce saati göstereceğimiz bir yer olmalı öyle değilmi? Hemen bir Label koyuyoruz forma. Label'ın AutoSize'ını kapatıp (false), boyutları ve Font'uyla oynuyorum (süsliyim biraz). Label'ın ve Form'un BackColor özelliğini Siyah seçtim. Gelin birde Form'un Border'ını kapatalım (yani başlığı olmasın). Bunu yapmak için Form a tıklayıp F4 ile özelliklerine gidip buradan FormBorderStyle'ı "None" yapıyorum. Evet hep başlık olucak değil ya.
Güzel olduda bu seferde kapatmada sıkıntı vericek böyle olursa. Ozaman bir Button koyar bu işide hallederiz. Button'un da Text'ine "Kapat" dedik mi dadından yenmez.

Süslemeye devam. Form'a bir Label daha ekleyelim, form'un yer değiştirme olayı ile ilgili bilgi verici bir kaç kelam ederiz.
Fark etmişsinizdir, eklediğim label siyah renkte yazıldığı için görülemiyor. Rengini değiştirmek için özelliklerine gelip ForeColor (yani text rengi) özelliğini (güzel bir renktir severim) "Maroon" yapalım. Font'unu da "Verdana" ve boyutunu 14 yaptım.


(tabii ben bu screenshot'ı aldığım da faz geçip font'u verdana, boyutu 12 yapmıştım)

label2'nin textini açıklayıcı bilgileri yazalım; "Bu Form 3sn aralıklarla yer değiştirecektir! Duyurulur". Gördüğünüz gibi AutoSize'ını false yapmadığımız için sağa doğru ilerledi ve formdan dışarı çıktı. İşte AutoSize ı nasıl kullanmak gerektiğinin güzel bir örneği. Hemen AutoSize ı false yapıp, güzelce yerleştiriyoruz form'a.

Saat'in de (label1) rengi biraz mat mı oldu ne? Sanki oldu gibi. Red yapayım onu ben. Siz istediğiniz gibi takılın tabiki. Hatta baştan vereyim renkleri iyisimi.

Eveet herşey tamamda Timer'lar nerde dimi? Ok ToolBox'a gelip Components sekmesinden (aşağılara doğru) Timer'ı bulup form'umuza ekliyoruz. Gördüğünüz gibi Timer'ın form üzerinde bir görünümü yok. Sadece altta çalışan bir özelliktir. Alttan timer1'i seçip F4 ile özelliklerine bakalım biraz. Burada Timer'ın iki önemli özelliği var. Biri "Enable" diğeri ise "Interval" özelliğidir.

1 - Enable özelliği; Uygulamanın başlar başlamaz (yani çalıştığında) timer'ın aktif hale gelmesini ayarlar. Yani Enable'ı True yaparsak Form çalışır çalışmaz timer saymaya başlar. False yapılacak durumlarda; Timer'ın sizin istediğiniz anda başlamasını istiyorsanız Enable'ını False seçersiniz. Ör) Saat 20:00'da çalışsın gibi..

2 - Interval özelliği; Timer'ın çalışma sıklığını belirler. Yani Timer "tick event"ini hangi sıklıkla (saniye,milisaniye) gerçekleştirsin. Örnek olarak Interval'i 1000 olan bir timer; her 1sn de bir çalışır. (1000ms = 1sn)

Not : Timer'ın ilk "tick event" i sadece ilk çalıştığında olmak üzere Interval süresi kadar gecikir.

Ok amacımızı unutmayalım. Hem saati göstereceğiz, hem de form kendini 3sn de bir yer değiştirticek. Hmm düşünme zamanı; Sanırım buldum bize iki timer lazım. Bir tanesi saat için; Her bir saniye de bir çalışıp ekrana o anki saati yazdıracak. Ve diğeri; form'un üç saniyede bir yer değiştirmesi için.
Tamamdır ilk eklediğimiz timer1 in Interval'ini 1000, Enable'ını true, şimdi ekleyeceğimiz timer2'ın Interval'ini 3000 ve Enable'ını True yapıyoruz.



Hadi artık kod yazmaya başlayalım.Kapat Button'unu aradan çıkaralım. Button'a çift tıklayıp kodunu yazıyoruz:

private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

this : O an üzerinde olduğun Class'ı temsil eder. İleri de Class mantığına değineceğiz. Bizim için "this" = "form" şuan da. this.Close() ; Bu form'u kapat anlamına gelir. Button'a tıklandığında form kapanacak.

Saat'i yazmak için tabiki timer1'e çift tıklayıp; "timer1"in tick event'ine geliyoruz. Ve oraya şu kodları yazıyoruz. (daha önce göstermiştim; bkz: Basit Saat Uygulaması)

private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToLongTimeString();
        }

Şimdi çalıştırıp test edelim. İlk çalıştığında "label1" yazıyor değilmi saatin yerinde :) Evet bunun sebebi; Yukarda bahsettiğim Timer'ın Interval değeri kadar gecikmesidir. Düzeltmek için Form'a çift tıklayıp Form'un Load'u na timer1 de bulunan kodları yazıyoruz. Böylelikle form yüklendiğinde de (yani ilk açıldığında) saat'i göstersin.

Tamamdır. Sıra geldi yer değiştirmeye; Bunun için timer2'ye çift tıklayıp tick event'ine gidiyoruz.Şimdi her 3sn de bir ne olmasını bekliyorduk? Yer değiştirmesini değilmi. Peki bunu nasıl yapar sizce? Şöyle söyliyeyim. Ekranda bulunan herşeyin bir Kordinat'ı vardır aslında bilgisayarda. Neyin nerede olduğunu sürekli saklar ve günceller. İşte biz bunu değiştirerek istediği yerlere gitmesini (tabi belirli sınırlar dahilinde) sağlayacağız. Ve tabi bu değer sürekli değişmeli. Yani sabit kalırsa hep aynı yerinde kalmaz mı? Bu tür durumlar için C#'ta Random class'ını kullanırız. Yalnız Random bir class olduğundan yeni bir kopyası üretilmeden özellikleri kullanılamaz.

Şimdi ilk başta bir Random kullanılmak isteniyorsa kopyalanmalıdır demiştik. Aynen şunları yazıyorum: Random rastgele = new Random();
rastgele nesnemi " . " ile çağırarak özelliklerini artık kullanabilirim.
VS size zaten yardımcı olacaktır yazarken (IntelliSense).


Şimdi bir x sayısı tanımlayalım ve bu x sayısını rastgele sayılar üretsin. Ve timer2 nin içinde olsun ki her 3sn bir bu rastgele üretme işlemi gerçekleşsin.

int x = rastgele.Next(Screen.PrimaryScreen.WorkingArea.Width - this.Width);

random üretmek için kopyaladığımız rastgele yi çağırır ve onun "Next" özelliğini kullanırız. Next özelliği; ( ) Parantezleri arasına aldığı değer aralığında rastgele pozitif sayılar üretir. Ör) Next(50) mesela, 1,5,49,30 gibi sayılar üretebilir. Fakat Next tek başına çalışmaz. Mutlaka onun çağırdığı bir kopyalanmış Random nesnesi olmalı. Bizim nesnemiz  burada "rastgele".

Screen.PrimaryScreen.WorkingArea; ise o an ekranda çalışılan alanı tanımlar. Eğer biz ekranın genişliğinden (width) kendi form'umuzun genişliğini çıkarırsak geriye bizim form'umuzun ekranın dışına çıkmadan rahatça sağ sol yapabileceği bir alan oluşur. Bunuda random lar ve form'un left ine verirsek iş tamamdır.

Peki nasıl atayacağız bu değeri? "this.left" ve "this.top" bunlar bize form'u (yani this'i) yer değiştirmemizi sağlayacak özellikleridir.

Örneğin: this.left = 10; yapın ve çalıştırıp gözlemleyin.
veya
       this.top = 200; yapıp gözlemleyin. Daha iyi anlayacaksınızdır.
Ama ben bu top ve left özelliklerini sürekli değişik değer gelmesini istiyordum öyle değilmi? Çünkü her timer2 "tick" olduğunda (yani 3sn de bir) yeni bir this ve top değerinin form'un yerini değiştirmesini istiyorum


this.Left = x;

Aynı şekilde yükseklik (y ekseni) için de yapıyorum.

int y = rastgele.Next(Screen.PrimaryScreen.WorkingArea.Height - this.Height);

Önce bir rastgele y sayısı üretim bunu form'un yukarıdan olan uzaklığı olarak atıyorum.

this.Top = y;

Yalnız burada Width değil Height kullanıyoruz (yükseklik ayarı için) unutmayın.

Çalıştırıp gözlemliyoruz. Unutmayın ilk tick interval süresinden sonra çalışır (yani 3sn sonra tetiklenir).

Şimdilik bukadar. Tekrar görüşmek üzere...

KODLAR:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace blogTimerSaat
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToLongTimeString();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToLongTimeString();
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            Random rastgele = new Random();
            int x = rastgele.Next(Screen.PrimaryScreen.WorkingArea.Width - this.Width);
            this.Left = x;
            int y = rastgele.Next(Screen.PrimaryScreen.WorkingArea.Height - this.Height);
            this.Top = y;
        }
    }
}

Link : blogTimerSaat

15 Ekim 2009 Perşembe

C# - Label, TextBox, Button ; Temel kontroller


Tekrar merhaba. "Bir C# uygulamasının olmazsa olmaz kontrolleri hangisidir?" sorusunun cevabına bakacağız bu bölümde. Soruyu hemen cevaplamasam mı acaba? heycan olsun biraz dimi :P Neyse fazla kızdırmadan söyleyeyim; Cevap; (tabiki başlıktan kopya çektim) Label, TextBox ve Button'dur arkadaşlar.

Peki "Kontrol" nedir? Kontroller yapacağımız uygulamanın çeşitli özelliklerini değiştirip atamamıza yardımcı olan metotlardır diyebiliriz. Yani daha önceden kullanım kolaylığı sağlamak ve aynı şeyleri defalarca yazma külfetinden bizi kurtarmak için, bir kere yapılır daha sonra kullanılır. Metot kavramına daha sonra değineceğiz.



Label : Kaba tabirle; Metin göstermeye yarayan kontrol diyebiliriz.

TextBox : Kullanıcının yazılım ile haberleşmesini sağlar. Ör) Kullanıcı TextBox'a birşeyler yazar, uygulamada bu verileri, bilgileri alıp kullanır.

Button : En basit Event tetikleyici kontrollerden birisidir. Button'a tıkladığımızda o Button'un "Click" event'i çalışır.

Şimdi uygulamamıza geçelim: Amaç şu olsun: TextBox'ımıza birşeyler yazalım ve yazdıklarımızı bir Button'a basıp gösterelim.

Yeni bir Windows Application açıyoruz. İsmini siz verin yine.
ToolBox'ımızın "Common Controls" kısmından Form'umuza bir Label atıyoruz. Label ilk eklendiğinde default olarak bazı özelliklerle gelir. F4'e basıp Label'ımızın özelliklerine bakabilir, değiştirebiliriz.

Bazı Label Özellikleri :

BackColor : Tahmin edebileceğiniz gibi Label'ın arka plan rengini ayarlar.
BorderStyle : Label'ın kenarlarının nasıl olacağını belirler.
Font : Font'unu ayarlamamıza yarar. Boyut,yazı tipi gibi özellikleri barındırır.
Text : Label'da ne yazacağını ayarladığım özelliktir. Şuan mesela 'label1' diye gelmiştir. Çünkü default olarak o Label'ın Name özelliğini alır text'ine.
TextAlign : Label'da yazan yazının nerede duracağına karar verir. Ör) TextAlign = Left gibi
(Name) : Label'ın kod tarafında hangi isimle adlandıralacağını, çağırılacağını belirler. Default olarak Form'a eklediğiniz kaçıncı label ise "label""kaçıncı label" şeklinde gelir. Ör) Biz ikinci bir label eklersek name i 'label2' olacaktır.
AutoSize : Label'ın boyutunu ayarlamak için kullanılır.Bu özellik True olur ise; Label'ı tek boyutta kullanırız. Yani satır sonunda bir alt satıra geçip devam etmez, sürekli sağa doğru yazmaya devam eder. False yaparsak serbestlik kazanırız. Boyutuna karışma ben vericem gibi birşey diyoruz yani.

Şimdi Label'ımızın Text özelliğine birşeyler girelim. Text'ine "Hoş geldin müdür, yaz bakalım birşeyler sende" diyorum. Tamamdır

Sıra geldi TextBox'a. ToolBox'tan TextBox ekliyorum formuma. Sağ tarafındaki icon'u çekerek uzatıyorum. Güzel görünsün biraz. TextBox, genelde uygulama çalıştığında kullandığımız birşey olduğu için pek fazla özellikleriyle uğraşmayız. Çünkü kullanıcı gelir ve oraya birşeyler yazar sonra bir button'a falan tıklar değilmi? İşte bizim için kritik nokta Button'a tıklanma noktasıdır. Oraya doğru kodları yazar ve uygulamayı geliştiririz. Ok TextBox'la işim bitti.

ToolBox'tan Button'umuzu da ekliyoruz. Gördüğünüz gibi yine çekip kısarak Button'un buyutuyla oynayabiliyoruz. Fakat Button'un üzerinde button1 yazıyor değilmi? Siz hangi button'un üstünde button1 yazdığını gördünüz şimdiye kadar? :) Ne yapıcaz; Hemen F4 ile özelliklerine gidip aynen Label'da olduğu gibi Button'un Text özelliğine "Göster" diyelim.
Göstersin ama nerede? Yeni bir Label daha ekliyoruz ToolBox'tan. Label2 nin Text'i "Burada göstericem" olsun.


DipNot: Aslında hiç bir zaman uygulama geliştirirken bu şekilde ilerlemeyin. Her zaman önce kontrolleri ekleyin daha sonra onlara isim verin, özellik atayın. Çünkü hızınız azalır.
Dipnot2: Hiç sevmediğim birşey Form'un isminin Form1 olarak kalmasıdır. Onuda değiştirmek için. Form'a tıklayıp (yani pencere içinde boş bir yere) F4 yapıp Text'ine "Label TextBox Button" yazıyorum.


Ok herşey hazır. Design tamamlandı. Şimdi geldik bizim işimize. Kod ne olacak? Yada kod ne zaman çalışacak? İsterseniz bunları daha iyi anlamak için. F5 yapıp uygulamamızı bir çalıştıralım.
Şimdi. Bu uygulama nerede tetiklenmeli? Düşünün textbox'a yazıyı yazdınız Button'a bastığınızda yazı alta label'a yazılacak. Ozaman Button burda kritik nokta. Kod'u Button'un Click Event'ine (click olayına) yazmamız gerekir. Bunun için Button'a gelip çift tıklayıp kod tarafına geçiyoruz.

İlk olarak TextBox'ta ne yazdığını aklımızda tutmamız gerekir öyle değilmi? Yoksa nasıl alıp başka bir yere yazıcaz. İşte bu işlem daha öncede anlattığım gibi Değişken tanımlayarak yapılır. Bir değişken ve tip'ini tanımlarsınız daha sonra bu değişkene bir değer (value) verirsiniz. Ve istediğiniz yerde bu değişkeni kullanırsınız.

Değişkenimi tanımlıyorum:

        string textCumle = textBox1.Text;
Yorumu:Tipi "string" olan, ismi "textCumle" olan ve değerini textBox1'in Text'inden alan bir değişkenim oldu. textBox1 de o an ne varsa hepsini aldı textCumle'ye yazdı ve bunu aklında tutuyor şuan.

Yazdılarım Label'a:
       label2.Text = textCumle.ToString();
Yorumu: label2 nin text'ine textCumle'yi ata(atamak yazdırıyor aslında). Burada toString() metodu; ASCII kod'ları bizim bildigimiz karakterlere çevirme işlemini gerçekleştirir. ASCII kod'lara daha sonra değineceğim. Taktir edersiniz ki Bilgisayar bizim yazdığımız harfleri nereden algılasın değilmi. O sadece "1010011" şeklinde görür bunları. CLR sağolsun diyip geçiyorum.


F5 yapıp deniyorum: Ok mişın ekomplişt!
Kolay gelsin, görüşmek üzere...

KODLAR:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace blogTemelKontroller
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string textCumle = textBox1.Text;
            label2.Text = textCumle.ToString();
        }
    }
}

7 Ekim 2009 Çarşamba

C# - Değişkenler

Tekrar merhaba. Kısaca C#'ta Değişken mantığını anlatmaya çalışacağım. Nasıl değişken tanımlanır? Hangi tip değişken kullanılmalıdır? gibi sorulara cevap arayacağız.

Peki en önemli soru; Değişkene neden ihtiyaç duyuyoruz?

Değişkenleri kullanma sebebimizi anlatırken şöyle bir örnek vereyim. Mesela düşünün bir arkadaşınıza (hatta bu kız olsun .p) gideceksiniz ve arkadaşınızın evinde asansör var. Asansöre bindiniz. Peki kaçıncı kata çıkacaksınız? Bunu bilmiyorsunuz değil mi? Ne yaparsınız, hemen arkadaşınızı arayıp sorarsınız veya daha önceden geldi iseniz oraya kaçıncı kata çıkacağınızı biliyor olacaksınız. İşte değişkenler bizim burada aklımızda tutmamız gereken "Kat Numaraları"dır. Eğer o değişkeni önceden bilmiyorsak, onunla ilgili nasıl işlem yapabiliriz ki?

C# dilinde bir değişken şöyle tanımlanır.

tip değişkenadı;


Burada "tip" verinin içerdiği bilgiye en uygun veri tipini, "değişkenadı" ise daha sonra veri atamak ve okumak için kullanacağımız temsili ismi belirtir.

Her bir değişken tanımladığımızda Hafızada o değişkenin kapladığı yer kadar alan kaplarız.

Biz genelde Built-in Type'larla uğraşırız (Introduction konusu dahilinde).  Built-in Type'lar da 2'ye ayrılırlar;

1 - Value Built-in Type : byte,short,int,long,float,double,decimal,bool,char
2 - Referance Built-in Type : object,string













Tablolarda Değişkenlerin kapladıkları yer ve aldıkları değer aralıklarını inceleyelim.
Örneğin hafızada daha sonra kullanmak üzere 2 rakamını saklayacaksam, neden onu "long" tanımlayıp gereksiz yere bir sürü yer kaplatayım? Kodları performanslı yazmak kadar değişkenleride aynı şekilde seçmek gerekir.

ör) int sayi = 2;    Bu satırı çalıştırdığımızda;Hafızada int tipinde ve değeri 2 olan bir yer ayrılır.

Yukarıda bahsettiğim daha sonra kullanmak şöyle oluyor efem;
     int sonuc = 0; -->sonucumuzun başlangıç değeri 0 olsun
     sonuc = sonuc + sayi;
     yada
     sonuc += sayi;  -->diyerek daha önce hafızada sakladığımız "sayi" değişkenini kullandık.Ve sonuç 0 iken 2 oldu.

Şimdilik zamanım bu kadar..
Teşekkürler, görüşmek üzere.
    





5 Ekim 2009 Pazartesi

C# - Windows Application ; Basit Saat Uygulaması

Tekrar merhaba uzun zamandır fırsat bulup birşeyler ekleyemedim. Şimdi fırsat bulmuşken çeneyi bırakıp direk işimize bakalım .)

Basit Saat Uygulaması



Her uygulamada olabileceği gibi bir saat yapalım kendimize..

Ok başlıyoruz. Visual Studio'yu açıp (veya Ctrl + R yapıp çalıştır'a "devenv" de yazabiliriz) hemen Ctrl + N yapıp yeni bir Windows Form Application açıyoruz. İsminede siz karan verin artık
Şimdi saat uygulamasının mantığı şöyle çalışır; Her 1000milisaniye yada 1sn de bir ekrana o an Windows'un saat'ini yazdırırsınız. Böylece sanki saat ilerliyormuş gibi görünür.

Saatimizi bir Label gösterelim. Ozaman hemen Toolbox'tan bir Label'ı alıp form'umuza koyuyoruz.Label ilk eklendiğinde AutoSize'ı "True" gelir.F4'e basıp, o Control'un özellikler kısmına geçip AutoSize'ını "False" yapıyoruz ki boyutuyla oynayabilelim. Şimdi biraz kenarından çekin uzatın büyütün, saatimiz büyük olsun .)
Font kısmından istediğiniz yazı tipini arka plan rengini ayarlayabilirsiniz. Yine Özelliklerde TextAlign özelliği; Label'ın içindeki Text'in nerede duracağını bize söyler. Bunuda TopLeft'ten MiddleCenter yapıyoruz. (Ortada dursun, akıllı olsun)


Ok design kısmını hallettik. Şimdi geldi sıra kod yazmaya. Peki bu kod diğer örneklerdeki gibi Button'la tetiklenmiyor, peki nasıl tetiklenecek? nereye tıklayacağız kod yazmak için?
Ne demiştik başta saatin çalışma mantığına; Her 1 saniyede bir ekrana o an ki saati yazacak değil mi? Ok ozaman böyle bir şeyi hangi Controlle yaparız? Cevap basit Timer. Hemen ToolBox'ın Components sekmesinden en altta Timer'ı form'umuza ekliyoruz. Timer'da Label gibi ilk eklendiğinde belli bazı değerleri kendi otomatikman alır. Bunları görmek için F4'e basabiliriz. Burada en önemli kısım Enable ve Interval kısmıdır. Enable'ın "True" olması Timer'ın uygulama başlayınca hemen başlaması anlamına gelir. Bazı durumlarda False istediğimiz zamanda başlamasını sağlayabiliriz. Interval kısmı ise; Timer'ın hangi süre aralığında Event'ini (yani olayını Tick Event'ini) gerçekleştireceğini ayarlamamıza yarar.
Enable'ı "True" ve Interval'i "1000" (yani 1sn, interval'in birimi milisaniyedir) yapıyoruz.

Peki bir soru daha.Uygulama hangi Event'le (Olay'la) çalışıyor. Yani yazılan kod'un gerçekleşeceği event hangisi? Cevap yine Timer. Timer her 1sn de bir kendi Event'ini gerçekleştirecek.Bu yüzden kod tarafına geçmek için timer'a çift tıklıyoruz. Ok sonunda kod tarafı :)

Eveet şimdi gördüğünüz gibi timer1_tick event'i karşımıza geldi. Bunun mantığı şudur. timer1 her 1sn de bir bizim yazdığımız kodları gerçekleştirecek. Ozaman yazalım

label1.Text = DateTime.Now.ToLongTimeString();

DateTime C#'ta tarih, saat gibi parametrelerle çalışılırken kullanılır. Buradaki "Now" kısmı, şimdiki saati ver anlamına gelir. Ve "ToLongTimeString()" kısmı ise formatını belirler.

Tamam çalıştırıp görelim bakalım ne olmuş? Ctrl + Shift + B yapıp Build ettikten sonra F5'e basıp çalıştırıyoruz.

Evet çalıştı... Ama ilk geldiğinde hala saati yazmamış label'ın adını yazmıştı öyle değil mi? Bunun sebebi basit, Timer Control'ü ilk çalıştığında daima kendi Interval süresi kadar gecikir. Yani ilk tick (ilk çalışma) 1sn sonra gelir. Bu durumu düzeltmek için Form'un ilk açıldığı ana aynı kod'u tekrar yazabiliriz. Bunun için form'umuzun boş bir yerine çift tıklayarak (veya form'un F4 ile özellikler penceresinden Event sekmesine (Yukarıda sağda, şimşek şeklinde bir ikonu var) Load kısmına çift tıklayarak) kod tarafına geçiyoruz ve timer'ın kodlarını orayada yazıyoruz. Böylelikle Uygulama ilk açıldığında hemen saati gösterecektir.



Evet nur topu gibi bir saatimiz oldu... Görüşmek üzere.

KOD:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace blogSaat
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToLongTimeString();
        }

       
    }
}

25 Eylül 2009 Cuma

C# - First Windows Application ; Ekrana "Merhaba Dünya" yazmak.

Gelin şimdi en basit uygulamaların atası olan ekrana "Merhaba Dünya" yazdırmayı C# ile yapalım.



Visual Studio'muzu açıp hemen Ctrl + N yapıp yeni bir proje açıyoruz. İsmide merhabaDunya olabilir mesela.
Şimdi bize lazım olan bir kontrol var, yani bizim yazıyı ekranda görmemiz için tetikliyeceğimiz, yazıyı çağırmak için kullanacağımız kontrol. Evet bir Button işimizi gayet iyi görür. O zaman ToolBox'ımızdan hemen bir button seçip formumuza sürükleyip bırakıyoruz.
Gördüğünüz gibi buttonumuzun ismi biz henüz bir isim vermediğimiz için VS tarafından otomatik "button1" olarak verildi. Gelin isminide değiştirelim. Button1 i seçip F4 tuşuna basıyoruz ve button1'in özellikleri karşımıza geliyor. Burada Font kısmının altından Text özelliğini bulup bunu "Göster" olarak değiştiriyoruz.
Şimdi buttonumuzu kullanarak ekrana gelecek yazıyı cağırmamız gerekiyor. Bu yüzden button1 e çift tıklayarak kod tarafına geçiyoruz.
Buraya kodumuzu yazacağız. Mesela yazı biz messagebox'ta çıksın. O zaman;

MessageBox.Show("Merhaba Dünya");

Bu kodu yazdıktan sonra programı derlememiz yani Built etmemiz gerekir, ki exe dosyası oluşabilsin. Ctrl + B ile derledikten sonra F5 e basıp çalıştırıyoruz. Ve Button'umuza tıkladığımızda aşağıdaki gibi bize geri dönüş vermesi gerekir.




Evet elimden geldiğince basit anlatmaya çalıştım. Bunlar çok temel uygulamalar, yardımcı olabildim ise ne mutlu. C# kod'u aşağıdaki gibidir.



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace blogMerhabaDunya
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Merhaba Dünya");
}
}
}